謝 聰
(武漢船舶通信研究所 武漢 430079)
通信顯示終端是通信系統及設備的重要組成部分,通常具有一定的信息處理能力和對外通信網絡接口,提供相關設備信息的顯示功能以及人機交互功能。目前觸屏顯示設備主要基于X86系列處理器,其驅動及應用軟件系統與PC系統類似具有良好的復用性只需部署即可使用,作為通信設備的顯示終端為兼顧系統穩定性、低功耗、小型化等特性,為此需選用嵌入式處理器開發通信智能控制顯示終端,來更好的滿足上述要求,但在嵌入式終端設備的軟件平臺及系統應用方面沒有成熟的商業化平臺,因此,通用通信智能控制顯示終端的軟件系統開發是設備實現的關鍵,而底層的驅動開發及移植是實現的軟件基礎。本文主要就通信領域的智能控制顯示終端的觸屏顯示設備的LCD原理及其驅動開發等方面進行了詳細介紹,重點分析了終端設備顯示控制器的寄存器設置以及控制器顯示模塊的驅動實現方法,結合選型的工業液晶屏時序要求在嵌入式系統上進行移植和測試驗證,為實現具有自主可控的智能通信控制顯示終端及平臺提供基礎支撐和技術保障。
TFT-LCD(薄膜晶體管液晶顯示器),成為目前最為主流的液晶顯示器類型,廣泛應用于桌面顯示器、筆記本電腦和眾多嵌入式設備中。邏輯上顯示屏所顯示的一幅完整畫面即一個幀(frame),在系統內存中用一段存儲空間(幀緩沖設備)與整個顯示區域對應,應用通過改變該幀緩沖(FrameBuffer)的內容,從而改變顯示屏的顯示內容;顯示屏上的每一像素點都與幀緩沖設備里的某一位置對應,鑒于計算機顯示的顏色是通過RGB值來表示的,則必須給出相應的幀緩沖中RGB碼值來實現顯示屏在屏幕某一像素點顯示某種顏色的效果[1~2]。物理上TFT-LCD液晶屏由顯示屏、信號驅動部件、背光源等組成,其最重要的信號驅動部件由LCD控制器、LCD時序控制器、源驅動器/柵極驅動器構成,目前LCD控制器多集成在處理器中,專門用于液晶屏的接口,可以獨立地對屏提供同步時序信號和顯示數據信號;時序控制器是信號驅動部件中負責時序管理的控制單元,它直接控制著屏中的驅動部件(LCD驅動器)保證其輸出正確的控制時序,實現LCD控制器與LCD驅動器間的信號時序轉換功能;LCD驅動器主要用來生成屏所需要的各種驅動信號,分為柵極驅動器(Gate Driver)和源驅動器(Source Driver)[3],其物理組成框圖見圖1。

圖1 顯示屏物理組成示意框圖
一般LCD驅動器所需要的輸入時序信號眾多,且不同的LCD驅動器所需要的輸入時序信號不盡相同,以下信號是所有LCD驅動器所必需的,如表1。

表1 LCD信號功能表
本文涉及的通信終端采用目前主流ARM Cor?tex處理器、液晶觸摸顯示屏、嵌入式Linux操作系統等構建顯示終端基礎平臺,為上層基于QT等GUI工具開發的通信監控應用提供運行環境。
2.2.1 硬件組成
硬件平臺采用三星公司的S5PV210芯片為微處理器,S5PV210采用的是主頻可達到1G Hz的ARM Cortex-A8內核,具有64/32位內部總線結構,32/32KB的數據/指令一級緩存,512KB的二級緩存,可實現每秒2億條指令集的運算能力。支持XGA(1027*768)級別LCD顯示,其內置LCD控制器可以傳輸顯示數據和產生控制信號,接口包含行掃/時鐘/使能控制信號和RGB數據信號,通過I2C和中斷腳方式支持電容和電阻屏[4~6];液晶屏選用日立工業屏KOE TX18D200VM0EAA,它是由JDI公司生產的5寸TFT類型的LCD,支持VGA接口,4:3格式,分辨率為640*480像素,262K色(R、G、B 6BIT),顯示響應時間不大于45ms[7]。
2.2.2 基礎軟件組成
底層基礎軟件基于嵌入式Linux內核和Fram?buffer機制進行驅動設計與移植。
LCD上一副畫面稱為一幀,每幀由多個行組成,多個像素組成了一行,多位(bit)數據組成了每個像素的顏色。對于262K色的KOE TX13D200VM5BAA LCD,每個像素由18bit來表示R、G、B各6bit,稱為18BPP。當VSYNC信號到來,顯示器從屏幕的最左上方開始,從左往右一行行的顯示每個像素的數據,當顯示到一行最右邊時,HSYNC信號到來,隨即跳到下一行的最左邊開始顯示下一行;當所有行顯示完后,VSYNC信號重新到來,跳到最左上方顯示下一幀[8]。
通常LCD控制器支持多種幀緩沖區的內存格式,如:25BPP Display(A888)、32BPP(8888)、24BPP Display(A887)、24BPP Display(888)等,實際上在Linux驅動程序里用得比較多的是32BPP(8888)的內存格式組織圖象數據,即用32位數據來表示一個像素的顏色,每種原色(R、G、B)使用8位,還有8位分配給ALPHA。(ALPHA用于實現圖形漸變效果、半透明效果:0xff全透明0x00不透明)其32BPP(8888)格式在內存中像素的排列格式如表2。

