先簡單介紹下lcd的操作原理。 如下圖的lcd示意圖,裡面的每個點就是乙個畫素點。
想象有乙個電子槍,一邊移動,一邊發出各種顏色的光。這裡有很多細節問題,我們乙個乙個的梳理。
電子槍是如何移動的?
答:有一條clk時鐘線與lcd相連,每發出一次clk(高低電平),電子槍就移動乙個畫素。
顏色如何確定?
答:由連線lcd的三組線:r(red)、g(green)、b(blue)確定。
電子槍如何得知應跳到原點?
答:有一條vsync訊號線與lcd相連,每發出一次脈衝(高低電平),電子槍就跳到原點。
rgb線上的資料從何而來?
答:記憶體裡面劃分一塊視訊記憶體(framebuffer),裡面存放了要顯示的資料,lcd控制器從裡面將資料讀出來,通過rgb三組線傳給電子槍,電子槍再依次打到顯示屏上。
前面的訊號由誰發給lcd?
答:有s3c2440裡面的lcd控制器來控制發出訊號。
通過jz2440原理圖對上面進行驗證,下圖的lcd控制器介面圖。 chapter17 lesson1 002.jpg
①是時鐘訊號,每來乙個clk,電子槍就移動乙個畫素;
②是用來傳輸顏色資料;
③是垂直方向同步訊號,frame(幀);
④是水平方向同步訊號,line(行);
再來看看lcd的晶元手冊。 chapter17 lesson1 003.jpg
先是vled+、vled-背光燈電源。vdd、vdd是lcd電源。
r0-r7、g0-g7、b0-b7是紅綠藍顏色訊號。
pclk是畫素時鐘訊號。disp是畫素開關。
hsync、vsync分別是水平方向、垂直方向訊號。
de資料使能。x1、y1、x2、y2是觸控螢幕訊號。
從最小的畫素開始分析,電子槍每次在clk下降沿(本開發板是下降沿)從資料線dn0-dn7上得到資料,發射到顯示屏上,然後移動到下乙個位置。dn0-dn7上的資料**就是前面介紹的framebuffer。就這樣從一行的最左邊,一直移動到一行的最右邊,完成了一行的顯示,假設為x。
當打完一行的最後乙個資料後,就會收到hsync行同步訊號,根據時序圖,乙個hsync週期可以大致分為五部分組成:thp、thb、1/tc、thd、thf。thp稱為脈衝寬度,這個時間不能太短,太短電子槍可能識別不到。電子槍正確識別到thp後,會從最右端移動最左端,這個移動的時間就是thb,稱之為移動時間。thf表示顯示完最右畫素,再過多久hsync才來。
同理,當電子槍一行一行的從上面移動到最下面時,vsync垂直同步訊號就讓電子槍移動回最上邊。vsync中的tvp是脈衝寬度,tvb是移動時間,tvf表示顯示完最下一行畫素,再過多久vsync才來。 假設一共有y行,則lcd的解析度就是x*y。
關於顯示原理,可以參考這篇部落格:
裡面有乙個lcd顯示配置示意圖如下: chapter17 lesson1 005.jpg
當發出乙個hsync訊號後,電子槍就會從最右邊花費hbp時長移動到最左邊,等到了最右邊後,等待hfp時長hsync訊號才回來。因此,hbp和hfp分別決定了左邊和右邊的黑框。
同理,當發出乙個vsync訊號後,電子槍就會從最下邊花費vbp時長移動到最上邊,等到了最下邊後,等待vfp時長vsync訊號才回來。因此,vbp和vfp分別決定了上邊和下邊的黑框。 中間灰色區域才是有效顯示區域。
再來解決最後乙個問題:每個畫素再framebuffer中,佔據多少位bpp(bits per pixels)? 前面的lcd引腳功能圖里,r0-r7、g0-g7、b0-b7,每個畫素是佔據3*8=24位的,即硬體上lcd的bpp是確定的。
雖然lcd上的引腳是固定的,但我們使用的時候,可以根據實際情況進行取捨,比如我們的jz2440使用的是16bpp,因此lcd只需要r0-r4、g0-g5、b0-b4與soc相連,5+6+5=16bpp,每個畫素就只佔據16位資料。
我們寫程式的思路如下:
檢視lcd晶元手冊,檢視相關的時間引數、解析度、引腳極性;
根據以上資訊設定lcd控制器暫存器,讓其發出正確訊號;
在記憶體裡面分配乙個framebuffer,在裡面用若干位表示乙個畫素,再把首位址告訴lcd控制器;
之後lcd控制器就能周而復始取出framebuffer裡面的畫素資料,配合其它控制訊號,傳送給電子槍,電子槍再讓在lcd上顯示出來。以後我們想顯示影象,只需要編寫程式向framebuffer填入相應資料即可,硬體會自動的完成顯示操作。
以上內容**
使用lcd為4.3寸,設定為32bpp,畫素為x480,y272
新建檔案有 lcddrv.c lcddrv.h lcdlib.c lcdlib.h。
在lcddrv.c 中,配置lcd相關的引腳,初始化lcd設定lcd的特殊暫存器。配置為32bpp
在lcdlib.c 中,通過呼叫lcddrv中的函式,測試lcd,使之輸出全屏的紅色,綠色,藍色。
lcddrv.c
#include "lcddrv.h"
void lcd_port_init(void)
void tft_lcd_init(void)
x * x
* ]
* = 60hz
* 3. lcdcon5:
* 設定顯示模式為8bpp時,調色盤中的資料格式: 5:6:5
* 設定hsync、vsync脈衝的極性(這需要參考具體lcd的介面訊號): 反轉
* 位元組交換使能
*/lcdcon1 = (5<<8) | (3<<5) | (0xd<<1) ;
lcdcon2 = (1<<24) | (271<<14) | (1<<6) | (9<<0);
lcdcon3 = (1<<19) | (479<<8) | (1<<0);
lcdcon4 = (40<<0);
lcdcon5 = (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (0<<5) | (1<<11) | 0;
fb_base = 0x33c00000;
addr = fb_base & ~(1<<31);
lcdsaddr1 = (addr >> 1);
addr = fb_base + 480*272*32/8;
addr >>=1;
addr &= 0x1fffff;
lcdsaddr2 = addr;
}void tft_lcd_enalbe(void)
lcdlib.c
#include "lcdlib.h"
void lcd_test(void)
實驗結果為:
在lcd中,先顯示全屏紅色,然後綠色,藍色。
S3C2440的LCD虛擬顯示測試
一 概述 s3c2440的lcd控制器支援虛擬顯示,說的容易理解一點就是,可以顯示比實際顯示器大的影象。可以這樣想象,有乙個大的,但是顯示器 顯示串列埠 比較小,但是我們可以相對於大 即大不動 移動顯示器的位置,從而實現觀察大的其他部分的內容。晶元手冊上對這部分內容用乙個來生動展示如下。這裡說明四點...
s3c2440外部中斷操作
要想正確地執行2440的外部中斷,一般需要完成兩個部分內容 中斷初始化和中斷處理函式。在具體執行中斷之前,要初始化好要用的中斷。2440的外部中斷引腳eint與通用io引腳f和g復用,要想使用中斷功能,就要把相應的引腳配置成中斷模式,如我們想把埠f0設定成外部中斷,而其他引腳功能不變,則gpfcon...
求教 s3c2440問題
趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...