混杂设备是字符设备的一种,混杂设备(用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