|
隨著高性能嵌入式處理器的普及以及硬件成本的降低,特別是ARM系列處理器的不斷推出,嵌入式系統的功能不斷增強,嵌入式系統的應用領域也不斷擴大。為了更好地操作系統,顯示系統工作狀況,需要使用液晶實時顯示。然而在嵌入式系統的液晶驅動方面,不同的嵌入式硬件對應的驅動程序編寫方法卻千差萬別。S3C2410X是三星公司生產的基于ARM920T內核的RISC處理器,主頻高達203 MHz,內部集成了具有通用性的LCD控制器,支持STN和TFT液晶顯示。
本文的研究內容源于一個正在開發的無線監控網絡系統,該系統主要用來控制大田的灌溉,有3種工作方式:定時、定量和按邏輯條件工作,并能根據外在環境的變化做出相應的決策。同時,系統還能實時顯示系統工作狀況,并可以在系統界面上設置系統工作參數。為了實現該系統,采用合肥華恒公司生產的2410開發板作為主機,采用PD064VT5作為顯示屏,分辨率為640×480。該顯示屏采用18 b數據信號,能顯示262 144色。本文從硬件和軟件2個方面詳細介紹液晶顯示驅動程序的實現,給出了一種在Linux操作系統下編寫液晶驅動的比較通用的方法。
1 系統硬件電路設計
1.1 LCD控制器
LCD控制器提供CPU應用處理機與被動(STN)或主動(TFT)平板顯示器的接口,其主要功能是產生顯示驅動信號,進而控制LCD的顯示。在驅動LCD設計的過程中首先配置LCD控制器。在配置LCD控制器時需要正確的設置:顯示方式(主動或被動顯示)、顯示類型(彩色或單色)、各種時鐘信號、每行及每列的像點數以及每個像點的位數參數,然后則是幀緩沖區的指定,用戶所要顯示的數據都是從該緩沖區中讀出,再顯示到屏幕上的。隨著技術的發展,現在的嵌入式處理器(片上系統)一般都集成LCD控制器,如本系統采用的ARM上就集成LCD控制器。集成LCD控制器的片上系統的基本體系結構如圖1所示。

在圖1中,處理器內核是整個片上系統的核心,如本系統的ARM內核。系統總線是指處理器內部的總線,如ARM著名的AMBA總線,其他片上系統的外設都通過總線和處理器連接。在LCD控制器工作時,通過DMA請求占用系統總線,直接通過SDRAM控制器讀取SDRAM中指定地址(顯示緩沖區)的數據。此數據通過LCD控制器轉換成液晶屏掃描數據的格式,驅動液晶屏顯示。這種模式是集成了LCD控制器的嵌入式處理器普遍使用的方式,其優點是:通過利用系統的SDRAM控制器,使顯示緩沖和系統共享RAM空間,處理器可以直接讀/寫顯示緩沖區;節省額外的顯示緩存控制器和昂貴的顯示緩存。
1.2 S3C2410X內部LCD控制器管腳
S3C2410X具有內置的LCD控制器,該控制器提供如下外部接口信號:
VFRAME:LCD控制器和LCD驅動器之間的幀同步信號。它通知LCD屏新的1幀的顯示,LCD控制器在一個完整幀的顯示后發出VFRAME信號。
VLINE:LCD控制器和LCD驅動器之間的線同步脈沖信號,它用于LCD驅動器將行移位寄存器的內容傳送給LCD屏顯示。LCD控制器在整行數據移入LCD控制器后,插入一個VLINE信號。
VCLK:LCD控制器和LCD驅動器之間的像素時鐘信號。由LCD控制器送出的數據在VCLK的上升沿處送出,在VCLK的下降沿處被LCD驅動器采樣。
VM:LCD驅動器的AC信號。VM信號被LCD驅動器用于改變行和列的電壓極性,從而控制像點的顯示或熄滅。VM信號可以與每個幀同步,也可以與可變數量的VLINE信號同步。
VD[23:0]:視頻數據信號。PD064VT5是一個具有31管腳的液晶屏,根據工作方式的不同有不同的連接方式,圖2是該液晶屏工作在分辨率為640×480時與S3C2410X的連接圖。
1.3 S3C2410X內部LCD控制器
LCD控制器由REGBANK,LCDCDMA,VIDPRCS,TIMEGEN和LPC3600組成,如圖3所示。REGBANK有17個可編程寄存器組和256X16的調色板存儲器,用來設定LCD控制器。LCDCDMA是一個專用DMA,自動從幀存儲器傳輸視頻數據到LCD控制器,用這個特殊的DMA,視頻數據可不經過CPU干涉就顯示在屏幕上。VIDPRCS接收從LCDCDMA來的視頻數據并在將其改變到合適數據格式后經VD[23:0]將之送到LCD驅動器,如4/8單掃描或4雙掃描顯示模式。TIMEGEN由可編程邏輯組成,以支持不同LCD驅動器的接口時序和速率的不同要求。TIMEGEN產生VFRAME,VLINE,VCLK,VM信號等。

