歡迎您光臨本站 登入註冊首頁

嵌入式linux系統中Framebuffer研究

admin @ 2014-03-25 , reply:0

概述

1基於嵌入式Linux的GUI系統發展概況   當前流行的商業化的GUI系統包括WindowsCE和SymbianOS等。這些GUI性能出眾,一般都提供完整的解決方案,對……

1 基於嵌入式Linux的GUI系統發展概況
    當前流行的商業化的GUI系統包括WindowsCE和SymbianOS等。這些GUI性能出眾,一般都提供完整的解決方案,對Java、多媒體的支持較好,使用它們可以很方便地構建自己的嵌入式系統,形成產品,儘可能地縮短開發周期。但這些都是商業化產品,使用它們不可避免地要付出昂貴的授權費用,沒有公開源代碼,用戶也不能很自由地定製自己的產品。Linux的出現給嵌入式產品的開發帶來了新的活力,它擁有很多的優良特性非常適合於嵌入式的開發:開放源碼,擁有豐富的軟體資源;健壯、強大的內核;支持多種體系結構,包括x86、ARM、MIPS等幾乎所有主流的CPU;完善的網路通信、圖形和文件管理機制;支持大量的周邊硬體設備,驅動豐富;大小功能均可定製,充分滿足嵌入式設備可定製的要求。正是由於Linux具有這麼多優點,使得它在嵌入式領域取得了長足的發展,因而開發基於Linux的GUI系統就顯得尤為必要。在桌面版的Linux系統中普遍採用的GUI是XWindows系統,但顯然它相對於嵌入式系統來說是過於龐大了,嵌入式系統要求的是一個輕量級的性能可靠和可裁減的GUI,因此需要重新開發適合嵌入式系統的GUI。目前國內外已經推出了很多基於Linux的GUI產品,現在比較流行的一些GUI產品包括MiniGUI、MicroWindows、OpenGUI、QT Embedded等,其中QT Embedded屬於商業化的產品,其他屬於開源軟體。從性能、功能各個方面來說QT Embedded都是一個很優秀的GUI系統,但是使用它需要支付高昂的授權費用,它一般應用在高端的PDA和SmartPhone等產品上,而其他的一些開源GUI系統,都有各自的特點和適用領域,但總體來說表現不如QT Embedded出色。

2 Framebuffer組成結構
2.1 Framebuffer簡介
    Framebuffer譯作幀緩衝,它作為基礎圖形設施,是出現在Linux 2.2.XX內核當中的一種驅動程序介面,是作為其他高級圖形或者圖形應用程序的基本函數庫。這種介面將顯示設備抽象為幀緩衝區。用戶可以將它看成是顯示內存的一個映像而不必關 物理顯存的位置、換頁機制等等具體細節,這些都是由Framebuffer設備驅動來完成的,只要將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。幀緩衝區支持提高了繪圖的速度和整體性能。
    Framebuffer對應的源文件在Linux/drivers/video/目錄下。總的抽象設備文件為fbcon.c,在這個目錄下還有與各種顯卡驅動相關的源文件。在使用幀緩衝時,Linux是將顯卡置於圖形模式下的。有了Framebuffer,用戶的應用程序不需要對底層的驅動的深入了解就能夠做出很好的圖形。對於用戶而言,它和/dev下面的其他設備沒有什麼區別,用戶可以把Framebuffer看成一塊內存,既可以向這塊內存中寫入數據,也可以從這塊內存中讀取數據。第一個被註冊的Framebuffer的minor等於0,第二個被註冊的Framebuffer的minor等於1,以此類推。

2.2 Framebuffer結構分析
    Framebuffer結構分為三層,如圖1。
 
