uClinux 下的framebuffer設備驅動

admin @ 2014-03-25 , reply:0

      下面的內容主要是關於framebuffer 的一些知識, 主要是根據我們實際開發過程中的一些體會,其中難免錯漏之處, 歡迎指正。

什麼是framebuffer 設備
       framebuffer 是一種能夠提取圖形的硬體設備,是用戶進入圖形界面很好的介面。有了framebuffer,用戶的應用程序不需要對底層的驅動的深入了解就能夠做出很好的圖形。對於用戶而言,它和/dev 下面的其他設備沒有什麼區別,用戶可以把framebuffer 看成一塊內存,既可以向這塊內存中寫入數據,也可以從這塊內存中讀取數據。
       第一個被註冊的framebuffer 的minor 等於0,第二個被註冊的framebuffer的minor 等於1,以此類推。

framebuffer 內部結構
數據結構:framebuffer 設備很大程度上依靠了下面四個數據結構。這三個結構
在fb.h 中聲明。
Struct fb_var_screeninfo
Struct fb_fix_screeninfo
Struct fb_info
第一個結構是用來描述圖形卡的特性的。通常是被用戶設置的。
第二個結構定義了圖形卡的硬體特性,是不能改變的,用戶選定了哪一個圖形卡,那麼它的硬體特性也就定下來了。第三個結構定義了當前圖形卡framebuffer 設備的獨立狀態,一個圖形卡可能有兩個framebuffer, 在這種情況下,就需要兩個fb_info 結構。這個結構是唯一在內核空間可見的。

設計自己的framebuffer 設備驅動
用戶首先需要添加下面的代碼到fbmem.c
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif
其次在xxfb.c 中根據自己的需要重新分配顯存大小。例如: #define VIDEOMEMSIZE (1*1024*1024) /* 1 MB */再次根據自己的硬體設備修改相應的var 信息。主要修改xxfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)函數。

如何添加framebuffer 設備驅動
    首先在config.in 文件中添加一行代表用戶自己驅動的選項。具體做法請參考config.in的幫助文檔。
    在make menuconfig 的時候首先進入Character devices,選中裡面的Virtual terminal 和Support for console on virtual terminal.退到上一層界面我們就可以看到Console device 的選項,進入后將游標落在Framebuffer Support 上,按回車鍵進入,在裡面選擇自己所需要的framebuffer設備即可。自己所添加的設備驅動的類型(如果在uclinux 下,應該以*選中,而不是M選中),在編譯的時候就會產生相應的o文件。
  在Advanced low level 中可以配置bpp packed pixel support,然後選中Select compiled-in fonts 即可。等操作系統運行以後就會在/dev 下面看到fb 這個設備。它的major 應該是29,第一個設備的minor 應該是0。

如何使用framebuffer 設備
   
  我們可以在幾個支持圖形顯示的平台上開發一些圖形界面。例如microwindows,minigui,Qtembed,等等。在這裡我們就不詳細介紹具體做法,感興趣的朋友可以到我們網站上下載。這裡我們假設用戶已經通過tftp 或者mount 命令將測試例子demo 傳到/var/test 目錄下。在/test 目錄下啟動後台服務程序./nano-X &,這時可以看到屏幕有一個閃動,然後會變為黑色,接著就可以運行測試程序了,執行./demo 即可.




[admin via 研發互助社區 ] uClinux 下的framebuffer設備驅動已經有1324次圍觀

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