1.4 S3C2410X內部LCD控制寄存器
S3C2410X的LCD控制器內有5個寄存器,分別為LCDCON1,LCDCON2,LCDCON3,LCDCON4,LCDCON5。這些寄存器的設置可以參見參考文獻[2]。在本系統中,液晶屏PD064VT5的相關時間時間參數以及時序圖分別如表1和圖4所示。為了使液晶屏正確顯示,需要相應的設定寄存器的值。為此,得到如下關鍵參數:
HSPW=96 HBPD=48 HFPD=16 VSPW=2 VBPD=33 VFPD=10 CLKVAL=4
同時將PNRMODE設為3,表示所用模塊是TFT型;BPPMODE設為12,表示采用16 bpp輸出,選擇FRM565視頻輸出數據的格式。
2 系統軟件設計
本系統中,采用的操作系統內核版本為2.4.20-8,并采用北京飛漫公司的MINIGUI軟件進行系統界面的開發。由于在Linux2.2.XX之后內核版本中出現了一種驅動程序接口幀緩沖(Frame Buffer),因而LCD設備的驅動程序必須采用Linux的幀緩沖設備來處理與LCD控制器的底層命令。


幀緩沖設備對圖像硬件設備進行抽象化處理,使應用軟件可以通過定義明確的界面訪問圖像硬件設備,從而使軟件無需了解涉及硬件底層驅動的細節就可以直接對顯示緩沖區進行讀寫和I/O控制等操作。在通常情況下,驅動程序都為應用程序提供了專門的設備節點來訪問該設備,如:/dev/fb0。用戶可以將它看成是顯示內存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而讀寫操作可以立即反應到LCD上。同時Linux支持多個幀緩沖設備,最多可達32個,即/dev/fb0~/dev/fb31,其主設備號都為29,次設備號分別對應與0~31,缺省情況下的幀緩沖設備是/dev/fb0。
幀緩沖的實現分為2個方面:對LCD及其相關部件的初始化;對畫面緩沖區的讀寫,具體到代碼為read,write,lseek等系統接口的調用。基于幀緩沖的完整驅動程序就是以上兩方面的實現。由于在Linux的發布版本中,包含了大量的設備驅動程序源代碼,例如drivers/video下提供了多種顯示卡的幀緩沖驅動程序,這就省去了上層接口調用程序的工作,只需要針對所用的LCD模塊的類型以及接口時序,修改驅動程序中與底層相關的內容,即可得到自己的驅動程序。
與Linux的幀緩沖相關的代碼在linux/drivers/video下,打開該路徑后在目錄下有一個名為S3C2410fb.c的文件,這個文件就是支持S3C2410X的幀緩沖驅動源文件,同時其定義了與底層相關的參數。根據上面對LCD控制器的分析結果,將該文件修改如下:

將修改后的驅動程序加入內核,然后重新編譯內核。將新編譯的Linux內核映像文件燒寫到FLASH中,然后重新啟動系統,就可以在LCD屏幕上顯示圖片以及圖形界面。系統運行效果如圖5所示。

3 結語
本文對S3C2410X的LCD內部控制器及其管腳做了詳細的介紹,并給出具體的硬件連接圖。同時也詳細介紹Linux的驅動原理,并給出相應的軟件實現。經過上述方法實現的設備驅動程序,可以很好地顯示本系統中的示例程序,在系統中穩定的運行。如需要改變液晶顯示器的型號,只要根據具體的液晶要求,搭建相應的硬件實現電路,然后根據上面的介紹,編寫相應的驅動顯示程序,修改相應的寄存器參數,即可很成功地點亮你所選擇的液晶屏. |