日期:2014-05-16 浏览次数:20774 次
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127
3.3 LCD文件层
帧缓冲设备作为一个字符设备,其文件操作函数就定义在文件层fbmem.c中
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read, //读
.write = fb_write, //写
.unlocked_ioctl = fb_ioctl, //控制
#ifdef CONFIG_COMPAT
.compat_ioctl = fb_compat_ioctl,
#endif
.mmap = fb_mmap, //映射
.open = fb_open, //打开
.release = fb_release, //释放
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
.fsync = fb_deferred_io_fsync,
#endif
};
帧缓冲设备驱动的文件操作接口已经在fbmem.c中被统一实现了,一般不需要驱动工程师编写了。对于这个fbmem.c文件,它一方面在我们的帧缓冲文件层为用户提供了访问接口函数,一方面还设计了一些供内核其他函数调用的接口函数,例如register_framebuffer、fb_set_var和fb_blank等。
用户空间对帧设备的操作主要包括open、close、ioctl和mmap实现,下面我们主要看看ioctl和mmap的实现
static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct inode *inode = file->f_path.dentry->d_inode;
int fbidx = iminor(inode); //获得索引号
struct fb_info *info = registered_fb[fbidx]; //获取fb_info结构体
return do_f