混杂设备驱动程序是那些简单的字符驱动程序,它们拥有一些相同的特性。内核将这些共同行抽象至一个API中(具体实现代码见 drivers/char/misc),这些简化了驱动程序的初始化的方式。所有的混杂设备都被分配一个主设备号10,但每个设备可选择一个单独的次设备号。
普通的字符驱动程序完成初始化的顺序如下。
1,通过alloc_chrdev_region()及相关函数分配主/次设备号。
2,使用device_create()创建/dev和/sys节点。
3,使用cdev_init()和cdev_add()将自身注册为字符驱动程序。
混杂驱动只需要调用misc_register()即可完成字符驱动的所有步骤:
static struct misdevice mydrv_dev={
MYDRV_MINOR,
"mydrv",
&mydrv_fops
};
misc_register(&mydrv_dev);
其中MYDRV_MINOR是静态分配给混杂驱动程序的次设备号。也可以在mydrv_dev机构中通过指定MISC_DYNAMIC_MINOR而不是MYDRV_MINOR以要求动态分配的次设备号。每一个混杂驱动程序自动出现在/sys/class/misc 文件中。
下面以友善6410提供的buttons驱动来说明一下。
#define DEVICE_NAME "buttons"
..
..
..
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.open = s3c64xx_buttons_open,
.release = s3c64xx_buttons_close,
.read = s3c64xx_buttons_read,
.poll = s3c64xx_buttons_poll,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,//动态分配次设备号
.name = DEVICE_NAME,//设备名
.fops = &dev_fops,//文件操作的方法
};
static int __init dev_init(void)
{
int ret;
ret = misc_register(&misc);//设备初始化
printk (DEVICE_NAME"/tinitialized/n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
总的来看混杂设备驱动程序主要是简化了驱动程序初始化的方式。
主要是参考<