LCD编程_LCD控制器
CLKVAL :
VCLK = HCLK / [(CLKVAL+1) x 2]--------> CLKVAL = HCLK/VCLK/2-1
在這個地方HCLK=100M,那么VLCK等于多少呢?需要打開lcd的芯片手冊
從中可以看出,5<= vclk<=12,正常情況是取9.
當VCLK =9 時,CLKVAL = 4.5 。取一個整數為5。當CLKVAL取為5時,再判斷一下,VCLK是否在5到12之間。
PNRMODE:取11 = TFT LCD panel
BPPMODE :只支持8bpp/16bpp/24bpp
ENVID:LCD video output and the logic enable/disable. 用來使能LCD控制器本身,是否輸出信號。在這個地方暫不設置,后面初始化函數中再進行設置。
將上一篇博客中led.h文件中的time_sequence增加一個數據成員vclk。
因此就有了下面這樣的代碼:
2、垂直方向和水平方向上一些參數的設置
垂直:
水平:
?
?
從上面的圖可以看出:
垂直:
VBPD+1 = tvb? -------->VBPD = tvb - 1
VFPD+1 = tvf? ?--------->VFPD = tvf - 1
VSPW+1 = tvp --------->VSPW = tvp - 1
LINEVAL+1 = line? ----->LINEVAL = line -1
水平:
HBPD+1 = thb?
HBPD+1 = thb?-------->HBPD= thb?- 1
HFPD+1 = thf? ?--------->HFPD = thf - 1
HOZVAL?+1 = line? ----->HOZVAL?= 列 -1
注意在這個地方水平方向的同步脈沖寬度并沒有設置,別急它是在另一個寄存器中設置的。
HSPW+1 = thp? ------>HSPW = thp - 1
因此有了下面的代碼:
?
3、
?BPP24BL :?This bit determines the order of 24 bpp video memory? 。這一位只對24bpp中數據的存放格式有影響,對16bpp/8bpp都是沒有影響的。
如果采用的是24bpp,在這里我們采用第一種方式,即將BPP24BL設置為0
那如果是16bpp,應該設置什么東西,使其指定數據的存放格式呢?
對于16bpp來說,是通過HWSWP來進行指定數據存放格式的,在此將HWSWP取為1
對于8bpp來說,又是通過什么來進行指定呢?
對于8bpp來說,是通過BSWP來進行指定數據存放格式的,在此將BSWP取為1
在這個地方,我們用pixelplace來指定數據存放的格式。
FRM565 :?This bit selects the format of 16 bpp output video data. 用來設置16bpp數據輸出的格式的,采用565格式。
INVVCLK:This bit controls the polarity of the VCLK active edge 。這一位控制著VCLK是上升沿有效還是下降沿有效。
INVVLINE :水平同步信號的極性
INVVFRAME:垂直同步信號的極性
INVVD :數據的極性
INVVDEN :數據使能信號的極性
INVPWREN :電源信號的極性
因此有了下面的程序:
4、framebuffer地址
?
至此,根據傳入的LCD參數設置LCD控制器就已經完成了。
5、
接下來完成s3c2440_lcd_controller_enalbe,首先來看一下,lcd的原理圖。
LED是lCD的背光驅動的電源。LED的背光驅動電路:
當KEYBOARD為高電平時,它可以給背光驅動電路提供電源,此時LCD才會亮起來。
那KEYBOARD又接在哪里呢?搜索一下:
可以看到KEYBOARD接的是GPB0,用于控制背光燈。需要設置為輸出,需要設置GPBCON寄存器
使GPB0輸出為1,需要設置GPBDAT寄存器
LCDCON1中的bit0,用來使能LCD控制器本身,是否輸出信號。需要設置為1
LCDCON5中的PWREN
PWREN:LCD_PWREN output signal enable/disable.
6、
再看一下lcd的原理圖,對于lcd用到的那些引腳也需要進行設置。
比如說VD19這樣的引腳,搜索VD19
從這個圖可以看出,對于VD[23:0],用到了兩組寄存器 GPD和GPC。
對于VM,需要設置GPC4;
對于VLINE,需要設置GPC2
對于LCD_LPCREVB,需要設置GPC7
對于LCD_LPCREV,需要設置GPC6
對于VFRAME,需要設置GPC3
對于VCLK,需要設置GPC1
對于LEND,需要設置GPC0
打開GPDCON和GPCCON寄存器,看一下:
可以看到相鄰的兩位取10即可。
可以看到相鄰的兩位取10即可。
對于LCD_PWREN,需要設置GPG4。
因此就有了下面的代碼:
現將整個代碼貼出來:
1 #define HCLK 100 2 3 void jz2440_lcd_pin_init(void) 4 { 5 /* 初始化引腳 : 背光引腳 */ 6 GPBCON &= ~0x3; 7 GPBCON |= 0x01; 8 9 /* LCD專用引腳 */ 10 GPCCON = 0xaaaaaaaa; 11 GPDCON = 0xaaaaaaaa; 12 13 /* PWREN */ 14 GPGCON |= (3<<8); 15 } 16 17 18 /* 根據傳入的LCD參數設置LCD控制器 */ 19 void s3c2440_lcd_controller_init(p_lcd_params plcdparams) 20 { 21 int pixelplace; 22 unsigned int addr; 23 24 jz2440_lcd_pin_init(); 25 26 /* [17:8]: clkval, vclk = HCLK / [(CLKVAL+1) x 2] 27 * 9 = 100M /[(CLKVAL+1) x 2], clkval = 4.5 = 5 28 * CLKVAL = 100/vclk/2-1 29 * [6:5]: 0b11, tft lcd 30 * [4:1]: bpp mode 31 * [0] : LCD video output and the logic enable/disable 32 */ 33 int clkval = (double)HCLK/plcdparams->time_seq.vclk/2-1+0.5; 34 int bppmode = plcdparams->bpp == 8 ? 0xb :\ 35 plcdparams->bpp == 16 ? 0xc :\ 36 0xd; /* 0xd: 24bpp */ 37 LCDCON1 = (clkval<<8) | (3<<5) | (bppmode<<1) ; 38 39 /* [31:24] : VBPD = tvb - 1 40 * [23:14] : LINEVAL = line - 1 41 * [13:6] : VFPD = tvf - 1 42 * [5:0] : VSPW = tvp - 1 43 */ 44 LCDCON2 = ((plcdparams->time_seq.tvb - 1)<<24) | \ 45 ((plcdparams->yres - 1)<<14) | \ 46 ((plcdparams->time_seq.tvf - 1)<<6) | \ 47 ((plcdparams->time_seq.tvp - 1)<<0); 48 49 /* [25:19] : HBPD = thb - 1 50 * [18:8] : HOZVAL = 列 - 1 51 * [7:0] : HFPD = thf - 1 52 */ 53 LCDCON3 = ((plcdparams->time_seq.thb - 1)<<19) | \ 54 ((plcdparams->xres - 1)<<8) | \ 55 ((plcdparams->time_seq.thf - 1)<<0); 56 57 /* 58 * [7:0] : HSPW = thp - 1 59 */ 60 LCDCON4 = ((plcdparams->time_seq.thp - 1)<<0); 61 62 /* 用來設置引腳極性, 設置16bpp, 設置內存中象素存放的格式 63 * [12] : BPP24BL 64 * [11] : FRM565, 1-565 65 * [10] : INVVCLK, 0 = The video data is fetched at VCLK falling edge 66 * [9] : HSYNC是否反轉 67 * [8] : VSYNC是否反轉 68 * [7] : INVVD, rgb是否反轉 69 * [6] : INVVDEN 70 * [5] : INVPWREN 71 * [4] : INVLEND 72 * [3] : PWREN, LCD_PWREN output signal enable/disable 73 * [2] : ENLEND 74 * [1] : BSWP 75 * [0] : HWSWP 76 */ 77 78 pixelplace = plcdparams->bpp == 24 ? (0<<12) : |\ 79 plcdparams->bpp == 16 ? (1<<0) : |\ 80 (1<<1); /* 8bpp */ 81 LCDCON5 = (plcdparams->pins_pol.vclk<<10) |\ 82 (plcdparams->pins_pol.rgb<<7) |\ 83 (plcdparams->pins_pol.hsync<<9) |\ 84 (plcdparams->pins_pol.vsync<<8) |\ 85 (plcdparams->pins_pol.de<<6) |\ 86 (plcdparams->pins_pol.pwren<<5) |\ 87 (1<<11) | pixelplace; 88 89 /* framebuffer地址 */ 90 /* 91 * [29:21] : LCDBANK, A[30:22] of fb 92 * [20:0] : LCDBASEU, A[21:1] of fb 93 */ 94 addr = plcdparams->fb_base & ~(1<<31); 95 LCDSADDR1 = (addr >> 1); 96 97 /* 98 * [20:0] : LCDBASEL, A[21:1] of end addr 99 */ 100 addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/8; 101 addr >>=1; 102 addr &= 0x1fffff; 103 LCDSADDR2 = addr;// 104 } 105 106 void s3c2440_lcd_controller_enalbe(void) 107 { 108 /* 背光引腳 : GPB0 */ 109 GPBDAT |= (1<<0); 110 111 /* pwren : 給LCD提供AVDD */ 112 LCDCON5 |= (1<<3); 113 114 /* LCDCON1'BIT 0 : 設置LCD控制器是否輸出信號 */ 115 LCDCON1 |= (1<<0); 116 } 117 118 void s3c2440_lcd_controller_disable(void) 119 { 120 /* 背光引腳 : GPB0 */ 121 GPBDAT &= ~(1<<0); 122 123 /* pwren : 給LCD提供AVDD */ 124 LCDCON5 &= ~(1<<3); 125 126 /* LCDCON1'BIT 0 : 設置LCD控制器是否輸出信號 */ 127 LCDCON1 &= ~(1<<0); 128 } 129 130 struct lcd_controller s3c2440_lcd_controller = { 131 .init = s3c2440_lcd_controller_init, 132 .enalbe = s3c2440_lcd_controller_enalbe, 133 .disable = s3c2440_lcd_controller_disable, 134 };?
轉載于:https://www.cnblogs.com/-glb/p/11335680.html
總結
以上是生活随笔為你收集整理的LCD编程_LCD控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA设置虚拟机参数
- 下一篇: @SuppressWarnings注解用