mini2440硬件篇之LCD
1.硬件原理
要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動(dòng)器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動(dòng)器會(huì)以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實(shí)現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S3C2410/2440等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動(dòng)器所需要的控制信號(hào)來控制STN/TFT屏了。嵌入式LCD主要以薄膜式晶體管型TFT為主流。TFTLCD特性:
支持每像素1、2、4、8位調(diào)色顯示。
支持每像素16位、24位真彩TFTLCD.
支持最大1600萬色(24位每像素模式)TFTLCD.
典型實(shí)際分辨率:640x480,320x240,160*160
最大虛擬分辨率:4M字節(jié).
最大虛擬分辨率(65536色)2048x1024.
下圖給出了TFT的典型時(shí)序圖。
我們先來理解下面引腳有寄存器中相關(guān)參數(shù)的意義吧
外部引腳信號(hào):
VSYNC:幀同步信號(hào),表示掃描1幀的開始,一幀就是LCD顯示的一個(gè)畫面。
HSYNC:行同步信號(hào),表示掃描1行的開始。
VDEN:數(shù)據(jù)使能信號(hào)。
VD[23:0]:LCD像素?cái)?shù)據(jù)輸出端口。
VCLK:像素時(shí)鐘信號(hào)。
寄存器參數(shù):
VSPW:幀同步信號(hào)的脈寬,單位為1行(Line)的時(shí)間。
VFPD:幀同步信號(hào)的前肩,單位為1行(Line)的時(shí)間。
VBPD:幀同步信號(hào)的后肩,單位為1行(Line)的時(shí)間。
LINEVAL:幀顯示尺寸-1,即屏行寬-1,
HBPD:行同步信號(hào)的后肩,單位為1VCLK的時(shí)間。
HFPD:行同步信號(hào)的前肩,單位為1VCLK的時(shí)間。
HSPW:行同步信號(hào)的脈寬,單位為1VCLK的時(shí)間。
HOZVAL:行顯示尺寸-1,即屏列寬-1,
2.芯片手冊(cè)
3.mini2440電路圖
4.S3C2440寄存器
要想正確使用LCD,必須注意兩點(diǎn):1、時(shí)序;2、顯示緩存區(qū)。
4.1.時(shí)序
LCD一般需要三個(gè)時(shí)序信號(hào):VSYNC、HSYNC和VCLK。VSYNC是垂直同步信號(hào),在每進(jìn)行一個(gè)幀(即一個(gè)屏)的掃描之前,該信號(hào)就有效一次,由該信號(hào)可以確定LCD的場(chǎng)頻,即每秒屏幕刷新的次數(shù)(單位Hz)。HSYNC是水平同步信號(hào),在每進(jìn)行一行的掃描之前,該信號(hào)就有效一次,由該信號(hào)可以確定LCD的行頻,即每秒屏幕從左到右掃描一行的次數(shù)(單位Hz)。VCLK是像素時(shí)鐘信號(hào)。s3c2440處理LCD的時(shí)鐘源是HCLK,通過寄存器LCDCON1中的CLKVAL可以調(diào)整VCLK頻率大小,它的公式為:
VCLK=HCLK÷[(CLKVAL+1)×2]
例如,HCLK的頻率為100MHz,要想驅(qū)動(dòng)像素時(shí)鐘信號(hào)為6.4MHz的LCD屏,則通過上式計(jì)算CLKVAL值,結(jié)果CLKVAL為6.8,取整后(值為6)放入寄存器LCDCON1中相應(yīng)的位置即可。由于CLKVAL進(jìn)行了取整,因此我們把取整后的值代入上式,重新計(jì)算VCLK,得到VCLK=7.1MHz。
按理說,對(duì)于一個(gè)已知尺寸(即水平顯示尺寸HOZVAL和垂直顯示尺寸LINEVAL已知)的LCD屏,只要確定了VCLK值,行頻和場(chǎng)頻就應(yīng)該知道了。但這樣還不行的,因?yàn)樵诿恳粠瑫r(shí)鐘信號(hào)中,還會(huì)有一些與屏顯示無關(guān)的時(shí)鐘出現(xiàn),這就給確定行頻和場(chǎng)頻帶來了一定的復(fù)雜性。如在HSYNC信號(hào)先后會(huì)有水平同步信號(hào)前肩(HFPD)和水平同步信號(hào)后肩(HBPD)出現(xiàn),在VSYNC信號(hào)先后會(huì)有垂直同步信號(hào)前肩(VFPD)和垂直同步信號(hào)后肩(VBPD)出現(xiàn),在這些信號(hào)時(shí)序內(nèi),不會(huì)有有效像素信號(hào)出現(xiàn),另外HSYNC和VSYNC信號(hào)有效時(shí),其電平要保持一定的時(shí)間,它們分別叫做水平同步信號(hào)脈寬HSPW和垂直同步信號(hào)脈寬VSPW,這段時(shí)間也不能有像素信號(hào)。因此計(jì)算行頻和場(chǎng)頻時(shí),一定要包括這些信號(hào)。HBPD、HFPD和HSPW的單位是一個(gè)VCLK的時(shí)間,而VSPW、VFPD和VBPD的單位是掃描一行所用的時(shí)間。在s3c2440中,所有的這些信號(hào)(VSPW、VFPD、VBPD、LINEVAL、HBPD、HFPD、HSPW和HOZVAL)都是實(shí)際值減1的結(jié)果。這些值是通過寄存器LCDCON2、LCDCON3和LCDCON4來配置,只要把這些值配置成與所要驅(qū)動(dòng)的LCD中相關(guān)內(nèi)容的數(shù)據(jù)一致即可。例如,我們所要顯示的LCD屏大小為320×240,因此HOZVAL=320-1,LINEVAL=240-1。水平同步信號(hào)的脈寬、前肩和后肩分別為30、20和38,則HSPW=30-1,HFPD=20-1,HBPD=38-1;垂直同步信號(hào)的脈寬、前肩和后肩分別為3、12和15,則VSPW=3-1,VFPD=12-1,VBPD=15-1。
下面我們就具體計(jì)算一下行頻(HSF)和場(chǎng)頻(VSF):
HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]
=7.1÷408=17.5kHz
VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]
=17.5÷270=64.8Hz
在有些情況下,s3c2440的LCD時(shí)鐘信號(hào)的默認(rèn)極性與所控制的LCD時(shí)鐘信號(hào)的極性相反,這時(shí)可以通過寄存器LCDCON5的相關(guān)位來改變某些時(shí)鐘信號(hào)的極性。
4.2.顯示緩存區(qū)
只要把所要顯示的數(shù)據(jù)放入顯示緩存區(qū)內(nèi),就可以在屏幕上呈現(xiàn)內(nèi)容。該緩存區(qū)是我們自己編程時(shí)開辟的一段內(nèi)存區(qū)。一般我們是通過定義一個(gè)與屏幕尺寸大小相同的二維數(shù)組來開辟該空間的,這樣控制屏幕內(nèi)容會(huì)方便一些,如當(dāng)屏幕的尺寸為320×240時(shí),可以定義該緩存區(qū)為L(zhǎng)CD_BUFFER[240][320]。由于s3c2440支持16位和24位的非調(diào)色板真彩色的TFT型LCD模式,而24位顏色模式是用32位數(shù)據(jù)來表示的,所以前面定義的那個(gè)二維數(shù)據(jù)的數(shù)據(jù)類型應(yīng)該是半字整型或全字整型的。例如,在24位顏色模式下,我們想要在尺寸大小為320×240屏幕的中心處設(shè)置為白色像素,則:LCD_BUFFER[120][160]=0xffffffff。
在s3c2440中,寄存器LCDSADDR1和LCDSADDR2用于設(shè)置顯示緩存區(qū),即把我們定義的那個(gè)二維數(shù)組告訴s3c2440。其中LCDBANK的9位數(shù)據(jù)指定LCD的BANK,即顯示緩存區(qū)的第30位到第22位地址;LCDBASEU的21位數(shù)據(jù)指定了LCD的基址,即顯示緩存區(qū)開始地址的第21位到第1位;LCDBASEL的21位數(shù)據(jù)指定了LCD的尾址,即顯示緩存區(qū)結(jié)束地址的第21位到第1位。例如,我們想要在尺寸為320×240的屏幕上顯示24位顏色,定義的顯示緩存區(qū)數(shù)組為L(zhǎng)CD_BUFFER[240][320],則LCDBANK等于LCD_BUFFER的第30位到第22位數(shù)據(jù)值(因?yàn)長(zhǎng)CD_BUFFER表示的就是數(shù)組的首地址),LCDBASEU等于LCD_BUFFER的第21位到第1位數(shù)據(jù)值,由于是用32位數(shù)據(jù)表示24為顏色,因此每個(gè)像素值是4個(gè)字節(jié),所以LCDBASEL等于(LCD_BUFFER+(240×320×4))結(jié)果的第21位到第1位的數(shù)據(jù)值。另外寄存器LCDSADDR3有兩個(gè)內(nèi)容:OFFSIZE和PAGEWIDTH。OFFSIZE用于虛擬屏幕的偏移長(zhǎng)度,如果我們不使用虛擬屏幕,就把它置為0;PAGEWIDTH定義了視口的寬,單位是半字,如在上面的例子中,PAGEWIDTH應(yīng)該為320×32÷16。
lcd.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:lcd.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:LCD驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#ifndef__LCD_H__
#define__LCD_H__
#defineLCD_W35//320*240/3.5英寸TFT真彩液晶屏
#ifdefined(LCD_W35)
#defineLCD_CLKVAL7
#defineLCD_WIDTH320
#defineLCD_HEIGHT240
#defineLCD_HBPD0x44//開始
#defineLCD_HFPD0x4//結(jié)束
#defineLCD_HSPW1//ThewidthofHSYNC
#defineLCD_VBPD10//開始
#defineLCD_VFPD4//結(jié)束
#defineLCD_VSPW1//ThewidthofVSYNC
#endif
#defineBPPMODE_1BPP0x8
#defineBPPMODE_2BPP0x9
#defineBPPMODE_4BPP0xA
#defineBPPMODE_8BPP0xB
#defineBPPMODE_16BPP0xC
#defineBPPMODE_24BPP0xD
#defineLCDTYPE_TFT0x3
#defineENVID_DISABLE0
#defineENVID_ENABLE1
#defineFRM_55510
#defineFRM_5651
#defineHSYNC_NORM0
#defineHSYNC_INV1
#defineVSYNC_NORM0
#defineVSYNC_INV1
#definePWREN1
#defineBSWP1
#define HWSWP