DirectFB概述:
DirectFB是圖形API存在於Frame Buffer層之上與進階圖形管理層如GTK+等之下的。它可以以很小的系統資源佔用來提供圖形硬體加速功能,提供類如多路a通道渲染模型等進階映像操作。它不修改Linux核心,除了標準C庫沒有其他庫的依賴。應用在了基於Linux系統的DTV顯示系統的研發和其他有關Linux顯示介面的項目上。支援市面上絕大多數顯示卡,支援鍵盤、滑鼠、遙控器、遊戲手柄、觸控螢幕等輸入裝置。支援JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFB bitmap font和TrueType等音視頻檔案和字型。
上層API支援DirectFB的有:
XDirectFB、DirectFBGL、GTK+、DFBTerm、DFBSee、DFBPoint、MythTV、Qt on DirectFB、SDL(Simple Directmedia Layer)。
DirectFB官方宣稱支援的作業系統:
Linux、FreeBSD/NetBSD/OpenBSD、Mac OS X。
uCLinux、CELinux均能找到一個不完整的移植案例。
比較了一下,相對gtk+、miniGUI等來說,DirectFB的推廣沒有對方做得好,起碼沒有見到移植到Windows系列平台上去的Roadmap。
關於DirectFB的layer問題
和石可箴討論了一下DPF系統顯示的layer數量的問題,總結出layer支援數量的多少要靠晶片和驅動的共同支援才能實現。以前DTV系統中就有若干個OSD層、Video層、Cursor層等。網上查了一下DirectFB能支援的layer層數,發現對於DirectFB的layer來說有兩個層面上的理解:
1.作為硬體層面:硬體層面中layer的多寡取決於晶片的硬體資源。在DirectFB中使用的是IDirectFBDisplayLayer介面。其內容將直接顯示在螢幕上。
2.作為軟體層面:DirectFB沒有專門的介面,但是可以利用IDirectFBWindow介面自己建立起多layer結構。如使用IDirectFBWindow->SetOpacity(IDirectFBWindow *thiz, __u8 opacity)來實現這樣的結構。
> IDirectFBWindow OSD <--highest window
> IDirectFBWindow video with video Provider
> IDirectFBWindow mpegstill
> IDirectFBWindow background with image Provider<--lowest window
通過設定其opacity來實現一個硬體layer上的4個不同的layer。
根據這個實現方法,以及DirectFB直接將FrameBuffer的memory mapping到application的memory中的工作原理,突然聯想到了RAMDAC,猜想我們DPF中可能也有這種器件。隨即先查詢了RAMDAC的相關資料,RAMDAC的作用是把數位影像資料轉換成電腦顯示需要的類比資料。顯示器收到的是RAMDAC處理過後的類比型號。RAMDAC經曆了與GPU分開放置——合并在一顆晶片——又分開放置的變遷過程,主要是成本與效能上的考量所致。然後查了一下DPF中是否也有類似的器件,沒有發現,作罷。
DirectFB的安裝流程
1. 解壓DirectFB-1.0.0.tar.gz包
2. 入此目錄執行
# ./configure
# make
# make install
一切正常。
DirectFB Sample的編譯
先拿官方例子玩玩,第一次直接用#gcc draw_linc.c –o draw,報錯,No such file or directory ‘directfb.h’
解決方案是include上DirectFB的安裝目錄,# gcc –I/usr/local/directfb draw_linc.c –o draw
這次是在link的時候報錯,很多undefined reference to ’xxxx’
補上lib目錄,# gcc -L/usr/local/lib -I/usr/local/include/directfb draw_line.c -o draw
但發現還是報錯,根據提示,查看了/usr/local/lib/pkgconfig的directfb.pc檔案,發現裡面有編譯參數資訊
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: DirectFB
Description: Graphics and windowing library for the Linux frame buffer device
Version: 1.0.0
Requires: fusion direct
Libs: -L${libdir} -ldirectfb -lpthread -ldl -lz
Cflags: -D_REENTRANT -I${prefix}/include/directfb
顯然還要加上參數。
解決方案如下,# gcc -L/usr/local/lib -I/usr/local/include/directfb -ldirectfb -lpthread -ldl -lz draw_line.c -o draw
編譯通過。
當然,最方便的方法是pkg-config,因為DirectFB安裝時已經自動設定好。
# gcc `pkg-config --cflags --libs directfb` draw_line.c -o draw
編譯通過。
DirectFB Sample的運行
直接運行./draw,在開啟framebuffer的時候報錯。
查詢結果是framebuffer也需要配置一下。
在/boot/grub/menu.lst中增加vga=0x317這個參數。
重啟後,再次運行./draw,framebuffer錯誤已經解決,但又出現找不到shared libraries的問題。
添加# export LD_LIBRARY_PATH=/usr/DirectFB25/lib後,執行檔案時又回到了framebuffer出錯時的狀態“/dev/fb0: No such file or directory”。暈倒了。周一繼續查底層的framebuffer哪裡有問題。
感謝上帝終於調通了,果然是底層FrameBuffer的問題。方法是在/boot/grub/menu.lst中的kernel這行後面加上vga=0x317,reboot後,啟動畫面中出現了兩隻可愛的小企鵝,這下我確信FrameBuffer開啟了。運行程式後一切正常。
但是有一點要注意,在新開啟一個終端後,為了運行DirectFB程式,必須要先設定一個環境變數,export LD_LIBRARY_PATH=/usr/local/lib。將這句話放在/root/.bashrc中,有效。明天的任務就是load一個圖片出來。
一切ok,完成了剩餘三個sample後,總結了一下,官方的五個sample提供了畫線、畫圖片、畫文字、圖片按照鍵盤響應上下移動,圖片按照鍵盤響應隨機移動。
Sample中圖片對象的建立都是用CreateImageProvider來實現的,經過實測,可以支援的映像格式為:jpg、png、gif,不支援的映像格式為:bmp、tif。
DirectFB的重新總結
經過多方面資料驗證,DirectFB是將FrameBuffer重新封裝,提供新的、功能較強大的圖形API介面供上層GTK+、QT等調用。但自身並不提供控制項,如果要實現下拉式功能表等效果,必須使用GTK+等進階圖形庫調用DirectFB來實現。
DirectFB的學習
Today I learn the global settings of DirecFB: /etc/directfbrc, Every DirectFB application will read that setting file at first. And the parameter shows below can also be transmitted by the prefix --dfb behind the ./filename.
I’ve tried the parameters as below.