轉貼
http://www.hzlitai.com.cn/bbs/dispbbs.a ... n=0&Star=1
再來一篇關於framebuffer的文章這篇好像rao版主發過,
覺得比較簡練再貼一次吧:uClinux 的framebuffer簡介下面的內容主要是關於framebuffer 的一些知識, 主要是根據我們實際開發過程中的一些體會,其中難免錯漏之處, 歡迎指正。
什麼是framebuffer 設備
framebuffer 是一種能夠提取圖形的硬件設備,是用戶進入圖形界面很好的接口。
有了framebuffer,用戶的應用程序不需要對底層的驅動的深入瞭解就能夠做出很好的圖形。對於用戶而言,它和/dev 下面的其他設備沒有什麼區別,用戶可以把framebuffer 看成一塊內存,既可以向這塊內存中寫入數據,也可以從這塊內存中讀取數據。第一個被註冊的framebuffer 的minor 等於0,第二個被註冊的framebuffer的minor 等於1,以此類推。
framebuffer 內部結構
數據結構:framebuffer 設備很大程度上依靠了下面四個數據結構。這三個結構在fb.h 中聲明。Struct fb_var_screeninfoStruct fb_fix_screeninfoStruct fb_info
第一個結構是用來描述圖形卡的特性的。通常是被用戶設置的。
第二個結構定義了圖形卡的硬件特性,是不能改變的,用戶選定了哪一個圖形卡,那麼它的硬件特性也就定下來了。
第三個結構定義了當前圖形卡framebuffer 設備的獨立狀態,一個圖形卡可能有兩個framebuffer, 在這種情況下,就需要兩個fb_info 結構。這個結構是唯一在內核空間可見的。
設計自己的framebuffer
設備驅動用戶首先需要添加下面的代碼到fbmem.cstatic 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 中根據自己的需要重新分配顯存大小。
例如: #defineVIDEOMEMSIZE (1*1024*1024) /* 1 MB */再次根據自己的硬件設備修改相應的var 信息。
主要修改xxfb_set_var(structfb_var_screeninfo *var, int con, struct fb_info *info)函數。
如何添加framebuffer 設備驅動
在make menuconfig 的時候首先進入Character devices,選中裡面的Virtualterminal.如果希望控制台在液晶上輸出,則選中Support for console on virtual terminal。
(選用了msh(minix shell),再在rc中放入了一條sh < /dev/ttyS0,通過串口輸入的鍵值顯示輸出就能在LCD上顯示了。)退到上一層界面我們就可以看到Console device 的選項,進入後將光標落在Framebuffer Support 上,按回車鍵進入,在裡面選擇自己所需要的framebuffer設備即可。
自己所添加的設備驅動的類型(如果在uclinux 下,應該以*選中,而不是M 選中),在編譯的時候就會產生相應的.o 文件。
在Advanced low level 中可以配置bpp packed pixel support,然後選中Selectcompiled-in fonts 即可。
等操作系統運行以後就會在/dev 下面看到fb 這個設備。它的major 應該是29,第一個設備的minor 應該是0。
如何使用framebuffer
設備我們可以在幾個支持圖形顯示的平台上開發一些圖形界面。例如microwindows,minigui,Qtembed,等等。