Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。
miscdevice共享一个主设备号MISC_MAJOR
(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations
结构中注册的文件操作接口进行操作。 在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations
结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中,misc装备的初始化,注册,注销都在这个文件中。在内核中,misc杂项装备驱动接口是对一些字符装备的简单封装,它们同享一个主装备号,有不同的次装备号,同享一个open调用,其他的操作函数在打开后应用linux驱动程序的方法重载进行装载。
misc的设备结构体定义在头文件linux/miscdevice.h里面
struct miscdevice {
int minor; //misc设备的次设备号,misc设备主要依赖minor去区分
const char *name; //设备名
const struct file_operations *fops; //驱动主体处理函数入口指针
struct list_head list; //内核有misc list链表
struct device *parent;
struct device *this_device; //当前装备
const struct attribute_group **groups;
const char *nodename; //在/dev下面创建的设备驱动节点
umode_t mode;
};
在misc.c中misc_init
这个就是misc驱动模型的入口
static int __init misc_init(void)
{
int err;
struct proc_dir_entry *ret;
ret = proc_create("misc", 0, NULL, &misc_proc_fops);//创建misc的proc入口
misc_class = class_create(THIS_MODULE, "misc");//在/sys/class/目录下创建名为misc的类
err = PTR_ERR(misc_class);
if (IS_ERR(misc_class))
goto fail_remove;
err = -EIO;
///注册设备,其中设备的主设备号为MISC_MAJOR为10。设备名为misc,misc_fops是操作函数的集合
if (register_chrdev(MISC_MAJOR,"misc",&misc_fops))
goto fail_printk;
misc_class->devnode = misc_devnode;
return 0;
fail_printk:
printk("unable to get major %d for misc