圖1 Framebuffer 結構圖
    最底層:基本控制台驅動程序(drivers/char/console.c),它提供了文本控制台常規介面的一部分;通過使用控制台驅動程序函數,可以將文本顯示在屏幕上,但還不能顯示圖形或動畫。
    中間層:(drivers/video/fbcon.c)使用視頻模式功能來實現圖形或動畫功能,中間層驅動程序提供了視頻模式中繪圖的常規介面。
    頂層:是與特定硬體相關的驅動程序,它需要支持顯卡不同的硬體方面,像啟用/禁用顯卡控制器、深度和模式的支持以及調色板等,這也是頂層驅動程序引人注意之處。所有這三層都相互依賴以實現正確的視頻功能。
    Linux下設備分為字元設備、塊設備和網路設備介面三大類。那麼Framebuffer設備屬於哪一類呢?剛開始設計時容易使人困惑。其實對使用者而言, 幀緩衝設備也就是Framebufferdevice和Linux系統目錄/dev下的其他設備沒有區別。幀緩衝設備對應的設備文件為/dev/fb*, 如果系統有多個顯示卡,Linux下還可支持多個幀緩衝設備,最多可達32個,分別為/dev/fb0到/dev/fb31;而/dev/fb則為當前預設的幀緩衝設備,通常指向/dev/fb0。當然在嵌入式系統中支持一個顯示設備就夠了。幀緩衝設備為標準字元設備,主設備號為29,次設備號則從0到31。分別對應/dev/fb0一/dev/fb31。
    Framebuffer設備很大程度上依靠了下面三個數據結構。這三個結構在fb.h 中聲明。
1)Struct fb_var_screeninfo:描述圖形卡的特性的。通常是由用戶設置的。
2)Struct fb_fix_screeninfo:定義了圖形卡的硬體特性,是不能改變的,用戶選定了哪一個圖形卡,那麼它的硬體特性也就定下來了。
3)Struct fb_info:定義了當前圖形卡Framebuffer設備的獨立狀態,一個圖形卡可能有兩個Framebuffer,在這種情況下,就需要兩個fb_info 結構。這個結構是唯一在內核空間可見的。

3 Framebuffer功能實現
    在任何Linux嵌入式系統中,Framebuffer都發揮著極其重要的作用,沒有了Framebuffer的支持,我們不可能在諸多嵌入式設備中進行圖形圖象的操作和顯示,比如智能手機上的手寫輸入,家用設備的觸摸感應操作等都無法完成。具體來說,Framebuffer在嵌入式Linux下有如下作用:
1)通過Framebuffer設備,可以獲得顯示設備的一些固定信息。(比如顯示內存大小)、與顯示模式相關的可變信息(比如解析度、像素結構、每掃描線的位元組寬度),以及偽彩色模式下的調色板信息等等。這些信息是通過Framebuffer提供的ioctl命令取得的,ioctl是設備驅動程序中對設備的I/O通道進行管理的函數,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉速等等,該函數調用如下:int ioctl(int fd,ind cmd,……);其中fd就是用戶程序打開設備時使用open函數返回的文件標示符,cmd就是用戶程序對設備的控制命令,至於後面的省略號,那是一些補充參數,一般最多一個,有或沒有是和cmd的意義相關。
2)通過Framebuffer設備獲得當前內核所支持的加速顯示卡的類型(通過固定信息得到)。這種類型通常是和特定顯示晶元相關的。獲得了加速晶元類型之後,應用程序就可以將顯卡內存I/O(稱為memio)映射到進程的地址空間。這些memio一般是用來控制顯示卡的寄存器,通過對這些寄存器的操作,應用程序就可以控制特定顯卡的加速功能。
3)顯示設備可以將自己的控制寄存器映射到物理內存空間,而後,對這些控制寄存器的訪問,給變成了對物理內存的訪問。一旦被映射到物理內存,Linux的普通進程才可以通過映射操作(mmap)將這些內存I/O 映射到進程地址空間,這樣就可以直接訪問這些寄存器。
    在支持Framebuffer的嵌入式設備中,應用程序都可以對Framebuffer進行操作,操作包括:
