孫靜
摘要:本文以OMAP3530為處理器,S3C2410 LCD控制器為基礎,基于嵌入式Linux 2.6內核,研究了FrameBuffer機制下的LCD驅動程序,介紹了相關的數據結構,FrameBuffer的加載和卸載的完整過程。實現了在LCD上顯示字符、圖形、圖像的應用。
關鍵詞: 幀緩沖; LCD; 圖像顯示
中圖分類號: TP311
文獻標志碼: A
文章編號: 2095-2163(2016)06-0127-03
0引言
隨著嵌入式技術的發展,顯示模塊在嵌入式產品中得到了日趨廣泛的設計應用。LCD可顯示字符、漢字和圖形,具有低功耗、體積小、綠色環保等特點,因而在嵌入式產品的顯示系統上已然成為重點優先研究首選。LCD的驅動程序針對不同的處理器通用性較差,本文為此研討提出了一種移植性較好的LCD驅動程序,即基于Linux的FrameBuffer機制,同時采用S3C2410 LCD控制器,進而開發生成了嵌入式LCD的字符、圖形、圖像顯示方法。
[BT4]1基于FrameBuffer的驅動設計
[BT5]1.1FrameBuffer機制
FrameBuffer是Linux操作系統為顯示設備提供的一種驅動程序接口,可將顯示緩沖區實現抽象處理,屏蔽圖像硬件的底層,上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。用戶不必關心顯示緩沖區的具體物理位置、存放方式。FrameBuffer的顯示緩沖區位于Linux核心態地址空間,每個應用程序均有自己的虛擬地址空間。用戶通過調用mmap函數,可將文件的內容映射到應用空間。對于FrameBuffer設備而言,通過映射操作,可將屏幕緩沖區的物理地址應用到程序空間的一段虛擬地址中,然后通過讀寫對應段虛擬地址而訪問屏幕緩沖區,從而在屏幕上繪制各種圖形、圖像、文字等。FrameBuffer的優點是可高度靈活地支持不同的硬件,減少了新處理器的開發工作。
[BT5]1.2基于FrameBuffer的驅動設計
FrameBuffer幀緩沖設備給用戶設計指定的讀寫接口file_operations實際由fbmem.c文件里的特定file_operatins結構對象來展現提供,而特定幀緩沖設備fb_info結構體的注冊、注銷及其中成員的維護,尤其是fb_ops中的成員函數的實現則由對應的xxxfb.c文件來構造調取顯示,fb_ops中的成員函數最終會操作LCD控制器的寄存器。圖1即給出了幀緩沖設備驅動的程序結構。
1.2.1FrameBuffer相關的數據結構
本節,將研究給出與幀緩沖相關的數據結構的功能設計概述如下:
1)fb_info。記錄了FrameBuffer的全部信息,包括設備的定制參數、狀態以及操作函數指針。每一個幀緩沖設備必須對應唯一fb_info。
2)fb_ops。fb_info的成員變量fb_ops即為指向底層操作的函數的指針,這些函數是需要驅動程序開發人員來制定編寫的。包括打開、釋放函數,用于檢查可以修改的屏幕參數并調整到適當值,同時設置color寄存器,使用戶設置的屏幕參數在硬件上能夠呈現事實有效等具體功能的分配操作。
3)fb_var_screeninfo和fb_fix_screeninfo。這2個結構體也是fb_info的成員。其中,fb_var_screeninfo記錄用戶可修改的顯示控制器參數,包括屏幕分辨率和每個像素點的比特數。fb_fix_screeninfo記錄用戶不能修改的顯示控制器的參數,如屏幕緩沖區的物理地址、長度。當對幀緩沖設備展開執行映射操作的時候,就是從fb_fix_screeninfo中取得緩沖區物理地址的。
4)fb_bitfield。描述每一像素顯示緩沖區的組織方式,包括位域偏移、位域長度和MSB指示。
5)fb_cmap。記錄設備無關的顏色表信息。
1.2.2FrameBuffer設備驅動的模塊加載和卸載
FrameBuffer設備驅動的模塊加載,可解析描述為如下4個步驟:
1)申請fb_info結構體的內存空間,初始化fb_info結構體中固定和可變的屏幕參數,即填充fb_info的fb_var_screeninfo var和fb_fix_screeninfo fix成員。
2)根據LCD屏幕的特點,執行LCD控制器硬件的初始化。
3)申請FrameBuffer設備的顯示緩沖區空間。
4)注冊FrameBuffer設備。
FrameBuffer設備驅動的模塊卸載,則需依次釋放fb_info結構體內存、關閉LCD、釋放顯示緩沖區以及注銷FrameBuffer設備的流程也將移交到平臺驅動的移除函數中順序操控完成。
[BT4]2基于FrameBuffer的LCD圖像顯示的實現
在LCD上顯示圖像的主流程如圖2所示。首先調用open函數打開設備,然后調用ioctl獲取設備相關信息,接下來就是讀取圖形文件數據,把圖像的RGB值映射到顯存中,這部分也是圖像顯示的設計核心。
[BT5]2.1LCD刷新函數
本系統采用RGB565模式,即Red占5位(bit[11:15]),Green占6位(bit[5:10]),Blue占5位(bit[0:4])。LCD刷新函數的功能是把二級緩存LCDBuffer的數據由32位彩色圖形信息轉換成16位圖形信息,而后存送至fbp指向的一級緩存。轉換方法如下:
pixcolor = ((pbuf[0]&0xf8)>>3)|(((pbuf[1]&0xfc)>>2)<<5)|(((pbuf[2]&0xf8)>>3)<<11);
[BT5]2.2顯示像素點
LCD上顯示圖像的基礎設計操作即是顯示像素點,基于FrameBuffer顯示像素點就是把屏幕對應坐標位置的顏色值賦值到LCDFRAMEBUFFER數組里。本系統使用的是640×480 TFT液晶屏,通過如下方法可處理實現像素點的最終顯示,關鍵代碼如下:
typedef unsigned long tOff;
void LCD_WRITE_MEM( U32 off,U16 Data)
{
(* ((U16*)LCDFRAMEBUFFER + (off)) ) = Data;
}static void SetPixel(U16 x, U16 y, U32 c)
{
tOff Off = (tOff)((tOff)y*(tOff)640 + (x));
LCD_WRITE_MEM(Off, Data);
}
[BT5]2.3基本圖形繪制
得到了像素點的研究顯示,就可以在LCD上繪制基本圖形了。其中,水平線和垂直線是原始功能線型。本次研究指出,水平線的繪制就是保持點的縱坐標不變,橫坐標從x0變化到x1,依次顯示像素點,這樣就得到一條從(x0,y0)到(x1,y0)的水平線。同樣道理,橫坐標不變,縱坐標從y0變化到y1,依次顯示像素點,即可得到一條從(x0,y0)到(x0,y1)的垂直線。在此基礎上,矩形的繪制是給出矩形的左上角坐標和右下角坐標,而后根據這2個坐標在矩形范圍內畫線即可得到實現。
由于嵌入式系統不能處理浮點數,在LCD屏上顯示圓形則較復雜。本系統采用改進的Bresenham畫圓算法,分別給出了空心圓和實心圓的繪制方法,空心圓程序設計流程如圖3所示。實心圓就是把空心圓內的像素點顯示出來。
.4漢字及BMP位圖圖像顯示方法
漢字是以點陣字模形式存儲的,采用16×16點陣(32字節)、24×24點陣(72字節),每個點用一個二進制位表示,將其在屏幕上顯示出來,就是研究指定刻畫的漢字。
BMP位圖文件和大多數圖形文件一樣,分為文件描述區(頭文件信息)和圖像存儲區(像素數據)兩部分。圖像的顯示方法和漢字類似,區別之處只是需要從位圖文件里讀出頭文件信息,BMP位圖LCD顯示的程序流程如圖4所示。
3結束語
基于Linux的FrameBuffer和OMAP3530處理器的開發平臺,在LCD上顯示實現了清晰、穩定的圖形、字符和圖像。該方法移植修改簡單、方便,為嵌入式產品的顯示系統構建了具體模式設計基礎,對嵌入式LCD的應用提供了通用的實現方法。
參考文獻:[HT]
張策, 楊緒劍, 王君君. 基于 FrameBuffer 的 LCD 驅動設計[J]. 計算機工程與設計,2009,30 (23):5372-5375.
[2] 葛化敏,鄭靜,楊利青. 基于ARM-Linux的LCD顯示模塊設計[J]. 儀表技術與傳感器,2009(7):75-77,86.
[3] 王海霞,武一. 基于SOPC的LCD顯示模塊的設計與實現[J]. 液晶與顯示,2012,27(4):508-514.
[4] 馬舜峰,金龍旭,安少婷,等. 一種基于ARM9的彩色TFT-LCD模塊設計及實現, 液晶與顯示,2010,25(5):718-723.