混雜設備是字符設備的一種,混雜設備(用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