1)讀/寫(read/write)/dev/fb:相當於讀/寫屏幕緩衝區;
2)映射(mmap)操作:Linux通過文件操作file_operations結構中提供的mmap函數映射操作將屏幕緩衝區的物理地址映射到用戶空間的一段虛擬地址中,之後用戶就可以通過讀寫這段虛擬地址訪問屏幕緩衝區在屏幕上繪圖。若干個進程可以映射到同一個顯示緩衝區。實際上,使用幀緩衝設備的應用程序都是通過映射操作來顯示圖形的。由於映射操作都是由內核來完成,幀緩衝驅動留給開發人員的工作並不多。
3)I/O控制:通過ioctl操作完成。
    在屏幕上繪圖Framebuffer中內存塊分佈如圖2所示。
 
圖2 內存塊分布圖

4 Linux下利用Framebuffer實現直接寫屏
4.1支持Framebuffer的Linux內核編譯
    在Linux下實現Framebuffer的編程之前,也需要對其進行內核編譯,生成支持Framebuffer的內核,編譯內核的方法和傳統的方法一樣,但也有一些不同,應以root(管理員)身份登陸Linux。編譯完之後重起系統,選擇進入自己編譯生成的內核模式,但要注意的是,在登陸之前要對“linuxvga”進行設置,設置成符合Framebuffer的工作模式,比如設置“linuxvga=771”即進入800*600*256色的工作模式。登陸后看到啟動頁面上出現小企鵝的圖像則說明已經成功登陸支持Framebuffer的內核模式,啟動完畢后再以root身份登陸,即進入支持Framebuffer的內核模式,現在就可以在此終端下進行相應的Framebuffer編程了。

4.2 Framebuffer的應用編程
    基於Framebuffer的Linux內核編譯完后,就可以在Linux下進行相應的功能編程。但是最常用以及最有代表性的應用是Linux下通過Framebuffer的直接寫屏。該技術已經應用到智能手機、PDA及其他嵌入式設備中,如PDA上的手寫輸入功能。下面其實現的具體流程。在實際編程當中,應用程序對Framebuffer的具體操作流程如下:
1)打開/dev/fb設備文件;
2)用ioctrl操作取得當前顯示屏幕的參數,如屏幕解析度,每個像素點的比特數。根據屏幕參數可計算屏幕緩衝區的大小。
3)將屏幕緩衝區映射到用戶空間。
4)映射后就可以直接讀寫屏幕緩衝區,進行繪圖和圖片顯示了。
    在內核編譯以及初始化設置完成之後,我們基於上述操作,在Linux下運行用C語言編寫的Framebuffer實現直接寫屏程序,我們看到在Linux系統桌面上,我們可以用滑鼠直接進行寫漢字及繪圖操作,將之應用到PDA、智能手機以及其他嵌入式設備上,則就可實現手寫輸入功能。
    當然,利用Framebuffer進行的操作和實現的功能還有很多,作為硬體圖形介面,通過Framebuffer,才可實現對底層硬體設備的操作,最具有代表性的就是實現圖形操作,並在應用層上進行顯示。

5 結束語
    嵌入式GUI是介於嵌入式操作系統和上層應用程序之間的中間產品,對於基於Linux操作系統的嵌入式系統解決方案來說,在操作系統這一級上各個廠家區別不大,因此GUI的優劣對於一個產品來說就顯得尤為重要。Framebuffer作為基礎圖形設施,把顯存抽象成一種設備,通過對此設備的讀寫直接對顯存進行操作,因此它是用戶進入圖形界面很好的介面,這極大地幫助用戶能夠設計出高性能的GUI,從而既滿足了用戶的較高需求,又使自己的嵌入式產品具有極強的競爭力。隨著嵌入式技術的進一步發展和廣泛應用,Frambufer在嵌入式GUI系統中必將發揮出越來越重要的作用。


[admin via 研發互助社區 ] 嵌入式linux系統中Framebuffer研究已經有2491次圍觀

http://cocdig.com/docs/show-post-42131.html