混杂设备是字符设备的一种,混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不一样。 全部的miscdevice设备造成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备。node
struct miscdevice { int minor; //次设备号 const char *name; const struct file_operations *fops; //文件操做集 struct list_head list; struct device *parent; struct device *this_device; const char *nodename; mode_t mode; };
一般状况下,一个字符设备都在初始化的过程当中的步骤:this
1,经过alloc_chrdev_region()分配主/次设备号。2,使用cdev_init()和cdev_add()来以一个字符设备注册本身。 详细介绍见http://my.oschina.net/u/274829/blog/283702spa
而一个misc驱动,则能够只用一个调用misc_register()来完成这全部的步骤。.net
使用流程
code
static int __init dev_init(void) { int ret; ret = misc_register(&misc); //注册设备号 return ret; }
设备结构orm
static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, //这里注意,通常分配为0,意思:让系统自动分配,防止冲突 .name = DEVICE_NAME, .fops = &dev_fops, };
文件操做集
blog
static struct file_operations dev_fops = { .owner = THIS_MODULE, .ioctl = leds_ioctl, }; static int sbc2440_leds_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) { case 0: ....; break; default: return -EINVAL; } }
退出注册get
static void __exit dev_exit(void) { misc_deregister(&misc); //退出设备 printk (DEVICE_NAME"\tuninstalled\n"); }
详细应用例程见ok6410-led流水灯控制文件 http://my.oschina.net/u/274829/blog/267552cmd