謝 聰
(武漢船舶通信研究所 武漢 430079)
通信顯示終端是通信系統(tǒng)及設(shè)備的重要組成部分,通常具有一定的信息處理能力和對外通信網(wǎng)絡(luò)接口,提供相關(guān)設(shè)備信息的顯示功能以及人機交互功能。目前觸屏顯示設(shè)備主要基于X86系列處理器,其驅(qū)動及應(yīng)用軟件系統(tǒng)與PC系統(tǒng)類似具有良好的復(fù)用性只需部署即可使用,作為通信設(shè)備的顯示終端為兼顧系統(tǒng)穩(wěn)定性、低功耗、小型化等特性,為此需選用嵌入式處理器開發(fā)通信智能控制顯示終端,來更好的滿足上述要求,但在嵌入式終端設(shè)備的軟件平臺及系統(tǒng)應(yīng)用方面沒有成熟的商業(yè)化平臺,因此,通用通信智能控制顯示終端的軟件系統(tǒng)開發(fā)是設(shè)備實現(xiàn)的關(guān)鍵,而底層的驅(qū)動開發(fā)及移植是實現(xiàn)的軟件基礎(chǔ)。本文主要就通信領(lǐng)域的智能控制顯示終端的觸屏顯示設(shè)備的LCD原理及其驅(qū)動開發(fā)等方面進行了詳細介紹,重點分析了終端設(shè)備顯示控制器的寄存器設(shè)置以及控制器顯示模塊的驅(qū)動實現(xiàn)方法,結(jié)合選型的工業(yè)液晶屏?xí)r序要求在嵌入式系統(tǒng)上進行移植和測試驗證,為實現(xiàn)具有自主可控的智能通信控制顯示終端及平臺提供基礎(chǔ)支撐和技術(shù)保障。
TFT-LCD(薄膜晶體管液晶顯示器),成為目前最為主流的液晶顯示器類型,廣泛應(yīng)用于桌面顯示器、筆記本電腦和眾多嵌入式設(shè)備中。邏輯上顯示屏所顯示的一幅完整畫面即一個幀(frame),在系統(tǒng)內(nèi)存中用一段存儲空間(幀緩沖設(shè)備)與整個顯示區(qū)域?qū)?yīng),應(yīng)用通過改變該幀緩沖(FrameBuffer)的內(nèi)容,從而改變顯示屏的顯示內(nèi)容;顯示屏上的每一像素點都與幀緩沖設(shè)備里的某一位置對應(yīng),鑒于計算機顯示的顏色是通過RGB值來表示的,則必須給出相應(yīng)的幀緩沖中RGB碼值來實現(xiàn)顯示屏在屏幕某一像素點顯示某種顏色的效果[1~2]。物理上TFT-LCD液晶屏由顯示屏、信號驅(qū)動部件、背光源等組成,其最重要的信號驅(qū)動部件由LCD控制器、LCD時序控制器、源驅(qū)動器/柵極驅(qū)動器構(gòu)成,目前LCD控制器多集成在處理器中,專門用于液晶屏的接口,可以獨立地對屏提供同步時序信號和顯示數(shù)據(jù)信號;時序控制器是信號驅(qū)動部件中負責(zé)時序管理的控制單元,它直接控制著屏中的驅(qū)動部件(LCD驅(qū)動器)保證其輸出正確的控制時序,實現(xiàn)LCD控制器與LCD驅(qū)動器間的信號時序轉(zhuǎn)換功能;LCD驅(qū)動器主要用來生成屏所需要的各種驅(qū)動信號,分為柵極驅(qū)動器(Gate Driver)和源驅(qū)動器(Source Driver)[3],其物理組成框圖見圖1。
圖1 顯示屏物理組成示意框圖
一般LCD驅(qū)動器所需要的輸入時序信號眾多,且不同的LCD驅(qū)動器所需要的輸入時序信號不盡相同,以下信號是所有LCD驅(qū)動器所必需的,如表1。
表1 LCD信號功能表
本文涉及的通信終端采用目前主流ARM Cor?tex處理器、液晶觸摸顯示屏、嵌入式Linux操作系統(tǒng)等構(gòu)建顯示終端基礎(chǔ)平臺,為上層基于QT等GUI工具開發(fā)的通信監(jiān)控應(yīng)用提供運行環(huán)境。
2.2.1 硬件組成
硬件平臺采用三星公司的S5PV210芯片為微處理器,S5PV210采用的是主頻可達到1G Hz的ARM Cortex-A8內(nèi)核,具有64/32位內(nèi)部總線結(jié)構(gòu),32/32KB的數(shù)據(jù)/指令一級緩存,512KB的二級緩存,可實現(xiàn)每秒2億條指令集的運算能力。支持XGA(1027*768)級別LCD顯示,其內(nèi)置LCD控制器可以傳輸顯示數(shù)據(jù)和產(chǎn)生控制信號,接口包含行掃/時鐘/使能控制信號和RGB數(shù)據(jù)信號,通過I2C和中斷腳方式支持電容和電阻屏[4~6];液晶屏選用日立工業(yè)屏KOE TX18D200VM0EAA,它是由JDI公司生產(chǎn)的5寸TFT類型的LCD,支持VGA接口,4:3格式,分辨率為640*480像素,262K色(R、G、B 6BIT),顯示響應(yīng)時間不大于45ms[7]。
2.2.2 基礎(chǔ)軟件組成
底層基礎(chǔ)軟件基于嵌入式Linux內(nèi)核和Fram?buffer機制進行驅(qū)動設(shè)計與移植。
LCD上一副畫面稱為一幀,每幀由多個行組成,多個像素組成了一行,多位(bit)數(shù)據(jù)組成了每個像素的顏色。對于262K色的KOE TX13D200VM5BAA LCD,每個像素由18bit來表示R、G、B各6bit,稱為18BPP。當(dāng)VSYNC信號到來,顯示器從屏幕的最左上方開始,從左往右一行行的顯示每個像素的數(shù)據(jù),當(dāng)顯示到一行最右邊時,HSYNC信號到來,隨即跳到下一行的最左邊開始顯示下一行;當(dāng)所有行顯示完后,VSYNC信號重新到來,跳到最左上方顯示下一幀[8]。
通常LCD控制器支持多種幀緩沖區(qū)的內(nèi)存格式,如:25BPP Display(A888)、32BPP(8888)、24BPP Display(A887)、24BPP Display(888)等,實際上在Linux驅(qū)動程序里用得比較多的是32BPP(8888)的內(nèi)存格式組織圖象數(shù)據(jù),即用32位數(shù)據(jù)來表示一個像素的顏色,每種原色(R、G、B)使用8位,還有8位分配給ALPHA。(ALPHA用于實現(xiàn)圖形漸變效果、半透明效果:0xff全透明0x00不透明)其32BPP(8888)格式在內(nèi)存中像素的排列格式如表2。
表2 32BPP內(nèi)存格式WSWP無效
控制器中的VDMA自動地從幀緩沖區(qū)中獲取視頻數(shù)據(jù)(如上述的32BPP(8888)內(nèi)存格式),再由VPRCS接受來自VDMA的視頻數(shù)據(jù)后并將它們組合成指定的數(shù)據(jù)格式(例如24bpp或16bpp模式),經(jīng)由控制器數(shù)據(jù)端口(RGB_VD,or SYS_VD)發(fā)送到LCD顯示,像素顏色值與VD[23:0]引腳的對應(yīng)關(guān)系。
結(jié)合文獻[9]中介紹時序關(guān)系,LCD屏根據(jù)其時序設(shè)置,按這些信號有序并不停地讀取總線數(shù)據(jù)并顯示;
通過設(shè)置S5PV210的顯示控制器的寄存器,配置顯示緩沖區(qū)、時序、窗口、坐標等參數(shù)后,便可將所顯示的內(nèi)容從顯示緩沖區(qū)中讀出屏中顯示[10],其寄存器說明見表3。
表3 CPU顯控寄存器組成表
寄存器的配置在操作系統(tǒng)內(nèi)核中文件路徑為
/drivers/video/samsung/S3cfb_fimd6x.c中實現(xiàn)。其具體相關(guān)實現(xiàn)函數(shù)如下:
函數(shù)s3cfb_set_output:配置VIDCON0寄存器,實現(xiàn)視頻控制器的輸出格式(RGB);
函數(shù)s3cfb_set_display_mode:配置 VIDCON0寄存器,實現(xiàn)RGB的模式(Parallel RGB);
函數(shù) s3cfb_set_timing:配置VIDTCON0、VIDT?CON1寄存器,根據(jù)實際LCD的時序圖設(shè)定VBPDE(YVU)、VBPD 、VFPD、VSPW、VFPDE(YVU)、HB?PD、HFPD、HSPW;
函 數(shù) s3cfb_set_window_position:配 置 VI?DOSD0C和VIDOSD0B寄存器,設(shè)置窗口的左上角和右下角的位置;
函數(shù)s3cfb_set_window_size:配置 VIDOSD0C寄存器,設(shè)置窗口的大?。℉eight*Width);
函數(shù)s3cfb_set_buffer_size:配置VIDWxxADD2寄存器,設(shè)置虛擬屏幕的頁寬度(字節(jié))。
幀緩沖設(shè)備驅(qū)動采用分層的設(shè)計方式,在內(nèi)核空間里第一層是對幀緩沖設(shè)備文件層接口file_op?erations結(jié)構(gòu)體進行填充(代碼實現(xiàn)在/drivers/video/fbmem.c),它向用戶空間提供/dev/fb*設(shè)備的訪問接口,用戶空間通過它繪制圖形。在內(nèi)核空間里第二層是對幀緩沖設(shè)備驅(qū)動層接口fb_info結(jié)構(gòu)體進行填充(代碼實現(xiàn)在/drivers/video/samsung/s3cfb.c),這是與架構(gòu)相關(guān)代碼,初始化LCD控制器,注冊/注銷幀緩沖設(shè)備等,其中fb_ops結(jié)構(gòu)體中的成員函數(shù)實現(xiàn)對LCD控制器硬件寄存器操作[11],具體示意圖見圖2。
圖2 函數(shù)組成圖
幀緩沖設(shè)備驅(qū)動最重要的數(shù)據(jù)結(jié)構(gòu)有定義在/include/linux/fb.h文件中的 fb_info、fb_var_screenin?fo、fb_fix_screeninfo、fb_ops等結(jié)構(gòu),以及定義在/linux/drivers/vedio/fbmem.c文件中的file_operations結(jié)構(gòu)。
圖3 LCD初始化流程示意
fb_info結(jié)構(gòu)中描述了幀緩沖設(shè)備全部內(nèi)容,例如屬性、狀態(tài)和操作等,每個幀緩沖設(shè)備都有一個對 應(yīng) 的 fb_info結(jié) 構(gòu) ,fb_var_screeninfo、fb_fix_screeninfo、fb_ops都包含在該結(jié)構(gòu)中。其中fb_var_screeninfo結(jié)構(gòu)描述了用戶可修改的顯示控制器參數(shù),包括LCD分辨率、BPP、內(nèi)存中像素顏色組織方式和時序參數(shù)等;fb_fix_screeninfo結(jié)構(gòu)描述了用戶不能修改的顯示控制器參數(shù),包括屏幕緩沖區(qū)的物理地址、長度等,該結(jié)構(gòu)的成員需要在驅(qū)動程序中初始化和設(shè)置,其初始化過程見圖3;fb_ops結(jié)構(gòu)是指向底層操作的函數(shù)指針結(jié)構(gòu)體,它類似于file_operations結(jié)構(gòu)實現(xiàn)文件設(shè)備操作;file_opera?tions結(jié)構(gòu)是幀緩沖設(shè)備驅(qū)動的文件層操作接口[12]。在s3cfb_probe函數(shù)中,描述了LCD驅(qū)動實現(xiàn)的全部內(nèi)容。s3cfb_lcd是描述LCD屏密切相關(guān)參數(shù)的結(jié)構(gòu)體,在arch/arm/mach-s5pv210/mini210-lcds.c中實現(xiàn),mini210_machine_init函數(shù)(定義在arch/arm/mach-s5pv210/mach-mini210.c),通 過 調(diào) 用mini210_get_lcd完成LCD屏密切相關(guān)參數(shù)的傳遞,那么移植LCD驅(qū)動的關(guān)鍵內(nèi)容就在于修改s3cfb_lcd結(jié)構(gòu)中的成員。s3cfb_lcd結(jié)構(gòu)如下:
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;
};
根據(jù)KOE TX13D200VM5BAA LCD屏的時序、像素、BPP、極性、頻率等參數(shù),在arch/arm/mach-s5pv210/mini210-lcds.c中增加如下內(nèi)容:
static struct s3cfb_lcd wvga_s70={
.width=640,
.height=480,
.p_width=102,//LCD屏的有效區(qū)域,非物理尺寸
.p_height=77,//LCD屏的有效區(qū)域,非物理尺寸
.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,//下降沿鎖寸數(shù)據(jù)(此參數(shù)是數(shù)據(jù)圖象清晰的關(guān)鍵參數(shù))
.inv_hsync=0,
.inv_vsync=0,
.inv_vden=0,
}
}
完成以上內(nèi)核代碼修改后,必須完成編譯才能進行測試。由于移植LCD屏并沒有涉及到驅(qū)動結(jié)構(gòu)的變動,所以勿需修改Makefile、Kconfig文件,執(zhí)行“make menuconfig”,出現(xiàn)配置內(nèi)核界面,在主菜單里選擇<Exit>退出,輸入以下命令,開始編譯內(nèi)核:#make zImage,編譯結(jié)束后,會在arch/arm/boot目錄下生成linux內(nèi)核映象文件:zImage。
將編譯好的LCD設(shè)備驅(qū)動下載到目標板,編寫應(yīng)用測試程序lcd_test;進入測試程序源代碼目,使用命令行進行手工交叉編譯測試程序,生成lcd_test可執(zhí)行文件:
#arm-linux-gcc-o lcd_test lcd_test.c
通過FTP,將編譯好的可執(zhí)行文件下載到目標板。進入目標板上可執(zhí)行文件所
測試結(jié)果如下圖,打開了5個FB,使用了透明度功能,5個窗口疊加效果如下在的目錄,改變可執(zhí)行文件屬性:
#chmod+x lcd_test
執(zhí)行文件:./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幀緩沖架構(gòu)在嵌入式Linux顯示中已廣泛應(yīng)用,幀緩沖創(chuàng)建的不僅僅是面底層設(shè)備和上層應(yīng)用的抽象,更是一種設(shè)計思想架構(gòu)與應(yīng)用模型,本文通過分析LCD屏以及控制器的原理、特點,結(jié)合嵌入式通信應(yīng)用環(huán)境提出基于最新ARM-CcortexA8架構(gòu)LCD控制器和觸屏的驅(qū)動移植開發(fā)方法,并在實際工作中有所應(yīng)用與實現(xiàn),隨著后續(xù)研發(fā)實現(xiàn)此驅(qū)動開發(fā)方法和相關(guān)技術(shù)適用于多種智能顯示終端的設(shè)計實現(xiàn),具有較好的技術(shù)推廣和應(yīng)用價值。
圖4 LCD顯示圖型
[1]馮國進.嵌入式Linux驅(qū)動程序設(shè)計從入門到精通[M].北京:清華大學(xué)出版社,2008:151-168.
[2]吳利剛.基于ARM驅(qū)動TFT-LCD模塊研究與應(yīng)用[D].汕頭:汕頭大學(xué),2011:8-15.
[3]王珊.TFT-LCD顯示芯片的驅(qū)動設(shè)計與研究[D].西安:西安電子科技大學(xué),2014:9-16.
[4]葛耿育.S5PV210微處理器的啟動過程分析[J].計算機工程應(yīng)用技術(shù),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應(yīng)用開發(fā)[M].北京:人民郵電出版社,2008:200-201.
[9]王永濤,虞闖.嵌入式LCD裸機驅(qū)動設(shè)計與實現(xiàn)[J].沈陽理工大學(xué)學(xué)報,2016,35(6):3-4.
[10]友善之臂.Linux平臺下Mini210s裸機程序開發(fā)指南[EB/OL].http://www.arm9home.net,2012-10.
[11]陳磊.基于CK-CPU嵌入式平臺的LCD驅(qū)動的開發(fā)與實現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2012:23-29.
[12]楊斌斌.嵌入式Linux設(shè)備驅(qū)動程序的研究與開發(fā)[D].太原:太原理工大學(xué),2009:53-59.