framebuffer设备驱动的几个连接关键点
framebuffer的架构
见到的宋宝华老师总结的一个图表,觉得很清晰,直接移过来了
关键点点析
- 文件
driver/video/fbmem.c
中的file_operations结构体 - 文件
xxxfb.c
,对应于各具体厂商的framebuffer驱动,我这边看的是fsl的驱动,名字是drivers/video/mxc/mxc_ipuv3_fb.c
- 在文件
xxxxfb.c
中的重要结构体为fb_info
,用来连接到文件driver/video/fbmem.c
中,连接的函数就是register_framerbuffer
和unregister_framerbuffer
。所以在xxxxfb.c
中找入口,连接上下层的东西就在这个结构体和两个函数入口。 - 应用层的操作入口,例如读、写、控制等,在文件
xxxxfb.c
中实现,通过结构体fb_info
的fbops
(类型为struct fb_ops
)成员来连接。所以驱动最主要的是要实现结构体struct fb_ops
成员的填充。以下根据实例代码,描述连接。
实例代码
文件drivers/video/mxc/mxc_ipuv3_fb.c
static struct fb_ops mxcfb_ops = { /* 注册关键的操作函数 11111111111 */
.owner = THIS_MODULE,
.fb_set_par = mxcfb_set_par,
.fb_check_var = mxcfb_check_var,
.fb_setcolreg = mxcfb_setcolreg,
.fb_pan_display = mxcfb_pan_display,
.fb_ioctl = mxcfb_ioctl,
.fb_mmap = mxcfb_mmap,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_blank = mxcfb_blank,
};
......
static struct fb_info *mxcfb_init_fbinfo(struct device *dev, struct fb_ops *ops) /* 333333333 */
{
struct fb_info *fbi;
struct mxcfb_info *mxcfbi;
/*
* Allocate sufficient memory for the fb structure
*/
fbi = framebuffer_alloc(sizeof(struct mxcfb_info), dev);
if (!fbi)
return NULL;
mxcfbi = (struct mxcfb_info *)fbi->par;
fbi->var.activate = FB_ACTIVATE_NOW;
fbi