電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>C語言|源代碼>LCD驅(qū)動編寫總結(jié)

LCD驅(qū)動編寫總結(jié)

2009-09-19 | rar | 322 | 次下載 | 10積分

資料介紹

LCD驅(qū)動編寫小結(jié)
3.1 背光:對于大部分的彩色LCD一定要接背光,我們才能看到屏上的內(nèi)容;
3.2 控制信號:不同的LCD廠商對于控制信號有不同的叫法,
VFRAME:LCD控制器和LCD驅(qū)動器之間的幀同步信號。該信號告訴LCD屏的新的一幀開始了。LCD控制器在一個完整幀顯示完成后立即插入一個VFRAME信號,開始新一幀的顯示;
VLINE:LCD控制器和LCD驅(qū)動器之間的線同步脈沖信號,該信號用于LCD驅(qū)動器將水平線(行)移位寄存器的內(nèi)容傳送給LCD屏顯示。LCD控制器在整個水平線(整行)數(shù)據(jù)移入LCD驅(qū)動器后,插入一個VLINE信號;
VCLK:LCD控制器和LCD驅(qū)動器之間的像素時鐘信號,由LCD控制器送出的數(shù)據(jù)在VCLK的上升沿處送出,在VCLK的下降沿處被LCD驅(qū)動器采樣;
VM:LCD驅(qū)動器的AC信號。VM信號被LCD驅(qū)動器用于改變行和列的電壓極性,從而控制像素點的顯示或熄滅。VM信號可以與每個幀同步,也可以與可變數(shù)量的VLINE信號同步。

