背景知識
1. LCD工作的硬件需求:
要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動器會以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S3C2410/2440等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號來控制STN/TFT屏了。
2. S3C2440內(nèi)部LCD控制器結構圖:
我們根據(jù)數(shù)據(jù)手冊來描述一下這個集成在S3C2440內(nèi)部的LCD控制器:
a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
b:REGBANK由17個可編程的寄存器組和一塊256*16的調(diào)色板內(nèi)存組成,它們用來配置LCD控制器的;
c:LCDCDMA是一個專用的DMA,它能自動地把在偵內(nèi)存中的視頻數(shù)據(jù)傳送到LCD驅(qū)動器,通過使用這個DMA通道,視頻數(shù)據(jù)在不需要CPU的干預的情況下顯示在LCD屏上;
d:VIDPRCS接收來自LCDCDMA的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)換為合適的數(shù)據(jù)格式,比如說4/8位單掃,4位雙掃顯示模式,然后通過數(shù)據(jù)端口VD[23:0]傳送視頻數(shù)據(jù)到LCD驅(qū)動器;
e:TIMEGEN由可編程的邏輯組成,他生成LCD驅(qū)動器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關,通過不同的配置,TIMEGEN就能產(chǎn)生這些信號的不同形態(tài),從而支持不同的LCD驅(qū)動器(即不同的STN/TFT屏)。
3. 常見TFT屏工作時序分析:
LCD提供的外部接口信號:
VSYNC/VFRAME/STV:垂直同步信號(TFT)/幀同步信號(STN)/SEC TFT信號;
HSYNC/VLINE/CPV:水平同步信號(TFT)/行同步脈沖信號(STN)/SEC TFT信號;
VCLK/LCD_HCLK:象素時鐘信號(TFT/STN)/SEC TFT信號;
VD[23:0]:LCD像素數(shù)據(jù)輸出端口(TFT/STN/SEC TFT);
VDEN/VM/TP:數(shù)據(jù)使能信號(TFT)/LCD驅(qū)動交流偏置信號(STN)/SEC TFT 信號;
LEND/STH:行結束信號(TFT)/SEC TFT信號;
LCD_LPCOE:SEC TFT OE信號;
LCD_LPCREV:SEC TFT REV信號;
LCD_LPCREVB:SEC TFT REVB信號。
所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說吧,一副圖像可以看做是一個矩形,由很多排列整齊的點一行一行組成,這些點稱之為像素。那么這幅圖在LCD上的顯示原理就是:
A:顯示指針從矩形左上角的第一行第一個點開始,一個點一個點的在LCD上顯示,在上面的時序圖上用時間線表示就為VCLK,我們稱之為像素時鐘信號;
B:當顯示指針一直顯示到矩形的右邊就結束這一行,那么這一行的動作在上面的時序圖中就稱之為1 Line;
C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時間的,我們稱之為行切換;
D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時間線上看,就是時序圖上的HSYNC;
E:然而,LCD的顯示并不是對一副圖像快速的顯示一下,為了持續(xù)和穩(wěn)定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目的只是為了將圖像持續(xù)的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時序圖上就表示為1 Frame,因此從時序圖上可以看出1 Line只是1 Frame中的一行;
F:同樣的,在幀與幀切換之間也是需要一定的時間的,我們稱之為幀切換,那么LCD整個顯示的過程在時間線上看,就可表示為時序圖上的VSYNC。
上面時序圖上各時鐘延時參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會提供相應的數(shù)據(jù)手冊)
VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù),對應驅(qū)動中的upper_margin;
VFBD(vertical front porch):表示在一幀圖像結束后,垂直同步信號以前的無效的行數(shù),對應驅(qū)動中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算,對應驅(qū)動中的vsync_len;
HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù),對應驅(qū)動中的left_margin;
HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結束到下一個水平同步信號開始之間的VCLK的個數(shù),對應驅(qū)動中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅(qū)動中的hsync_len;
對于以上這些參數(shù)的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數(shù)據(jù)手冊LCD部分)
LCDCON1:17- 8位CLKVAL
6- 5位掃描模式(對于STN屏:4位單/雙掃、8位單掃)
4- 1位色位模式(1BPP、8BPP、16BPP等)
LCDCON2:31 - 24位VBPD
23 - 14位LINEVAL
13 - 6位VFPD
5 - 0位VSPW
LCDCON3:25 - 19位HBPD
18 - 8位HOZVAL
7 - 0位HFPD
LCDCON4: 7 - 0位HSPW
LCDCON5:
4. 幀緩沖(FrameBuffer):
幀緩沖是Linux為顯示設備提供的一個接口,它把一些顯示設備描述成一個緩沖區(qū),允許應用程序通過FrameBuffer定義好的接口訪問這些圖形設備,從而不用去關心具體的硬件細節(jié)。對于幀緩沖設備而言,只要在顯示緩沖區(qū)與顯示點對應的區(qū)域?qū)懭腩伾担瑢念伾蜁詣拥脑谄聊簧巷@示。下面來看一下在不同色位模式下緩沖區(qū)與顯示點的對應關系:
5.lcd硬件電路:
以上總結轉(zhuǎn)自:http://blog.chinaunix.net/u3/101649/showart.php?id=2188364
歸納總結:
一.s3c2440為我們提供了便利的lcd接口,(GPC管腳用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND)(GPD管教用于VD[23:8]) 詳情見s3c2440的datasheet。
二.對于控制TFT LCD來說,只用設置寄存器LCDCON1~LCDCON5(用于選擇LCD類型,設置各類控制信號的時間特性等)和LCDSADDR1~LCDSADDR3(用于設置幀內(nèi)存地址)幾個寄存器就可以了。對于這幾個寄存器的設置:
/*
*設置LCD控制器的控制寄存器LCDCON1~5
*1.LCDCON1:
*設置VCLK的頻率:VCLK(Hz)=HCLK/[(CLKVAL+1)x2]
*選擇LCD類型:TFT LCD
*設置顯示模式:8BPP
*先禁止LCD信號輸出
*2.LCDCON2/3/4:
*設置控制信號的時間參數(shù)
*設置分辨率,即行數(shù)及列數(shù)
*現(xiàn)在,可以根據(jù)公式計算出顯示器的頻率:
*當HCLK=100MHz時,
*Frame Rate=1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
*{(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
*{2x(CLKVAL+1)/(HCLK)}]
*=60Hz
*3.LCDCON5:
*設置顯示模式為8BPP時,調(diào)色板中的數(shù)據(jù)格式:5:6:5
*設置HSYNC、VSYNC脈沖的極性(這需要參考具體LCD的接口信號):反轉(zhuǎn)
*字節(jié)交換使能
*/
其中VBPD,VFPD,VSPW,HBPD,HFPD,HSPW這幾個參數(shù)是有LCD生產(chǎn)商提供的,根據(jù)其datashet修改就是了。
===================================================================================
/*
* 設置LCD控制器的地址寄存器LCDSADDR1~3
* 幀內(nèi)存與視口(view point)完全吻合,
* 圖像數(shù)據(jù)格式如下(8BPP時,幀緩沖區(qū)中的數(shù)據(jù)為調(diào)色板中的索引值):
* |----PAGEWIDTH----|
* y/x 0 1 2 639
* 0 idx idx idx ... idx
* 1 idx idx idx ... idx
*1. LCDSADDR1:
* 設置LCDBANK、LCDBASEU
* 2. LCDSADDR2: