《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于Framebuffer的MCU-LCD驅(qū)動設(shè)計
基于Framebuffer的MCU-LCD驅(qū)動設(shè)計
2014年微型機與應(yīng)用第17期
梁小鷗1,譚 玨2
1.廣東工程職業(yè)技術(shù)學(xué)院,廣東 廣州 510663; 2.廣州海格通信集團(tuán)股份有限公司,廣東 廣州 510663
摘要: Framebuffer在Linux的顯示設(shè)備上起著一個抽象的而又相當(dāng)重要的作用。隨著技術(shù)的發(fā)展,諸多MCU-LCD嵌入式設(shè)備需要支持更多的上層應(yīng)用二次開發(fā)及更友好的UI界面,但是由于MCU-LCD是在早期單片機中使用,對采用了Framebuffer架構(gòu)的內(nèi)核支持不太好。對Framebuffer自身的框架及MCU-LCD的硬件接口進(jìn)行了分析和研究,根據(jù)Framebuffer的架構(gòu)并結(jié)合MCU-LCD自身的特點,在比較了RGB與MCU優(yōu)劣的基礎(chǔ)上,設(shè)計了支持Linux幀緩沖的MCU-LCD設(shè)備驅(qū)動程序結(jié)果,實現(xiàn)了內(nèi)核Framebuffer對MCU-LCD的支持。實際應(yīng)用表明,該設(shè)計對于傳統(tǒng)的MCU-LCD同樣也能與Framebuffer較好地結(jié)合,滿足更友好的界面開發(fā)需求。
Abstract:
Key words :

  摘 要: Framebuffer在Linux的顯示設(shè)備上起著一個抽象的而又相當(dāng)重要的作用。隨著技術(shù)的發(fā)展,諸多MCU-LCD嵌入式設(shè)備需要支持更多的上層應(yīng)用二次開發(fā)及更友好的UI界面,但是由于MCU-LCD是在早期單片機中使用,對采用了Framebuffer架構(gòu)的內(nèi)核支持不太好。對Framebuffer自身的框架及MCU-LCD的硬件接口進(jìn)行了分析和研究,根據(jù)Framebuffer的架構(gòu)并結(jié)合MCU-LCD自身的特點,在比較了RGB與MCU優(yōu)劣的基礎(chǔ)上,設(shè)計了支持Linux幀緩沖的MCU-LCD設(shè)備驅(qū)動程序結(jié)果,實現(xiàn)了內(nèi)核Framebuffer對MCU-LCD的支持。實際應(yīng)用表明,該設(shè)計對于傳統(tǒng)的MCU-LCD同樣也能與Framebuffer較好地結(jié)合,滿足更友好的界面開發(fā)需求。

  關(guān)鍵詞液晶顯示;幀緩沖;驅(qū)動程序;RGB-LCD接口;MCU-LCD接口

  在嵌入式的主流 LCD屏中主要支持兩大類硬件接口,一種是常見的RGB接口,另外一種是MCU接口。MCU-LCD因最早針對單片機的領(lǐng)域使用而得名。它在中低端手機中大量使用,其主要特點是價格便宜。MCU-LCD接口的標(biāo)準(zhǔn)術(shù)語是Interface 80,因此在很多文檔中用I80來指MCU-LCD屏[1]。

  MCU-LCD屏與RGB-LCD屏主要區(qū)別在于顯存的位置不同。RGB-LCD的顯存是由系統(tǒng)內(nèi)存充當(dāng)?shù)?,因此其大小只受限于系統(tǒng)內(nèi)存的大小,這樣 RGB-LCD可以做出較大尺寸。比如現(xiàn)在4.3英寸只能算入門級;而MID中7英寸、10英寸的屏都開始大量使用。但是MCU-LCD在設(shè)計之初只考慮單片機的內(nèi)存較小、資源受到限制,因此把顯存內(nèi)置在LCD模塊內(nèi)部,然后軟件通過專門顯示命令來更新顯存。這樣一來,MCU屏往往不能做得很大,同時顯示更新速度也比RGB- LCD慢。MCU-LCD同RGB- LCD異同如表1所示。

002.jpg

  隨著顯示技術(shù)和嵌入式技術(shù)的發(fā)展以及Linux在嵌入式系統(tǒng)中的普及,RGB-LCD越來越流行,在內(nèi)核驅(qū)動中,有諸多RGB-LCD的驅(qū)動實例及相關(guān)文檔可以參考。由于MCU-LCD是在早期單片機中使用,因此內(nèi)核對其支持不是太好,特別是采用了Framebuffer架構(gòu)的內(nèi)核。

