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