裸機LCD驅動配置


本節來學習裸機下的LCD 驅動,本節學完后,再來學習Linux下如何使用LCD驅動

 

Linux中的LCD驅動,鏈接如下:

(Linux-LCD層次分析鏈接:http://www.cnblogs.com/lifexy/p/7603327.html)

(Linux-LCD驅動分析鏈接:http://www.cnblogs.com/lifexy/p/7604011.html)

 

 


 

橫屏4.3寸LCD為480*272(行:480個像素點        列:272個行)

1.LCD原理圖 :

Pin1- Pin6:Von/ Voff  電源正/負(由GPG4控制,高電平有效)

Pin2:VM/VDEN 數據使能信號 (0:表示正在跳行,1:表示可以傳輸像素數據) 

Pin8:VLINE/HSYNC 水平同步信號(每掃完一行,即發一次水平同步信號)  

Pin28:VFRAME/VSNC 垂直同步信號(每掃完一屏,即發一次垂直同步信號) 

Pin30:VLCK 時鍾信號 

Pin42,Pin45 LED+,LED-   背光顯示開關 (由0:off   1:no)

VD23~VD19:R信號   

VD15~VD10:G信號 

VD7~VD3    :B信號 

數據是采用16Bpp像素,RGB565格式(因為LCD控制器不支持18Bpp格式) 

例如:粉色RGB值分別為209,92,174(11010001,01011100,10101110)

數據從高位往下取,R和B取5位,G取6位,那么值為0XD2F5。

565RGB引腳連接圖如下:

 

1.2配置引腳

1 GPCUP = 0xffffffff; // 禁止內部上拉 2 GPCCON = 0xaaaaaaaa; // GPIO管腳用於VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND  3 GPDUP = 0xffffffff; // 禁止內部上拉 4 GPDCON = 0xaaaaaaaa; // GPIO管腳用於VD[23:8] 5 GPBCON &= ~(GPB0_MSK); // Power enable pin 6 GPBCON |= GPB0_out; 7 GPBDAT &= ~(1<<0); // Power off

2.設置LCDCON1~5控制寄存器

2.1BSWP和HWSWP介紹

更改存儲格式,對於16bppRGB565(高數據在后)來說,BSWP=0, HWSWP=1

2.2查看2440中LCD控制器初始狀態時序圖:

VSPW: 垂直同步脈沖寬度 pulse widch 

VBPD: 垂直脈沖后沿延遲(用來等待LCD模塊響應的時間)  back delay 

VFPD: 垂直脈沖前沿延遲(用來等待LCD模塊響應的時間)  Front delay

HSPW: 行同步脈沖寬度 pulse widch 

HBPD: 行脈沖后沿延遲(用來等待LCD模塊響應的時間)  back delay 

HFPD: 行脈沖前沿延遲(用來等待LCD模塊響應的時間)  Front delay

 LINEVAL:行數,用來決定垂直尺寸,對於4.3寸時,LINEVAL=272-1

HOZVAL:行數,用來決定水平像素點個數,對於4.3寸時,HOZVAL=480-1

2.3 查看 LCD芯片手冊時序圖,計算周期時間:

從上圖2中得到時鍾周期為10Mhz(100ns)

通過圖1和圖3計算出:

HSPW+1=T7=5 clock

HFPD+1=T8-T11=11 clock 

HBPD+1=T6-T7-T8=17 clock

VSPW+1=T1=1 Line

VFPD+1=T2-T5=2 Line

VBPD+1=T0-T2-T1=4 Line

2.4 配置LCDCON1~5

根據上面就先來定義全局變量:

 #define  HSPW_16bpp      5-1
 #define  HFPD _16bpp     11-1
 #define  HBPD _16bpp     17-1
 #define  VSPW _16bpp     1-1
 #define  VFPD _16bpp     2-1
 #define  VBPD _16bpp     4-1

設置LCDCON1寄存器:

CLKVAL[17:8]:

設置VCLK時鍾, CLKVAL =HCLK/(LCD時鍾*2)-1

本裸板的HCLK=100Mhz,LCD時鍾=10MHZ,所以CLKVAL =4

PNRMODE [6:5]:

設置為TFT模式,PNRMODE =0x3

BPPMODE[4:1]:

設置為16BPP, BPPMODE=0x0C

ENVID [0]:

控制PWREN信號(GPG4)輸出,先配置好再輸出PWREN, ENVID =0

(開啟之前應該設置LCDCON5位[3]允許PWREN信號才有效)

設置LCDCON2寄存器:

VBPD [31:24]:垂直脈沖后沿延時, VBPD=VBPD_16bpp;

LINEVAL[23:14]:垂直行數,決定垂直大小, LINEVAL=272-1;

VFPD[13:6]:垂直脈沖前沿延時, VFPD= VFPD_16bpp;

VSPW[5:0]:垂直同步脈沖寬度, VSPW= VSPW_16bpp;

設置LCDCON3寄存器:

HBPD[25:19]:水平脈沖后沿延時, HBPD= HBPD_16bpp;

HOZVAL[18:8]:水平像素點個數, HBPD= 479;

HFPD[7:0]:水平脈沖前沿延時, HFPD= HFPD_16bpp;

設置LCDCON4寄存器:

HSPW[7:0]:水平同步脈沖寬度, HSPW = HSPW_16bpp;

設置LCDCON5寄存器:

FRM565[11]:設置16bpp輸出格式, FRM565=1(RGB565);

INVVCLK[10]:設置VCLK記性,LCD手冊如下,所以等於0,不設置(下降沿讀取數據)

INVVLINE [9]:HSYNC水平同步信號反轉, 因為LCD手冊和2440手冊不一樣,所以INVVLINE=1;

INVVFRAME[8]:VSYNC垂直同步信號反轉, 因為LCD手冊和2440手冊不一樣,所以INVVFRAME =1;

INVVFRAME[3]:PWREN信號(GPG4)允許位,=0,不設置,等設置了緩存寄存器后才設置

HWSWP [0]:更改存儲格式,這里HWSWP=1,BSWP[1]默認等於0,使我們的LCD像素顯示從低到高排列

代碼如下:

 
         

 LCDCON1 = (4<<8) | (0X3<<5) |  (0x0C <<1) | (0<<0);

 LCDCON2 = ((VBPD_16bpp)<<24) | (271<<14) |  ((VFPD_16bpp)<<6) |((VSPW_16bpp)<<0);

 LCDCON3 = ((HBPD_16bpp)<<19) | (479<<8) | ((HFPD_16bpp));

 LCDCON4 = (HSPW_16bpp);

 LCDCON5 = (1<<11) | (1<<9) | (1<<8) |  (1<<0);

 LCDCON1 &=~(1<<0);          // 關閉PWREN信號輸出

 LCDCON5 &=~(1<<3);          //禁止PWREN信號

 

3.設置LCDSADDR1~3緩沖地址寄存器

設置LCDSADDR1寄存器:

LCDBANK[29:21]:

保存緩沖起始地址A[30:22]   

LCDBASEU[20:0]:

保存緩沖起始地址A[21:1]

設置LCDSADDR2寄存器:

LCDBASEL[20:0]:

保存存緩沖結束地址A[21:1],這里我們 采用4.3寸LCD,所以等於((0x30400000+(480)*(272)*2)>>1)&0x1fffff; 這里*2是代表一個像素占了2字節,若是8bpp模式,則就不需要乘以2  

設置LCDSADDR3寄存器:

OFFSIZE[21:11]:

保存LCD上一行結尾和下一行開頭的地址之間的差(半字數為單位),我們使用的是連續地址,所以不設置,默認為0

PAGEWIDTH [10:0]:

保存LCD一行占的寬度(半字數為單位),我們每個像素點是半字數,所以等於480

代碼如下:               

1 LCDSADDR1 = ((0x30400000>>22)<<21) | ((0x30400000>>1)& 0x1fffff); 2 LCDSADDR2 = ((0x30400000+(480)*(272)*2)>>1)& 0x1fffff; 
3 LCDSADDR3 = (0<<11) | (480*2/2);

 

4.允許並輸出PWREN信號

GPGCON = (GPGCON & (~(3<<8))) | (3<<8);   // GPG4用作LCD_PWREN
GPGUP  = (GPGUP & (~(1<<4))) | (1<<4);    // 禁止內部上拉   
  
LCDCON5 = (LCDCON5 & (~(1<<5))) | (0<<5);  // 設置LCD_PWREN的極性: 正常
LCDCON5 = (LCDCON5 & (~(1<<3))) | (1<<3);     // 允許LCD_PWREN信號輸出

LCDCON1 |= 1;                  //輸出LCD_PWREN信號

 5.驅動LCD顯示白色

 fb_base_addr=0x30400000; //緩存起始地址 LCDCON1 |= 1; // 使能LCD驅動 GPBDAT |= (1<<0); // 開背光 color=0xffffff; //顯示白色顏色 for (y = 0; y < 272; y++) //向緩存地址里存數據 for (x = 0; x < 480; x++) { UINT16 *addr = (UINT16 *)fb_base_addr + (y * 480 + x); //定義指針變量等於緩存地址 red = (color >> 19) & 0x1f; green = (color >> 10) & 0x3f; blue = (color >> 3) & 0x1f; color = (red << 11) | (green << 5) | blue; // 格式5:6:5 *addr = (UINT16) color; //addr表示緩存地址,*addr表示緩存地址里的變量, } LCDCON1 &= 0x3fffe; // 失能LCD驅動 GPBDAT &= ~(1<<0); // 關背光

  

6.TPAL臨時調色板寄存器介紹

    當清屏時,可以使用TPAL寄存器,快速清屏 

    位[24]     TPAL使能位

    位[23:0]  RGB數據位

例如: TPAL=0x1ffffff (使能TPAL寄存器,並設為白色屏)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM