LCD & framebuffer開發心得


本文轉自 http://blogold.chinaunix.net/u2/70445/showart_2098725.html

 


幀緩衝設備屬於字符設備,採用了 文件層-驅動層 的接口方式。 Linux 爲幀緩衝設備定義的驅動層接口爲 struct fb_info 結構。在文件層次上, Linux 爲其定義了下面的操作函數: struct file_operations

軟件運行流程 :
在文件層次上 , 用戶調用 struct file_operations 的函數操作 , struct file_operations 中間接調用 struct fb_ops 的函數來操作硬件 . 當向內核註冊 FB 設備的時候 , 也註冊了 struct fb_ops 的指針 . 當打開 fb 設備時 , 先調用 fb_drivers[] xxxfb_init() 來初始化設備 ;

1
、開發步驟和框架

涉及的文件: fb.h, fbmem.c, xxxfb.c.
fb.h:
定義了一些結構 , 變量和宏 ;

fbmem.c:
主要實現設備入口和初始化 , struct file_operations;
入口點 :
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
文件操作 :
static struct file_operations fb_fops = {
owner: THIS_MODULE,
read: fb_read,
write: fb_write,
ioctl: fb_ioctl,
mmap: fb_mmap,
open: fb_open,
release: fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
get_unmapped_area: get_fb_unmapped_area,
#endif
};
xxxfb.c:
自己添加的設備驅動文件 , struct fb_info;
實現入口點函數 : xxxfb_init; xxxfb_setup;

static struct fb_ops xxxfb_ops = {
owner: THIS_MODULE,
fb_open: xxxfb_open, /* only if you need it to do something */
fb_release: xxxfb_release, /* only if you need it to do something */
fb_get_fix: fbgen_get_fix,
fb_get_var: fbgen_get_var,
fb_set_var: fbgen_set_var,
fb_get_cmap: fbgen_get_cmap,
fb_set_cmap: fbgen_set_cmap,
fb_pan_display: fbgen_pan_display,
fb_ioctl: xxxfb_ioctl, /* optional */
};


2
、什麼是 framebuffer 設備

framebuffer
是一種能夠提取圖形的硬件設備,是用戶進入圖形界面很好的接口。有了 framebuffer ,用戶的應用程序不需要對底層的驅動的深入瞭解就能夠做出很好的圖形。

對於用戶而言,它和 /dev 下面的其他設備沒有什麼區別,用戶可以把

framebuffer
看成一塊內存,既可以向這塊內存中寫入數據,也可以從這塊內存中讀取數據。

第一個被註冊的 framebuffer minor 等於 0 ,第二個被註冊的 framebuffer minor 等於 1 ,以此類推。

3
framebuffer 內部結構

數據結構: framebuffer 設備很大程度上依靠了下面四個數據結構。這三個結構在 fb.h 中聲明。
Struct fb_var_screeninfo
Struct fb_fix_screeninfo
Struct fb_info
第一個結構是用來描述圖形卡的特性的。通常是被用戶設置的。它包括顯示屏幕的分辨率、每個像素的比 特數和一些時序變量。其中變量 xres 定義了屏幕一行所佔的像素數, yres 定義了屏幕一列所佔的 像素數, bits_per_pixel 定義了每個像素用多少個位來表示。
第二個結構定義了圖形卡的硬件特性,是不能改變的,用戶選定了哪一個圖形卡,那麼它的硬件特性也就 定下來了。它包含了屏幕緩衝區的物理地址和長度。
第三個結構是 Linux 爲幀緩衝設備定義的驅動層接口。它不僅包含了底層函數,而且還有記錄設備狀態的 數據。每個幀緩衝設備都與一 fb_info 結構相對應。其中成員變量 modename 爲設備名稱, fontname 爲顯示字體, fbops 爲指向底層操作的函數的指針。定義了當前圖形卡 framebuffer 備的獨立狀態,一個圖形卡可能有兩個 framebuffer 在這種情況下,就需要兩個 fb_info 結構 。這個結構是唯一在內核空間可見的。

4
、設計自己的 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)
函數。

5
、如何添加 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章