表2 32BPP內存格式WSWP無效
控制器中的VDMA自動地從幀緩沖區中獲取視頻數據(如上述的32BPP(8888)內存格式),再由VPRCS接受來自VDMA的視頻數據后并將它們組合成指定的數據格式(例如24bpp或16bpp模式),經由控制器數據端口(RGB_VD,or SYS_VD)發送到LCD顯示,像素顏色值與VD[23:0]引腳的對應關系。
結合文獻[9]中介紹時序關系,LCD屏根據其時序設置,按這些信號有序并不停地讀取總線數據并顯示;
通過設置S5PV210的顯示控制器的寄存器,配置顯示緩沖區、時序、窗口、坐標等參數后,便可將所顯示的內容從顯示緩沖區中讀出屏中顯示[10],其寄存器說明見表3。

表3 CPU顯控寄存器組成表
寄存器的配置在操作系統內核中文件路徑為
/drivers/video/samsung/S3cfb_fimd6x.c中實現。其具體相關實現函數如下:
函數s3cfb_set_output:配置VIDCON0寄存器,實現視頻控制器的輸出格式(RGB);
函數s3cfb_set_display_mode:配置 VIDCON0寄存器,實現RGB的模式(Parallel RGB);
函數 s3cfb_set_timing:配置VIDTCON0、VIDT?CON1寄存器,根據實際LCD的時序圖設定VBPDE(YVU)、VBPD 、VFPD、VSPW、VFPDE(YVU)、HB?PD、HFPD、HSPW;
函 數 s3cfb_set_window_position:配 置 VI?DOSD0C和VIDOSD0B寄存器,設置窗口的左上角和右下角的位置;
函數s3cfb_set_window_size:配置 VIDOSD0C寄存器,設置窗口的大小(Height*Width);
函數s3cfb_set_buffer_size:配置VIDWxxADD2寄存器,設置虛擬屏幕的頁寬度(字節)。
幀緩沖設備驅動采用分層的設計方式,在內核空間里第一層是對幀緩沖設備文件層接口file_op?erations結構體進行填充(代碼實現在/drivers/video/fbmem.c),它向用戶空間提供/dev/fb*設備的訪問接口,用戶空間通過它繪制圖形。在內核空間里第二層是對幀緩沖設備驅動層接口fb_info結構體進行填充(代碼實現在/drivers/video/samsung/s3cfb.c),這是與架構相關代碼,初始化LCD控制器,注冊/注銷幀緩沖設備等,其中fb_ops結構體中的成員函數實現對LCD控制器硬件寄存器操作[11],具體示意圖見圖2。

圖2 函數組成圖
幀緩沖設備驅動最重要的數據結構有定義在/include/linux/fb.h文件中的 fb_info、fb_var_screenin?fo、fb_fix_screeninfo、fb_ops等結構,以及定義在/linux/drivers/vedio/fbmem.c文件中的file_operations結構。