3.3 數(shù)據(jù)線:也就是我們說的RGB信號線,不過需要與硬件工程是配合的是他采用了哪種接線方法,24位16位或其它。對于16位TFT屏又有兩種方式,在寫驅(qū)動前你要清楚是5:6:5還是5:5:5:I,這些與驅(qū)動的編寫都有關(guān)系
3.4 要注意一下LCD的電源電壓,對于手持設(shè)備來說一般都為5V或3.3V,如果LCD的需要的電源電壓是5v,那就要注意,電壓只有3.3V的電壓需要提高到5V,否則你可能能將屏點亮,但顯示的圖像要等到太陽從西邊出來的那一天才能正常,呵呵,我可吃過苦頭的哦!
3.5 3.3V邏輯電壓轉(zhuǎn)變成5V邏輯電壓電路圖
3.6 最后還有一個問題,有些LCD屏還需要一顆伴侶芯片,就是S3C2410手冊中的那顆LPC3600。這可能在LCD的手冊中都有論述吧,我沒有遇到過這樣的屏,所以也不是很清楚,不過現(xiàn)在的大部分LCD屏應(yīng)該都不需要這個討厭的家伙了
3.7 還得提醒大家一下,S3C2410到LCD屏的連線千萬千萬別超過0.5米,否則會給你帶來麻煩,我也是吃過苦頭的,LCD屏上面的部分顯示任何信息都是正確的,而只有屏的底部會有時正確有時錯誤,折騰了好一陣,才知道是連線太長的緣故!
3.8 好了,在硬件工程師的幫助下,硬件接好了,那就該我們做軟件的干活了,編寫驅(qū)動吧
3.9 讓我們首先看一下RGB數(shù)據(jù)結(jié)構(gòu)的定義
static struct lcd_rgb ***_lcd_rgb_16 = {
red: //-- offset:11 length:5
green: //-- offset:5 length:6
blue: //-- offset:0 length:5
transp: //-- offset:0 length:0
};
3.10 這是對16位色的RGB顏色進行定義,R:G:B:I = 5:6:5:0,即我們常說的565顯示方式。
3.11 隨便寫一個16位數(shù)據(jù)的顏色數(shù)據(jù)(為了分析的方便,我把它寫成二進制)
RGB = 10101101 10111001 根據(jù)上面的結(jié)構(gòu)定義我們來分析一下RGB各是多少(因為沒有透明色,我們不去分析)
a) blue: {offset: 0, length: 5} 偏移量為0,長度為5,我們從那個RGB中提取出來便是 “11001”
b) green:{offset: 5, length: 6} 偏移量為5,長度為6,我們從那個RGB中提取出來便是101 101
c) red: {offset: 11, length: 5 } 偏移量為11,長度為5,我們從那個RGB中提取出來便是 10101
d) 我們得到了一個RGB值為21:45:25,就是這個顏色
e) 那么反過來,有了RGB的值我們該如何,因為RGB的有效位數(shù)都不足一個字節(jié)(8位),那我們只能忍痛割愛了,舍棄掉低位數(shù)據(jù),代碼如下:
r = R & 0xF8;
g = G & 0xFC;
b = B & 0xF8;
high = r | (g<<5);
low = (g<<3) | (b>>3);
color= (high << 8) | low;
記住,這段代碼在GUI程序中是有用的
3.12 很重要的:
a)顏色位數(shù),bpp:16如果你的LCD屏是TFT的,那一般都可以達到16位色或24位色,這也要看硬件怎么連接了,根據(jù)情況進行設(shè)置即可;
b) LCD屏的寬度和高度xres: 240,yres: 320這個就不用多說了,你的屏的分辨率是多少就設(shè)置成多少唄。
3.12 寄存器的設(shè)置,這些也不困難。下面就讓我們一起一口一口的將S3C2410的LCD寄存器統(tǒng)統(tǒng)吃掉!
首先介紹一下我這塊屏,這是日立的一塊TFT屏,大小為640X240,可以支持到16位色。
與驅(qū)動有關(guān)的一張表,
3.13 看一下LCD寄存器1的設(shè)置。
LINECNT --- 這是一個只讀的數(shù)據(jù),我們當然沒有必要理它
CLKVAL --- 這可是一個很有用的參數(shù),其實沒必要管它后面的計算,我們可以通過實際的測試來得出一個有效的值,對于PNRMODE --- 這個應(yīng)該不用多做解釋,大家一看都明白了,對于TFT屏,只能設(shè)置成11,而對于CSTN屏,可能需要根據(jù)實際屏的信息去設(shè)置,我遇到的屏都設(shè)置成10,即8bit單掃描模式。對于4bit單掃描、4bit雙掃描、8bit單掃描的BPPMODE --- 這個參數(shù)更不用多說了吧,就是設(shè)置屏的顏色位數(shù)嘍。
3.14 LCD 控制器 2,對于 TFT 屏必須要填
看一下圖二 LCD屏資料,對比一下得出如下信息:
LCD2_VBPD:
Vertical back po
LCD2_VFPD:
Vertical front porc
LCD2_VSPW:
Vsync Valid width
關(guān)于LINEVAL在程序的后面將
經(jīng)過分析,我們知道了如何設(shè)置LCD2:
3.15 LCD 控制器 3
對于 TFT 屏,很容易將 HBPD 和 HFPD 找出來,如下
porch 典型值為 37
porch 典型值為 32
此處暫時不管
LCD3_HBPD:
Horizontal back
LCD3_HFBD:
Horizontal back
對于HOZVAL同樣會在后面提到,
經(jīng)過分析,我們知道了如何設(shè)置LCD3:
3.16 LCD 控制器 4
對于 TFT 屏,需要設(shè)置 HSPW 的值,這個在 LCD 手冊上也很容易
_HSPW:
典型值為 5意思,有什么作用,我從來不動它,只取它最初的那個值13
經(jīng)過分析,我們知道了如 何設(shè)置 LCD4:
3.17 LCD 控制器 5
這個寄存器的看起來比較復(fù)雜,但是無外乎這幾類:
a.只讀信息:VSTATUS和HSTATUS只讀的東東,設(shè)置它也沒
b.TFT屏的顏色信息:BPP24BL、FRM565TFT屏的顏色信息,這個我們在LCD的硬件連接時已經(jīng)提到了,根據(jù)具體的接線方式,設(shè)置信息。
c.控制信號的極性,這些信息主要是使S3C2410的信號輸出極性與LCD屏的輸入極性題,需要根據(jù)具體的硬件進行設(shè)置,較為常見的是vline/hsync 、VFRAME/VSYNC脈沖的極性。
d.顏色信息的字節(jié)交換控制位:BSWP、HWSWP
這兩位用來控制字節(jié)交換和半字交換,主要用來大小頭的問題,如果
輸出到屏上的漢字左右互換了,或者輸出到屏上的圖花屏了,可以更改這個選項。
e.我的這塊TFT的信息設(shè)置如下:lcdcon5,一塊 CSTN 屏的信息:lcdcon5
f.FrameBuffer 起始寄存器 2 和 FrameBuffer 起始寄存器 3
這兩個寄存器的設(shè)置比較重要,在此我給出12位色CSTN屏和16位色TFT的設(shè)置代碼:
g.RGB Loopup Table Register
這三個寄存器的在驅(qū)動256色CSTN屏的時候需要使用,我在別的芯片上使用過,因為這顆芯片支持12位色,所以沒有去調(diào)試,我給出兩組可能的值:
S3C44B0上的
rREDLUT = 0xFCA86420;
rGREENLUT = 0xFCA86420;
rBLUELUT = 0xFFFFFA50;
Jupiter上的
rREDLUT = 0xFEC85310
rGREENLUT = 0xFEC85310
rBLUELUT = 0xFB40
3.18 好了,各個寄存器的設(shè)置完成了,最后在驅(qū)動CSTN屏的時候需要提醒大家一句,CSTN的信號引腳中有一個叫VM/DISP的信號線,這個信號線的作用就是打開LCD的顯示開關(guān),讓其進行顯示,它可以接到任何一個GPIO口上。S3C2410中提供了一個VM信號,可以將LCD的這個信號與S3C2410的VM信號相接即可,然后在驅(qū)動中一定要加上如下語句(藍色選中部分):
否則你的LCD可能沒有任何顯示哦(對于TFT屏不需要這個語句)
3.19. 驅(qū)動寫好了,重新Make,下載就可以了。如果一切順利,在TFT屏或256色的CSTN屏上會有一個漂亮的小蜻蜓(應(yīng)該是蜻蜓吧)出現(xiàn)。注意,并不是蜻蜓出現(xiàn)了就代表你的驅(qū)動OK了,還要用GUI程序做進一步的測試,因為某一個或幾個參數(shù)雖然不正確,但是仍然能夠看到小蜻蜓的,但顯示圖形的時候就有問題了。另外,在驅(qū)動CSTN到12位色的時候,我們在屏上看不到小蜻蜓(我的N塊CSTN屏上都沒見到小蜻蜓),我想,可能是armLinux本身不支持12位色顯示,或者我們某些地方?jīng)]搞對的原因吧,但這不代表你的驅(qū)動有問題,用GUI程序?qū)慒rameBuffer,看看能否的到正確的結(jié)果。
3.20. GUI程序的編寫
3.21 其實要在LCD上顯示圖像,說白了就是把數(shù)據(jù)(包含顏色)寫到FrameBuffer中對應(yīng)的位置就可以了用mmap函數(shù)使用戶空間的一段地址關(guān)聯(lián)到設(shè)備內(nèi)存(FrameBuffer)上。無論何時,只要程序在分配的地址范圍內(nèi)進行讀取或者寫入,實際上就是對設(shè)備的訪問,使用 mmap 可以既快速又簡單地訪問顯示卡的內(nèi)存。對于象這樣的性能要求比較嚴格的應(yīng)用來說,直接訪問能給我們提供很大不同。
3.22 不過我曾將幫一個網(wǎng)友調(diào)試了一個S3C44B0上的GUI程序,在他的GUI中mmap函數(shù)總會出錯,因為沒有拿到他的硬件和驅(qū)動源碼,沒有分析出其中的原因,所以只得用write函數(shù),直接向fb0寫入數(shù)據(jù),奇怪的是只寫入一部分數(shù)據(jù)好像都不起任何作用,只得整屏數(shù)據(jù)寫入才搞定了。這可就比較痛苦了,不過好在他只是寫入的黑白數(shù)據(jù),數(shù)據(jù)量還不是很大,要是彩色的那可真的痛苦了
3.23 另外,我還想多啰嗦兩句,F(xiàn)rameBuffer的像素點與LCD屏上的像素點的對應(yīng)關(guān)系 ,深入了解一下對程序的理解可能會更清楚一點。我們知道黑白(2色)顏色用0和1就可以表示了,也就是1位數(shù)據(jù)就可以了,那1個字節(jié)就可以表示8位數(shù)據(jù),假如這個字節(jié)是10101010,F(xiàn)rameBuffer的偏移地址為0,則在LCD屏上便會顯示出4個黑點,黑點中間會有4個白點出現(xiàn)(假如1是黑色);對于4色則用00、01、10、11就可以表示出四種顏色,即用兩位數(shù)據(jù)可以表示一位數(shù)據(jù),那同樣是10101010,則對應(yīng)于LCD屏上則顯示的是顏色值為10,長度為4(8/2)的一條直線;同理,對于8位色(256色),則8位數(shù)據(jù)才能表示出一個點的顏色值,10101010在LCD屏上就只能顯示為顏色值為10101010的點了。
3.24 有了上面的基礎(chǔ)我們就可以很好的理解這個語句了:
即FrameBuffer的大小=LCD屏的寬度 * LCD屏的高度 * 每像素的位數(shù) / 每字節(jié)的位數(shù)
例如,一個320*240的黑白平,F(xiàn)rameBuffer的大小為
320 * 240 * 1 / 8 = 9600 (字節(jié))
而一個320 * 240的16位色LCD的FrameBuffer的大小則為
3.25 TFT屏16位色的畫點函數(shù)
3.26 5) TFT屏16位色下顯示24色位圖函數(shù)
320 * 240 * 16 / 8 = 153600(字節(jié)

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1490次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關(guān)電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費
  11. 6基于AT89C2051/4051單片機編程器的實驗
  12. 0.11 MB  |  4次下載  |  免費
  13. 7藍牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
  14. 0.63 MB  |  3次下載  |  免費
  15. 89天練會電子電路識圖
  16. 5.91 MB  |  3次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應(yīng)用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關(guān)電源設(shè)計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537791次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費