本文轉自: http://www.linuxidc.com/Linux/2011-03/33600.htm
一、開發環境
- 主 機:VMWare--Fedora 9
- 開發板:Mini2440--64MB Nand, Kernel:2.6.30.4
- 編譯器:arm-linux-gcc-4.3.2
1. 幀緩衝設備驅動在Linux子系統中的結構如下:
我們從上面這幅圖看,幀緩衝設備在Linux中也可以看做是一個完整的子系統,大體由fbmem.c和xxxfb.c組成。向上給應用程序提供完善的設備文件操作接口(即對FrameBuffer設備進行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中實現;向下提供了硬件操作的接口,只是這些接口Linux並沒有提供實現,因爲這要根據具體的LCD控制器硬件進行設置,所以這就是我們要做的事情了(即xxxfb.c部分的實現)。
2. 幀緩衝相關的重要數據結構:
從幀緩衝設備驅動程序結構看,該驅動主要跟fb_info結構體有關,該結構體記錄了幀緩衝設備的全部信息,包括設備的設置參數、狀態以及對底層硬件操作的函數指針。在Linux中,每一個幀緩衝設備都必須對應一個fb_info,fb_info在/linux/fb.h中的定義如下:(只列出重要的一些)
struct fb_info { int node; int flags; struct fb_var_screeninfo var;/*LCD可變參數結構體*/ struct fb_fix_screeninfo fix;/*LCD固定參數結構體*/ struct fb_monspecs monspecs; /*LCD顯示器標準*/ struct work_struct queue; /*幀緩衝事件隊列*/ struct fb_pixmap pixmap; /*圖像硬件mapper*/ struct fb_pixmap sprite; /*光標硬件mapper*/ struct fb_cmap cmap; /*當前的顏色表*/ struct fb_videomode *mode; /*當前的顯示模式*/
#ifdef CONFIG_FB_BACKLIGHT struct backlight_device *bl_dev;/*對應的背光設備*/ struct mutex bl_curve_mutex; u8 bl_curve[FB_BACKLIGHT_LEVELS];/*背光調整*/ #endif #ifdef CONFIG_FB_DEFERRED_IO struct delayed_work deferred_work; struct fb_deferred_io *fbdefio; #endif
struct fb_ops *fbops; /*對底層硬件操作的函數指針*/ struct device *device; struct device *dev; /*fb設備*/ int class_flag; #ifdef CONFIG_FB_TILEBLITTING struct fb_tile_ops *tileops; /*圖塊Blitting*/ #endif char __iomem *screen_base; /*虛擬基地址*/ unsigned long screen_size; /*LCD IO映射的虛擬內存大小*/ void *pseudo_palette; /*僞16色顏色表*/ #define FBINFO_STATE_RUNNING 0 #define FBINFO_STATE_SUSPENDED 1 u32 state; /*LCD的掛起或恢復狀態*/ void *fbcon_par; void *par; };
|
其中,比較重要的成員有struct fb_var_screeninfo var、struct fb_fix_screeninfo fix和struct fb_ops *fbops,他們也都是結構體。下面我們一個一個的來看。
struct fb_ops {
struct module *owner;
//檢查可變參數並進行設置 int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);
//根據設置的值進行更新,使之有效 int (*fb_set_par)(struct fb_info *info);
//設置顏色寄存器 int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info);
//顯示空白 int (*fb_blank)(int blank, struct fb_info *info);
//矩形填充 void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
//複製數據 void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
//圖形填充 void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image); };
|