Linux中Framebuffer驱动详解3

接上回目。上篇文章讲完了"kernel源码/drivers/video/fbmem.c中的fbmem_init()函数中的proc_create(),本章讲第二个调用函数:register_chrdev()

相信接触过驱动程序,尤其写过字符设备驱动程序的朋友们都知道,register_chrdev_region()和alloc_chrdev_region()用于向系统注册一个字符设备。

    int register_chrdev_region(dev_t from, unsigned count, const char *name);//静态申请和注册设备号

    int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);  //动态申请和注册设备号

    int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops);

在linux2.6里面,register_chrdev_region()是register_chrdev()的升级版本。

register_chrdev(FB_MAJOR,"fb",&fb_fops);这里只是用了老版本函数注册一个名为"fb"的字符设备而已。注册之后可以在"/proc/devices"和"/sys"中看到"fb"这一名字。

 

FB_MAJORkernel源码/include/linux/major.h中定义:

#define FB_MAJOR  29  /* /dev/fb* framebuffers */

以上说明framebuffer设备的主设备号为29,为字符设备。

fb_fops在同文件中定义:

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
 .llseek = default_llseek,
};

fb_fops中定义了操作framebuffer设备的各个函数。后面我们会逐一分析。

 

发布了34 篇原创文章 · 获赞 12 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/38706697
今日推荐