日期:2014-05-16  浏览次数:20774 次

Linux下的LCD驱动(二)

版权所有,转载请说明转自 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_framebufferfb_set_varfb_blank等。

用户空间对帧设备的操作主要包括opencloseioctlmmap实现,下面我们主要看看ioctlmmap的实现

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