1 MCU-LCD接口

  MCU接口中包括I80。I80全稱為8080并口協(xié)議,是由Intel公司提出的。除8080接口協(xié)議外,還有摩托羅拉的6800接口協(xié)議,兩者的不同在于控制器,8080通過“讀使能(RE)”和“寫使能(WE)”兩條控制線進(jìn)行讀寫操作。很多MCU或者LCD模塊外部接口一般采用并行方式,并行接口常見接線方式如圖1所示。

001.jpg

  1.1 8080模式

  8080模式接口信號通常有:/RES(復(fù)位線),DB0~DB7(雙向數(shù)據(jù)線),D/I(數(shù)據(jù)/指令選擇線,1:數(shù)據(jù)讀寫,0:命令讀寫),CS(片選信號線,如果有多片組合,可有多條片選信號線),/WR(MPU向LCD寫入數(shù)據(jù)控制線),/RD(MPU從LCD讀入數(shù)據(jù)控制線)。

  1.2 6800模式

  6800模式支持可選擇的總線寬度8/9/16/18 bit(默認(rèn)為8 bit),其實際設(shè)計思想與I80一樣,主要區(qū)別就是該模式的總線控制讀寫信號組合在一個引腳(/WR)上,并增加了一個鎖存信號(E)。

2 基于Framebuffer的MCU-LCD接口驅(qū)動設(shè)計

  2.1 Framebuffer架構(gòu)

  Framebuffer是LCD對應(yīng)的一種HAL,提供了顯示設(shè)備的抽象描述,它把顯存抽象為一種設(shè)備。應(yīng)用程序通過定義好的接口可以訪問顯卡,而不需要知道底層的任何操作,操作可以直接反映到顯示設(shè)備中[2]。

  Framebuffer驅(qū)動程序的數(shù)據(jù)結(jié)構(gòu)主要包括4個部分:fb_info、fb_ops、fb_var_screen和fb_fix_screen。fb_info結(jié)構(gòu)體是幀緩沖設(shè)備中最重要的數(shù)據(jù)結(jié)構(gòu),包括了幀緩沖設(shè)備屬性和操作的完整性屬性。fb_ops結(jié)構(gòu)體中的成員變量為指向底層操作的函數(shù)指針。fb_var_screen結(jié)構(gòu)體記錄用戶可以修改的顯示控制器參數(shù),fb_fix_screen記錄用戶不可修改的顯示控制器參數(shù)。Framebuffer對應(yīng)的驅(qū)動及其具體實現(xiàn)在linux/driver/video目錄下[3]。

  2.2 MCU-LCD驅(qū)動開發(fā)

  MCU-LCD存在黑白、4級灰度、16級灰色、256色、4 096色的STN液晶屏蔽,同時也存在黑白、4級灰度、16級灰度、256色、64K的TFT液晶顯示屏[3-4]。不同的灰度等級或者色彩度對應(yīng)不同的數(shù)據(jù)總線寬度。此處以16位數(shù)據(jù)總線寬度為例,6800的驅(qū)動與8080接口的驅(qū)動一致。

  首先在/driver/video目錄下增加mcu-lcd_fb.c文件。在Linux驅(qū)動中,通過設(shè)備的名稱與驅(qū)動的名稱進(jìn)行匹配,從而調(diào)用xx_probe函數(shù),所以在mcu-lcd-fb.c中首先添加mcu-lcd-fb_probe函數(shù)。此函數(shù)用于完成對LCD設(shè)備的初始、分配顯示緩沖區(qū)及注冊Framebuffer驅(qū)動。對LCD設(shè)備的初始化工作包括對相應(yīng)設(shè)備的寄存器相關(guān)配置工作的初始化和對fb_fix_screen中的固定硬件參數(shù)進(jìn)行設(shè)置,同時對fb_var_screen中可變的參數(shù)進(jìn)行配置。分配顯示緩沖區(qū)則需要根據(jù)液晶顯示屏的分辨率、像素點的寬度進(jìn)行計算,從而得到所需要的內(nèi)存空間大小。之后調(diào)用內(nèi)核的API函數(shù),注冊一個Framebuffer驅(qū)動[5-7]。

  接下來聲明MCU-LCD的fb_ops。

  static struct fb_op mcu_lcd_ops = {

  .owner = THIS_MODULE,

  .fb_check_var = mcu_lcd_check_var,

  .fb_set_par = mcu_lcd_set_par,

  .fb_setcolreg = mcu_lcd_setcolreg,

  .fb_blank = mcu_lcd_blank,

  .fb_open = mcu_lcd_open,

  .fb_release = mcu_lcd_release,

  .fb_copyarea = cfb_copyarea,

  .fb_fillrect = cfb_fillrect,

  .fb_imageblit = cfb_imageblit,

  };

  mcu_lcd _check_var函數(shù)確認(rèn)LCD顯示屏的可變參數(shù)。mcu_lcd_set_par對硬件參數(shù)進(jìn)行配置。mcu_lcd_setcolreg對LCD寄存器進(jìn)行設(shè)置,設(shè)置其顯示模式和顏色數(shù)。在MCU-LCD初始化以后,只需要對LCD顯示屏中的GRAM寫入相應(yīng)的數(shù)據(jù),LCD就會根據(jù)寫入的數(shù)據(jù)顯示相關(guān)的信息。在此函數(shù)中,使用偽畫板,將需要顯示的數(shù)據(jù)放在偽畫板中進(jìn)行暫時的保存。不同于RGB模式下的LCD屏,此時無需再對LCD寄存器進(jìn)行相應(yīng)的設(shè)置。cfb_copyarea、cfb_fillrect、cfb_imageblit則是調(diào)用Linux系統(tǒng)自帶的3個函數(shù),用于對圖片顯示、矩形填充及區(qū)域拷貝進(jìn)行操作。在mcu_lcd_open函數(shù)中,則是在打開Framebuffer設(shè)備文件時進(jìn)行操作。由于MCU-LCD沒有時鐘線對顯示屏進(jìn)行刷新操作,因此在mcu_lcd_open函數(shù)中啟動一個內(nèi)核線程。設(shè)置好內(nèi)核線程執(zhí)行的頻率,類似于LCD屏的刷新率。當(dāng)內(nèi)核線程進(jìn)行調(diào)度時,啟動CPU中內(nèi)存地址間的DMA傳輸控制,對LCD內(nèi)存寫入數(shù)據(jù)來進(jìn)行刷新操作[8-10]。

  Linux在嵌入式技術(shù)的發(fā)展過程中起著越來越重要的作用。Framebuffer在Linux的UI上起著抽象而又相當(dāng)重要的作用。以前的諸多嵌入式設(shè)備隨著技術(shù)的發(fā)展需要進(jìn)行功能及安全方面的擴(kuò)展,MCU-LCD也需要支持更多的上層應(yīng)用二次開發(fā)及更友好的UI界面,如QT、MiniGui等。本文通過實現(xiàn)支持MCU-LCD的Framebuffer驅(qū)動,從而支持了MCU-LCD對嵌入式領(lǐng)域更好的擴(kuò)展。

  在Framebuffer機制的基礎(chǔ)上,基于MCU-LCD這種在過去單片機時代較為通用的顯示設(shè)備,實現(xiàn)了嵌入式平臺下的Linux驅(qū)動程序設(shè)計,很好地解決了通用的MCU接口的LCD驅(qū)動實現(xiàn)。該設(shè)計為一些流行的嵌入式圖形庫如QT、MiniGUI的移植工作提供了基礎(chǔ),對界面的二次開發(fā)具有良好的指導(dǎo)意義。

