基于嵌入式系統(tǒng)的彩色液晶顯示驅(qū)動(dòng)控制
3 LCD驅(qū)動(dòng)的工作時(shí)序
圖4所示為LCD驅(qū)動(dòng)主動(dòng)模式下的工作時(shí)序圖。其中L_PCLK為像素時(shí)鐘,用于把像素?cái)?shù)據(jù)輸入到LCD顯示器中的移位寄存器中,針對(duì)于TFT- LCD連續(xù)跳變;L_LCLK為行掃描時(shí)鐘,針對(duì)于TFT-LCD是水平同步信號(hào),用于LCD顯示器行顯示的結(jié)束和把移位寄存器的行數(shù)據(jù)送到顯示器中,并且行指針加1;L_FCLK為幀掃描時(shí)鐘,針對(duì)于TFT-LCD是垂直同步信號(hào),用于LCD顯示器新的幀像素的開始,復(fù)位時(shí)行指針指向屏幕的頂部;L_BIAS是數(shù)據(jù)使能信號(hào)[2]。
4 微處理器與LCD顯示屏的接口
顯示驅(qū)動(dòng)硬件主要由嵌入式LCD控制器、微處理器與LCD顯示屏的接口等部分構(gòu)成。
圖5所示為PXA270微處理器與LCD接口原理圖。由于PXA270集成了LCD控制單元,這使LCD接口的設(shè)計(jì)變得十分簡(jiǎn)單。只須電氣連接,無(wú)須外擴(kuò)LCD控制芯片。
L_DD[15:O]:像素點(diǎn)16位數(shù)據(jù)線,使用5紅、6綠和5藍(lán)實(shí)現(xiàn)不同顏色的顯示,而TFT-LCD紅、綠、藍(lán)均有6個(gè)引腳,故將B0、R0接地。LCD的顯示效果與功耗在很大程度上決定于背光源,因而需對(duì)其進(jìn)行控制。地址線SA-A[20-22]作為譯碼輸入,基地址為Ox0800_0000 的片選信號(hào)nCS2選中74LCXl38譯碼器,讓74LCXl38的輸出引腳Y0產(chǎn)生脈沖上升沿,驅(qū)動(dòng)LCX374鎖存來(lái)自數(shù)據(jù)總線的低8位數(shù)據(jù),只要在數(shù)據(jù)總線上輸出Ox80,則可通過(guò)Q7使LCD-BACK-0N/0FF輸出高電平,控制LCD背光源打開。
5 軟件設(shè)計(jì)
軟件主要由嵌入式操作系統(tǒng)與應(yīng)用軟件兩部分構(gòu)成,在應(yīng)用軟件中完成對(duì)LCD的驅(qū)動(dòng)。本文采用Linux-2.4.19作為軟件平臺(tái),程序的交叉編譯使用arm-linux-gcc,其中Linux-2.4.19-rmk6-pxal-cerf1內(nèi)核能穩(wěn)定地支持PXA270處理器,因Linux的源代碼開放,將其下載后只需根據(jù)自己的硬件配置對(duì)內(nèi)核中的現(xiàn)有代碼與驅(qū)動(dòng)進(jìn)行裁剪、修改、移植或編寫部分驅(qū)動(dòng)。PXA270對(duì)LCD顯示屏的驅(qū)動(dòng)分為兩個(gè)方面:一是對(duì)LCD控制器及相關(guān)部件的初始化,包括創(chuàng)建Frame Buffer、寄存器組與DMA通道的設(shè)置等;二是對(duì)Frame Buffer的讀、寫等操作[3、4、5]。
5.1 定義顯示緩沖區(qū)
Linux下的LCD驅(qū)動(dòng)屬于字符設(shè)備驅(qū)動(dòng)范圍,PXA270處理器與LCD間數(shù)據(jù)傳輸也非常頻繁,因而在內(nèi)存中定義一個(gè)“顯示緩沖區(qū)”Frame Buffer,形成一個(gè)虛擬的顯示器,具體位置在Linuxdriversvideo下。Frame Buffer的大小=每像素位數(shù)*每屏行數(shù)*(每行像素+每行需插入的空像素)/8。本系統(tǒng)中LCD分辨率為640*480,16位/像素,單屏幕模式,F(xiàn)rame Buffer理論值為614400個(gè)字節(jié),實(shí)際設(shè)置640KB。
5.2 初始化函數(shù)的編寫
在linux的/drivers/video/pxafb.c文件中,通過(guò)fb_options()和pxafb_setup()函數(shù)來(lái)獲取內(nèi)核的啟動(dòng)參數(shù)并返回pxafb_driver結(jié)構(gòu),該結(jié)構(gòu)中pxafb_probe是一個(gè)函數(shù)指針,指向pxafb_probe()函數(shù),在該函數(shù)中完成對(duì) LCD控制器和Frame Buffer等的整個(gè)初始化過(guò)程,初始化函數(shù)部分代碼如下:
struct pxafb_info * fbi; //數(shù)據(jù)結(jié)構(gòu)pxafb_info,主要用于Frame Buffer設(shè)備及其操作驅(qū)動(dòng)框架的參數(shù)定義,如Frame Buffer的物理和虛擬地址、DMA和一些LCD控制寄存器描述參數(shù)等
struct pxafb_mach_info * inf; //數(shù)據(jù)結(jié)構(gòu)pxafb_mach_info,定義運(yùn)行機(jī)器的一些參數(shù),如pixclock、xres、yres等
pxafb_backlight_power = inf->pxafb_backlight_power; //LCD背光
pxafb_lcd_power = inf->pxafb_lcd_power; //LCD電源
fbi = pxafb_init_fbinfo(dev); //完成數(shù)據(jù)結(jié)構(gòu)pxafb_info和pxafb_mach_info的初始化,設(shè)置使用的字體、顯示屏的規(guī)格等LCD硬件參數(shù)并保存到其中
ret = pxafb_map_video_memory(fbi); //根據(jù)LCD硬件參數(shù)在內(nèi)存創(chuàng)建顯示緩沖區(qū)
pxa_set_cken(CKEN16_LCD,1); //時(shí)鐘使能寄存器CKEN可使能許多外設(shè)單元的時(shí)鐘,其bit16置1使能LCD單元時(shí)鐘
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)LCD顯示屏相關(guān)文章:lcd顯示屏原理
lcd相關(guān)文章:lcd原理
評(píng)論