本文分析了frame buffer 设备驱动的主要数据结构: |
基本原理
写 framebuffer 驱动程序要做什么
什么是 frame buffer 设备frame buffer 设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。 设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*。 更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。 Linux Frame Buffer 驱动程序层次结构Frame Buffer 设备驱动可以从三个层次来看:
在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们处于 frame buffer 驱动体系结构的中间层,它为上层的用户程序提供系统调用,也为底层特定硬件驱动提供了接口:
数据结构头文件 fb.h 定义了所有的数据结构:
接口fbmem.c 实现了所有驱动使用的通用代码,避免了重复。 全局变量: struct fb_info *registered_fb [FB_MAX] int num_registered_fb; 这两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info 结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加 1。 fb_drivers 数组: static struct { const char *name; int (*init)(void); int (*setup)(void); } fb_drivers[] __initdata= { ....}; 若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod 动态加载到内核,则不必关心这个结构。 static struct file_operations fb_ops ={ owner: THIS_MODULE, read: fb_read, write: fb_write, ioctl: fb_ioctl, mmap: fb_mmap, open: fb_open, release: fb_release }; 这是用户应用程序的接口,fbmem.c 实现了这些函数。 register/unregister framebuffer: register_framebuffer(struct fb_info *fb_info) unregister_framebuffer(struct fb_info *fb_info) 这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info 结构,然后注册它。 |