一、杂项设备
先看杂项设备结构定义linux/miscdevice.h:
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;
umode_t mode;
};
注册杂项设备使用misc_register函数,原型如下:
int misc_register(struct miscdevice * misc);
注销杂项设备使用misc_deregister函数,原型如下:
int misc_deregister(struct miscdevice *misc);
二、实例
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = sbc2440_leds_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
...
ret = misc_register(&misc);
...
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
以上来自mini2440 led驱动中的一个例子。
三、原理
在杂项设备的misc_init函数中,创建了一个misc class,同时注册了一个字符设备驱动,该字符设备的主设备号为10,在调用misc_register函数去注册一个杂项设备时,最终会创建一个设备节点,如果杂项设备的minor为MISC_DYNAMIC_MINOR,表示由系统分配一个次设备号。所以杂项设备最终还是主设备号为10的一个字符设备驱动。