圖3 LCD初始化流程示意
fb_info結構中描述了幀緩沖設備全部內容,例如屬性、狀態和操作等,每個幀緩沖設備都有一個對 應 的 fb_info結 構 ,fb_var_screeninfo、fb_fix_screeninfo、fb_ops都包含在該結構中。其中fb_var_screeninfo結構描述了用戶可修改的顯示控制器參數,包括LCD分辨率、BPP、內存中像素顏色組織方式和時序參數等;fb_fix_screeninfo結構描述了用戶不能修改的顯示控制器參數,包括屏幕緩沖區的物理地址、長度等,該結構的成員需要在驅動程序中初始化和設置,其初始化過程見圖3;fb_ops結構是指向底層操作的函數指針結構體,它類似于file_operations結構實現文件設備操作;file_opera?tions結構是幀緩沖設備驅動的文件層操作接口[12]。在s3cfb_probe函數中,描述了LCD驅動實現的全部內容。s3cfb_lcd是描述LCD屏密切相關參數的結構體,在arch/arm/mach-s5pv210/mini210-lcds.c中實現,mini210_machine_init函數(定義在arch/arm/mach-s5pv210/mach-mini210.c),通 過 調 用mini210_get_lcd完成LCD屏密切相關參數的傳遞,那么移植LCD驅動的關鍵內容就在于修改s3cfb_lcd結構中的成員。s3cfb_lcd結構如下:
struct s3cfb_lcd{
int width;
int height;
int p_width;
int p_height;
int bpp;
int freq;
struct s3cfb_lcd_timing timing;
struct s3cfb_lcd_polarity polarity;
void(*init_ldi)(void);
void(*deinit_ldi)(void);
unsigned long args;
};
根據KOE TX13D200VM5BAA LCD屏的時序、像素、BPP、極性、頻率等參數,在arch/arm/mach-s5pv210/mini210-lcds.c中增加如下內容:
static struct s3cfb_lcd wvga_s70={
.width=640,
.height=480,
.p_width=102,//LCD屏的有效區域,非物理尺寸
.p_height=77,//LCD屏的有效區域,非物理尺寸
.bpp=32,
.freq=60,//刷新率
.timing={
.h_fp=100,
.h_bp=50,
.h_sw=10,
.v_fp=40,
.v_fpe=1,
.v_bp=4,//guess 4
.v_bpe=1,
.v_sw=1,//guess 1
},
.polarity={
.rise_vclk=0,//下降沿鎖寸數據(此參數是數據圖象清晰的關鍵參數)
.inv_hsync=0,
.inv_vsync=0,
.inv_vden=0,
}
}
完成以上內核代碼修改后,必須完成編譯才能進行測試。由于移植LCD屏并沒有涉及到驅動結構的變動,所以勿需修改Makefile、Kconfig文件,執行“make menuconfig”,出現配置內核界面,在主菜單里選擇<Exit>退出,輸入以下命令,開始編譯內核:#make zImage,編譯結束后,會在arch/arm/boot目錄下生成linux內核映象文件:zImage。
將編譯好的LCD設備驅動下載到目標板,編寫應用測試程序lcd_test;進入測試程序源代碼目,使用命令行進行手工交叉編譯測試程序,生成lcd_test可執行文件:
#arm-linux-gcc-o lcd_test lcd_test.c
通過FTP,將編譯好的可執行文件下載到目標板。進入目標板上可執行文件所
測試結果如下圖,打開了5個FB,使用了透明度功能,5個窗口疊加效果如下在的目錄,改變可執行文件屬性:
#chmod+x lcd_test
執行文件:./lcd_test,窗口輸出的信息如下:
open framebuffer ok.
640,480,32bpp
[1511.469789] s3cfb s3cfb: win 0:pmem_start=0x3c331000
[1511.469803] s3cfb s3cfb: [fb0] dma:0x3c331000,cpu:0xe3000000,size:0x00465000
[1511.476159] s3cfb s3cfb: [fb1] dma:0x3a200000,cpu:0xffc00000,size:0x00177000
[1511.485200] s3cfb s3cfb: [fb3] dma:0x39c00000,cpu:0xffa00000,size:0x00177000
[1511.489190] s3cfb s3cfb: [fb4] dma:0x39e00000,cpu:0xff800000,size:0x00177000
set screeninfo ok
draw color ok
show window ok
實際LCD顯示圖型如圖4所示。
LCD屏顯示及Linux幀緩沖架構在嵌入式Linux顯示中已廣泛應用,幀緩沖創建的不僅僅是面底層設備和上層應用的抽象,更是一種設計思想架構與應用模型,本文通過分析LCD屏以及控制器的原理、特點,結合嵌入式通信應用環境提出基于最新ARM-CcortexA8架構LCD控制器和觸屏的驅動移植開發方法,并在實際工作中有所應用與實現,隨著后續研發實現此驅動開發方法和相關技術適用于多種智能顯示終端的設計實現,具有較好的技術推廣和應用價值。

圖4 LCD顯示圖型
[1]馮國進.嵌入式Linux驅動程序設計從入門到精通[M].北京:清華大學出版社,2008:151-168.
[2]吳利剛.基于ARM驅動TFT-LCD模塊研究與應用[D].汕頭:汕頭大學,2011:8-15.
[3]王珊.TFT-LCD顯示芯片的驅動設計與研究[D].西安:西安電子科技大學,2014:9-16.
[4]葛耿育.S5PV210微處理器的啟動過程分析[J].計算機工程應用技術,2017,13(15):220-221.
[5]SamSung Electronics Co.,Ltd.S5PV210 RISC Micropro?cessorS5PV210_UM_REV1.1[EB/OL].http://www.sam?sungsemi.com,2010-5.
[6]劉龍,張云翠,申華.嵌入式Linux軟硬件詳解[M].北京:人民郵電出版社,2015:183-188.
[7] KOE.TX18D200VM0EAASpecifications[R].TaiWan:Kaohsiung Opto-Electronics Inc,2013.
[8]韋東山.嵌入式Linux應用開發[M].北京:人民郵電出版社,2008:200-201.
[9]王永濤,虞闖.嵌入式LCD裸機驅動設計與實現[J].沈陽理工大學學報,2016,35(6):3-4.
[10]友善之臂.Linux平臺下Mini210s裸機程序開發指南[EB/OL].http://www.arm9home.net,2012-10.
[11]陳磊.基于CK-CPU嵌入式平臺的LCD驅動的開發與實現[D].哈爾濱:哈爾濱工業大學,2012:23-29.
[12]楊斌斌.嵌入式Linux設備驅動程序的研究與開發[D].太原:太原理工大學,2009:53-59.