基于misc框架的驱动分析
所谓的misc设备,就是很难于分类的杂散类设备,比如蜂鸣器、adc等。
一般来说,misc设备都是字符设备,所以led也能划分入misc设备,led驱动也能用misc设备驱动实现,这也印证了驱动的实现是自由的。
其本质是:通过读写/dev内的设备文件,来间接访问file_operations结构体内的函数,从而实现操作硬件
通过对比普通字符设备驱动的结构图,我们不难发现,misc框架是对普通字符设备驱动的一次封装罢了,它们从本质上并没有什么不同
值得注意的一点:因为历史原因,在这个版本的misc框架中,所有的misc设备公用一个主设备号(都是10),它们之间以次设备号互相区分。所以在框架中使用register_chrdev注册了一个主设备号为10的设备,而在驱动中device_create创建设备文件主设备号都为10,次设备号不同
1.misc框架接口的使用条件
- 如果要使用内核的框架来写驱动的话,必须要在menuconfig中添加框架模块,这样才能够调用框架接口函数
2.misc框架接口的实现原理
- misc.c这个文件提供了有关misc框架的接口,里面是misc框架模块
- misc_init是框架模块的加载函数,它主要负责了创建misc类,和misc设备的注册
static int __init misc_init(void)
{
/*无关代码就不贴了*/
...
/*创建misc类*/
misc_class = class_create(THIS_MODULE, "misc");
/*无关代码就不贴了*/
...
/*misc设备的注册*/
if (register_chrdev(MISC_MAJOR,"misc",&misc_fops))
goto fail_printk;
misc_class->devnode = misc_devnode;
return 0;
/*无关代码就不贴了*/
...
}
- 关于misc设备的注册,有一个值得注意的地方。因为历史原因,在这个版本的misc框架中,所有的misc设备公用一个主设备号(都是10),它们之间以次设备号互相区分。所以上面那段代码中,使用字符设备旧注册接口(详见两种注册方式),注册了一个名为misc的设备,其实是把我们所有的misc设备都注册了