linux显卡驱动之fb_ops

来源:互联网 发布:更改windows桌面路径 编辑:程序博客网 时间:2024/04/20 03:13

fb_ops是fb_info结构体中的一个重要成员变量

原型定义在linux/fb.h文件中,定义如下:

/* * Frame buffer operations * * LOCKING NOTE: those functions must _ALL_ be called with the console * semaphore held, this is the only suitable locking mechanism we have * in 2.6. Some may be called at interrupt time at this point though. * * The exception to this is the debug related hooks.  Putting the fb * into a debug state (e.g. flipping to the kernel console) and restoring * it must be done in a lock-free manner, so low level drivers should * keep track of the initial console (if applicable) and may need to * perform direct, unlocked hardware writes in these hooks. */struct fb_ops {/* open/release and usage marking */struct module *owner;int (*fb_open)(struct fb_info *info, int user);int (*fb_release)(struct fb_info *info, int user);/* For framebuffers with strange non linear layouts or that do not * work with normal memory mapped access */ssize_t (*fb_read)(struct fb_info *info, char __user *buf,   size_t count, loff_t *ppos);ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,    size_t count, loff_t *ppos);/* checks var and eventually tweaks it to something supported, * DO NOT MODIFY PAR */int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);/* set the video mode according to info->var */int (*fb_set_par)(struct fb_info *info);/* set color register */int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,    unsigned blue, unsigned transp, struct fb_info *info);/* set color registers in batch */int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);/* blank display */int (*fb_blank)(int blank, struct fb_info *info);/* pan display */int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);/* Draws a rectangle */void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);/* Copy data from area to another */void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);/* Draws a image to the display */void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);/* Draws cursor */int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);/* Rotates the display */void (*fb_rotate)(struct fb_info *info, int angle);/* wait for blit idle, optional */int (*fb_sync)(struct fb_info *info);/* perform fb specific ioctl (optional) */int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,unsigned long arg);/* Handle 32bit compat ioctl (optional) */int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,unsigned long arg);/* perform fb specific mmap */int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);/* get capability given var */void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,    struct fb_var_screeninfo *var);/* teardown any resources to do with this framebuffer */void (*fb_destroy)(struct fb_info *info);/* called at KDB enter and leave time to prepare the console */int (*fb_debug_enter)(struct fb_info *info);int (*fb_debug_leave)(struct fb_info *info);};
内核头文件中并没有详细说明每个函数的作用,以及哪些函数是必须的,哪些函数是可选的。

经过实际测试,我将我的测试结果和总结写出来,供其他人参考。

最简洁fb_ops:

struct fb_ops s3cfb_ops = {    .fb_set_par= s3cfb_set_par,    .fb_setcolreg= s3cfb_setcolreg,    .fb_imageblit= cfb_imageblit,};

这样定义后,就可以在内核启动时出现久违的企鹅图像。fb_set_par肯定是必须的,这个函数设置显卡相关的一些参数fb_setcolreg暂时没搞清楚这个函数到底用来干什么的,但去掉屏幕上就什么都没有了(内核可以正常启动)fb_imageblit图像数据位传送函数,这是显卡控制台(console)的主要实现函数,需要按函数参数给定内容完成数据移动,内核里面默认实现了这一函数——cfb_imageblit,但需要人为调用,该函数定义在drivers/video/cfbimgblt.c文件中。需要说明的是,若该函数为给出,则内核无法完成启动。




原创粉丝点击