接上回目。上篇文章讲完了"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_MAJOR在kernel源码/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设备的各个函数。后面我们会逐一分析。