作者
魏永明
主題八
MiniGUI 和其他嵌入式 Linux 上的圖形及圖形用戶界面系統
為了讓讀者對嵌入式 Linux 當中能夠使用的圖形及圖形用戶界面有個較為全面的認識
本文將為讀者介紹一些嵌入式 Linux 系統中常見的圖形及圖形用戶界面系統
並作為
基於 Linux 和 MiniGUI 的嵌入式系統軟件開發指南
系列的最後一篇文章
本文首先概述了 Linux 圖形領域的基本設施
然後描述了一些可供嵌入式 Linux 系統使用的高級圖形庫以及圖形用戶界面支持系統
並大概比較了這些系統的優缺點
希望能對嵌入式 Linux 系統的開發有所幫助
Linux 圖形領域的基礎設施
本小節首先向讀者描述 Linux 圖形領域中常見的基礎設施
之所以稱為基礎設施
是因為這些系統(或者函數庫)
一般作為其他高級圖形或者圖形應用程序的基本函數庫
這些系統(或者函數庫)包括
X Window
SVGALib
FrameBuffer 等等
X Window
提起 Linux 上的圖形
許多人首先想到的是 X Window
這一系統是目前類 UNIX 系統中處於控制地位的桌面圖形系統
無疑
X Window 作為一個圖形環境是成功的
它上面運行著包括 CAD建模工具和辦公套件在內的大量應用程序
但必須看到的是
由於 X Window 在體系接口上的原因
限制了其對游戲
多媒體的支持能力
用戶在 X Window 上運行 VCD 播放器
或者運行一些大型的三維游戲時
經常會發現同樣的硬件配置
卻不能獲得和 Windows 操作系統一樣的圖形效果――即使使用了加速的 X Server
其效果也不能令人滿意
另外
大型的應用程序(比如 Mozilla 浏覽器)在 X Window 上運行時的響應能力
也相當不能令人滿意
當然
這裡有 Linux 內核在進程調度上的問題
也有 X Window 的原因
X Window 為了滿足對游戲
多媒體等應用對圖形加速能力的要求
提供了 DGA(直接圖形訪問)擴展
通過該擴展
應用程序可以在全屏模式下直接訪問顯示卡的幀緩沖區
並能夠提供對某些加速功能的支持
Tiny
X是XServer在嵌入式系統的小巧實現
它由Xfree
Core Team 的Keith Packard開發
它的目標是運行於小內存系統環境
典型的運行於X
CPU 上的Tiny
X Server 尺寸接近(小於)
MB
SVGALib
SVGALib 是 Linux 系統中最早出現的非 X 圖形支持庫
這個庫從最初對標准 VGA 兼容芯片的支持開始
一直發展到對老式 SVGA 芯片的支持以及對現今流行的高級視頻芯片的支持
它為用戶提供了在控制台上進行圖形編程的接口
使用戶可以在 PC 兼容系統上方便地獲得圖形支持
但該系統有如下不足
接口雜亂
SVGALib 從最初的 vgalib 發展而來
保留了老系統的許多接口
而這些接口卻不能良好地迎合新顯示芯片的圖形能力
未能較好地隱藏硬件細節
許多操作
不能自動使用顯示芯片的加速能力支持
可移植性差
SVGALib 目前只能運行在 x
平台上
對其他平台的支持能力較差(Alpha 平台除外)
發展緩慢
有被其他圖形庫取代的可能
SVGALib 作為一個老的圖形支持庫
目前的應用范圍越來越小
尤其在 Linux 內核增加了 FrameBuffer 驅動支持之後
有逐漸被其他圖形庫替代的跡象
對應用的支持能力較差
SVAGLib 作為一個圖形庫
對高級圖形功能的支持
比如直線和曲線等等
卻不能令人滿意
盡管 SVGALib 有許多缺點
但 SVGALib 經常被其他圖形庫用來初始化特定芯片的顯示模式
並獲得映射到進程地址空間的線性顯示內存首地址(即幀緩沖區)
而其他的接口卻很少用到
另外
SVGALib 中所包含的諸如鍵盤
鼠標和游戲桿的接口
也很少被其他應用程序所使用
因此
SVGALib 的使用越來越少
筆者也不建議用戶使用這個圖形庫
當然
如果用戶的顯示卡只支持標准 VGA 模式
則 SVGALib 還是比較好的選擇
FrameBuffer
FrameBuffer 是出現在
xx 內核當中的一種驅動程序接口
這種接口將顯示設備抽象為幀緩沖區
用戶可以將它看成是顯示內存的一個映像
將其映射到進程地址空間之後
就可以直接進行讀寫操作
而寫操作可以立即反應在屏幕上
該驅動程序的設備文件一般是 /dev/fb
/dev/fb
等等
比如
假設現在的顯示模式是
x
位色
則可以通過如下的命令清空屏幕
$ dd if=/dev/zero of=/dev/fb
bs=
count=
在應用程序中
一般通過將 FrameBuffer 設備映射到進程地址空間的方式使用
比如下面的程序就打開 /dev/fb
設備
並通過 mmap 系統調用進行地址映射
隨後用 memset 將屏幕清空(這裡假設顯示模式是
x
位色模式
線性內存模式)
int fb;
unsigned char* fb_mem;
fb = open (
/dev/fb
O_RDWR);
fb_mem = mmap (NULL
*
PROT_READ|PROT_WRITE
MAP_SHARED
fb
);
memset (fb_mem
*
);
FrameBuffer 設備還提供了若干 ioctl 命令
通過這些命令
可以獲得顯示設備的一些固定信息(比如顯示內存大小)
與顯示模式相關的可變信息(比如分辨率
象素結構
每掃描線的字節寬度)
以及偽彩色模式下的調色板信息等等
通過 FrameBuffer 設備
還可以獲得當前內核所支持的加速顯示卡的類型(通過固定信息得到)
這種類型通常是和特定顯示芯片相關的
比如目前最新的內核(
)中
就包含有對 S
Matrox
nVidia
Dfx 等等流行顯示芯片的加速支持
在獲得了加速芯片類型之後
應用程序就可以將 PCI 設備的內存I/O(memio)映射到進程的地址空間
這些 memio 一般是用來控制顯示卡的寄存器
通過對這些寄存器的操作
應用程序就可以控制特定顯卡的加速功能
PCI 設備可以將自己的控制寄存器映射到物理內存空間
而後
對這些控制寄存器的訪問
給變成了對物理內存的訪問
因此
這些寄存器又被稱為
memio
一旦被映射到物理內存
Linux 的普通進程就可以通過 mmap 將這些內存 I/O 映射到進程地址空間
這樣就可以直接訪問這些寄存器了
當然
因為不同的顯示芯片具有不同的加速能力
對memio 的使用和定義也各自不同
這時
就需要針對加速芯片的不同類型來編寫實現不同的加速功能
比如大多數芯片都提供了對矩形填充的硬件加速支持
但不同的芯片實現方式不同
這時
就需要針對不同的芯片類型編寫不同的用來完成填充矩形的函數
說到這裡
讀者可能已經意識到 FrameBuffer 只是一個提供顯示內存和顯示芯片寄存器從物理內存映射到進程地址空間中的設備
所以
對於應用程序而言
如果希望在 FrameBuffer 之上進行圖形編程
還需要完成其他許多工作
舉個例子來講
FrameBuffer 就像一張畫布
使用什麼樣子的畫筆
如何畫畫
還需要你自己動手完成
LibGGI
LibGGI 試圖建立一個一般性的圖形接口
而這個抽象接口連同相關的輸入(鼠標
鍵盤
游戲桿等)抽象接口一起
可以方便地運行在 X Window
SVGALib
FrameBuffer 等等之上
建立在 LibGGI 之上的應用程序
不經重新編譯
就可以在上述這些底層圖形接口上運行
但不知何故
LibGGI 的發展幾乎停滯
Linux 圖形領域的高級函數庫
Xlib 及其他相關函數庫
在 X Window 系統中進行圖形編程時
可以選擇直接使用 Xlib
Xlib 實際是對底層 X 協議的封裝
可通過該函數庫進行一般的圖形輸出
如果你的 X Server 支持 DGA
則可以通過 DGA 擴展直接訪問顯示設備
從而獲得加速支持
對一般用戶而言
由於 Xlib 的接口太原始而且復雜
因此一般的圖形程序選擇其他高級一些的圖形庫作為基礎
比如
GTK
QT 等等
這兩個函數同時還是一些高級的圖形用戶界面支持函數庫
由於種種原因
GTK
QT 等函數庫存在有龐大
占用系統資源多的問題
不太適合在嵌入式系統中使用
這時
你可以選擇使用 FLTK
這是一個輕量級的圖形函數庫
但它的主要功能集中在用戶界面上
提供了較為豐富的控件集
SDL
SDL(Simple DirectMedia Layer)是一個跨平台的多媒體游戲支持庫
其中包含了對圖形
聲音
游戲桿
線程等等的支持
目前可以運行在許多平台上
其中包括 X Window
X Window with DGA
Linux FrameBuffer 控制台
Linux SVGALib
以及Windows DirectX
BeOS 等等
因為 SDL 專門為游戲和多媒體應用而設計開發
所以它對圖形的支持非常優秀
尤其是高級圖形能力
比如 Alpha 混和
透明處理
YUV 覆蓋
Gamma 校正等等
而且在 SDL 環境中能夠非常方便地加載支持 OpenGL 的 Mesa 庫
從而提供對二維和三維圖形的支持
可以說
SDL 是編寫跨平台游戲和多媒體應用的最佳平台
也的確得到了廣泛應用
相關信息
可參閱
Allegro
Allegro 是一個專門為 x
平台設計的游戲圖形庫
最初的 Allegro 運行在 DOS 環境下
而目前可運行在 Linux FrameBuffe 控制台
Linux SVGALib
X Window 等系統上
Allegro 提供了一些豐富的圖形功能
包括矩形填充和樣條曲線生成等等
而且具有較好的三維圖形顯示能力
由於 Allegro 的許多關鍵代碼是采用匯編編寫的
所以該函數庫具有運行速度快
資源占用少的特點
然而
Allegro 也存在如下缺點
對線程的支持較差
Allegro 的許多函數是非線程安全的
不能同時在兩個以上的線程中使用
對硬件加速能力的支持不足
在設計上沒有為硬件加速提供接口
有關 Allegro 的進一步信息
可參閱
Mesa
D
Mesa
D 是一個兼容 OpenGL 規范的開放源碼函數庫
是目前 Linux 上提供專業三維圖形支持的
From:http://tw.wingwit.com/Article/program/Oracle/201311/18758.html