參考文獻(xiàn)

  [1] 李瑛,魏廷存,張盛兵. 手機用TFT彩色液晶顯示驅(qū)動芯片的可配置接口電路設(shè)計[J].微電子學(xué)與計算機,2006, (5):46-49.

  [2] 馮國進(jìn).嵌入式Linux驅(qū)動程序設(shè)計從入門到精通 [M].北京:清華大學(xué)出版社,2008.

  [3] 張策,孫緒剛.基于Frambuffer的LCD驅(qū)動設(shè)計 [J].計算機工程與設(shè)計,2009,30(23):5372-5375.

  [4] 紀(jì)寧寧,孫靈燕. S3C2410A驅(qū)動RGB接口TFT LCD的研究 [J].液晶與顯示,2008,23(1):96-98.

  [5] 常赟杰,張位勇.Frambuffer的LCD驅(qū)動程序設(shè)計 [J].電腦編程技巧與維護(hù),2009,15(4):18-19.

  [6] 魯寶宏,郭磊,魏世民.嵌入式Linux平臺下LCD驅(qū)動的開發(fā)與實現(xiàn)[J].電子技術(shù),2008,45(9):28-30.

  [7] 蘇哲欣,劉鴻飛,薛曉.基于嵌入式Linux的LCD驅(qū)動分析與實現(xiàn)[J].工業(yè)控制計算機,2009,22(2):29-30.

  [8] 孫俊喜.LCD驅(qū)動電路、驅(qū)動程序設(shè)計及典型應(yīng)用[M].北京:人民郵電出版社,2009.

  [9] 李春燕.Linux內(nèi)核的嵌入式系統(tǒng)裁減以及LCD驅(qū)動的實現(xiàn)[J].電腦知識與技術(shù),2008,1(1) :29-37.

  [10]張伽偉,周安棟,羅勇. ARM11嵌入式系統(tǒng)Linux下 LCD的驅(qū)動設(shè)計[J].液晶與顯示,2011,26(5):660-664.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。