misc子系统
转载请注明出处:http://blog.youkuaiyun.com/wang_zheng_kai
光源器件与系统研究所
个人学习总结
1、在linux系统中什么是misc?
在研究摄像头驱动的时候,发现摄像头驱动的路径为:/driver/misc/jz_cim/文件目录下,经过查找结果如下:
杂项设备(misc device)
杂项设备也是嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的,只不过misc是将一些字符设备存放在misc类中。换句话说,misc设备其实也就是特殊的字符设备。
2、linux内核杂项设备驱动源码分析
在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中,misc设备的初始化,注册,注销都在这个文件中。在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。
我们首先先来看misc设备的结构体的描述:
代码位于:android-4.1/kernel/include/linux/miscdevice.h,该文件中还有所有misc设备的次设备号的宏定义。
struct miscdevice {
intminor; //次设备号
const char*name; //设备的名称
const structfile_operations *fops; //文件操作
structlist_head list; //misc_list的链表头
struct device*parent; //父设备(Linux设备模型中的东东了,哈哈)
struct device*this_device; //当前设备,是device_create的返回值,下边会看到
constchar *nodename;
mode_tmode;
};
这个结构体是misc设备基本的结构体,在注册misc设备的时候必须要声明并初始化一个这样的结构体,但其中一般只需填充name minor fops字段就可以了。下面就是led驱动程序中初始化miscdevice的代码: