【轉載】linux lcd 基礎知識

【轉載】linux lcd 基礎知識


本文轉載自邊緣之火《linux lcd 基礎知識》

原文鏈接: http://hi.baidu.com/weizhiyuan420/blog/item/1e1d179805e35ba1c8eaf47c.html

linux lcd 基礎知識
2011-02-18 13:53


1. LCD工作的硬件需求:
   要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅動器,而且還需要相應的LCD控制器。在通常情況下,生產廠商把LCD驅動器會以COF/COG的形式與LCD玻璃基板製作在一起,而LCD控制器則是由外部的電路來實現,現在很多的MCU內部都集成了LCD控制器,如S3C2410/2440等。通過LCD控制器就可以產生LCD驅動器所需要的控制信號來控制STN/TFT屏了。
 
2. S3C2440內部LCD控制器結構圖:
linux lcd 基礎知識 - 邊緣之火 - 邊緣之火
我們根據數據手冊來描述一下這個集成在S3C2440內部的LCD控制器:
a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
b:REGBANK由17個可編程的寄存器組和一塊256*16的調色板內存組成,它們用來配置LCD控制器的;
c:LCDCDMA是一個專用的DMA,它能自動地把在偵內存中的視頻數據傳送到LCD驅動器,通過使用這個DMA通道,視頻數據在不需要 CPU的干預的情況下顯示在LCD屏上;
d:VIDPRCS接收來自LCDCDMA的數據,將數據轉換爲合適的數據格式,比如說4/8位單掃,4位雙掃顯示模式,然後通過數據端口 VD[23:0]傳送視頻數據到LCD驅動器;
e:TIMEGEN由可編程的邏輯組成,他生成LCD驅動器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關,通過不同的配置,TIMEGEN就能產生這些信號的不同形態,從而支持不同的LCD驅動器(即不同的STN/TFT屏)。
 
3. 常見TFT屏工作時序分析:
linux lcd 基礎知識 - 邊緣之火 - 邊緣之火
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 像素數據輸出端口(TFT/STN/SEC TFT);
VDEN/VM/TP:數據使能信號(TFT)/LCD驅動交流偏置信號(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的顯示並不是對一副圖像快速的顯示一下,爲了持續和穩定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目的只是爲了將圖像持續的顯示在LCD上)。那麼這一副一副的圖像就稱之爲幀,在時序圖上就表示爲1 Frame,因此從時序圖上可以看出1 Line只是1 Frame中的一行;
F:同樣的,在幀與幀切換之間也是需要一定的時間的,我們稱之爲幀切換,那麼LCD整個顯示的過程在時間線上看,就可表示爲時序圖上的VSYNC。


 
上面時序圖上各時鐘延時參數的含義如下:(這些參數的值,LCD產生廠商會提供相應的數據手冊)


VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以後的無效的行數,對應驅動中的 upper_margin;
VFBD(vertical front porch):表示在一幀圖像結束後,垂直同步信號以前的無效的行數,對應驅動中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脈衝的寬度,用行數計算,對應驅動中的vsync_len;
HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數據開始之間的VCLK的個數,對應驅動中的 left_margin;
HFPD(horizontal front porth):表示一行的有效數據結束到下一個水平同步信號開始之間的VCLK的個數,對應驅動中的 right_margin;
HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅動中的hsync_len;


 
對於以上這些參數的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440 數據手冊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爲顯示設備提供的一個接口,它把一些顯示設備描述成一個緩衝區,允許應用程序通過 FrameBuffer定義好的接口訪問這些圖形設備,從而不用去關心具體的硬件細節。對於幀緩衝設備而言,只要在顯示緩衝區與顯示點對應的區域寫入顏色值,對應的顏色就會自動的在屏幕上顯示。下面來看一下在不同色位模式下緩衝區與顯示點的對應關係:
linux lcd 基礎知識 - 邊緣之火 - 邊緣之火
三、幀緩衝(FrameBuffer)設備驅動結構:
 
     幀緩衝設備爲標準的字符型設備,在Linux中主設備號29,定義在/include/linux/major.h中的 FB_MAJOR,次設備號定義幀緩衝的個數,最大允許有32個FrameBuffer,定義在/include/linux/fb.h中的 FB_MAX,對應於文件系統下/dev/fb%d設備文件。

1. 幀緩衝設備驅動在Linux子系統中的結構如下:
linux lcd 基礎知識 - 邊緣之火 - 邊緣之火
我們從上面這幅圖看,幀緩衝設備在Linux中也可以看做是一個完整的子系統,大體由fbmem.c和 xxxfb.c組成。向上給應用程序提供完善的設備文件操作接口(即對FrameBuffer設備進行read、write、ioctl等操作),接口在 Linux提供的fbmem.c文件中實現;向下提供了硬件操作的接口,只是這些接口Linux並沒有提供實現,因爲這要根據具體的LCD控制器硬件進行設置,所以這就是我們要做的事情了(即xxxfb.c部分的實現)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章