2019独角兽企业重金招聘Python工程师标准>>>
混杂设备是字符设备的一种,混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备。
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;
};
通常情况下,一个字符设备都在初始化的过程中的步骤:
1,通过alloc_chrdev_region()分配主/次设备号。2,使用cdev_init()和cdev_add()来以一个字符设备注册自己。 详细介绍见http://my.oschina.net/u/274829/blog/283702
而一个misc驱动,则可以只用一个调用misc_register()来完成这所有的步骤。
使用流程
static int __init dev_init(void)
{int ret;ret = misc_register(&misc); //注册设备号return ret;
}
设备结构
static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR, //这里注意,一般分配为0,意思:让系统自动分配,防止冲突.name = DEVICE_NAME,.fops = &dev_fops,
};
文件操作集
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;}
}
退出注册
static void __exit dev_exit(void)
{misc_deregister(&misc); //退出设备printk (DEVICE_NAME"\tuninstalled\n");
}
详细应用例程见ok6410-led流水灯控制文件 http://my.oschina.net/u/274829/blog/267552