
想象一下,螢幕的後面有一個電子槍,電子槍位于某個像素的背後,然後向這個像素發射紅綠藍三原色,進而就可以組成任意一種顔色。簡單的說,電子槍在像素的背後一邊移動,一邊向像素發射紅綠藍。
如果要編寫出LCD的驅動程式,首先要搞清楚下面的幾個問題:
1)電子槍如何移動
2)顔色如何确定
3)電子槍如何得知應該跳到下一行
4)電子槍跳到最下面一行的最後一個像素時,如何得知應該跳到原點
5)RGB線上的資料從什麼地方擷取
回答第5個問題,首先要明确framebuffer是什麼東西?
在記憶體中劃出一塊區域,這塊區域就稱為framebuffer.
在framebuffer中的這些資料,顯然是寫程式的人想要顯示的,由程式員構造。
framebuffer中的這些值,最終會被LCD控制器讀出來,然後通過RGB三組線,傳給電子槍,電子槍要把它轉換為紅綠藍三種顔色,打到像素上面去。右面屏中的每個像素在framebuffer中都有對應的存儲空間,裡面存有這個像素的顔色。
2、分析lcd的時序圖
clk:電子槍在clk的下降沿(對于其它型号的lcd,有可能是上升沿)從資料線上得到資料,然後發射到像素上,最後移動到下一個像素。
資料線上的資料其實就是從framebuffer中獲得的資料。
一行有多少像素,假設是x。
-------------------------------------------------------------------------------------------------------------------------------------------
當電子槍打完一行中的最後一個像素時,再經過多長時間會收到行同步信号呢?在該圖中取為thf.
當電子槍打完一行中的最後一個像素時,會收到一個行同步信号HSYNC,如果這個行同步信号的脈沖很小,電子槍根本反應不過來,是以脈沖寬度不能太小,在該圖中取為thp。
電子槍收到行同步信号後,就會從最右邊移動到最左邊,移動過程也不會瞬間完成,需要一定的時間,在該圖中取為thb.
--------------------------------------------------------------------------------------------------------------------------------------------
當顯示完所有的行後,再經過多長時間會收到垂直同步信号呢?在該圖中取為tvf.
當顯示完所有的行後,電子槍會收到一個垂直同步信号VSYNC,如果這個垂直同步信号的脈沖很小,電子槍根本反應不過來,是以脈沖寬度不能太小,在該圖中取為tvp。
電子槍收到垂直同步信号後,就會從最下邊移動到原點,移動過程也不會瞬間完成,需要一定的時間,在該圖中取為tvb.
----------------------------------------------------------------------------------------------------------------------------------------------
3、這些時間參數如何影響螢幕上的圖像位置呢?(和第2部分的參數名字不一樣,但意義是一樣的)
4、每個像素在framebuffer中占據多少位,用bpp表示。bit per pixel
硬體上LCD的bpp是确定的,比如說看該款LCD,有24條資料線。即每個像素可以用24bit來表示。
是不是有多少條資料線,我就得用多少條呢?這是不一定的。
比如說
R0~R7,我隻用5條,其他接地
G0~G7,我隻用6條,其他接地
B0~B7,我隻用5條,其他接地
總共需要5+6+5=16條線,即每個像素占據16位的資料
總結一下:如何進行lcd程式設計?
1)需要看LCD的晶片手冊,确定時間參數,确定分辨率,确定引腳極性。根據這些資訊來設定lcd控制器,使它可以發出正确的信号。
2)在記憶體中配置設定一個framebuffer,這個framebuffer裡面,每個像素占據若幹位。配置設定好framebuffer後,把首位址告訴lcd控制器。以後lcd控制器就可以周而複始的從framebuffer中取出每個資料,然後配合其他信号,把像素的資料發給電子槍,讓電子槍顯示出來。
3)設定好lcd控制器後,寫程式時,隻需要把資料填到framebuffer中就可以了,硬體上會自動的把這些資料在lcd上顯示出來。