本文转自: 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); }; |