本文在上一篇文章《 Linux字符设备驱动模型之按键
》的基础上使用混杂设备驱动实现按键驱动,舍弃原有的方式使用通用字符设备驱动的方式实现按键驱动(注:混杂设备驱动也属于字符设备驱动)。
在Linux系统中,存在一类字符设备,他们拥有相同的主设备号(10),不同的次设备号,通常称这类设备为混杂设备(miscdevice)。所有的混杂设备链接形成一个链表,当需要访问设备时,内核会根据其次设备号查找到对应的混杂设备。
一、理论基础 .
1、概述
在Linux内核中,将无法归类的、五花八门的设备定义为混杂设备,使用struct
miscdevice结构体描述,他们共享一个主设备号MISC_MAJOR(即为10),根据次设备号的不同来表示不同的或者是另外的设备,每一个设备的描述结构struct
miscdevice组成一个链表。
对设备进行访问是,根据次设备号找到对应的struct miscdevice,然后调用其struct
file_operations结构中注册的操作接口进行具体的操作。
在Linux内核源码中,所有的混杂设备驱动存放在linux-3.0.8/drivers/misc目录下,描述并操作混杂设备的API在linux-3.0.8/drivers/char/misc.c中实现。
2、混杂设备驱动的描述
在Linux内核中,使用struct miscdevice 结构来描述一个混杂设备。
3、混杂设备驱动的注册
在Linux内核中使用misc_register函数来注册一个混杂设备驱动。原型为:int misc_register(struct miscdevice
- misc)
驱动注册的流程:
(1)匹配次设备号
(2)找一个没有被占用的次设备号(动态分配)或者指定一个次设备号
(3)计算设备号
(4)创建设备文件
(5)将miscdevice结构体添加到misc_list链表中。
4、混杂设备驱动的卸载
在Linux内核中使用misc_deregister函数来卸载一个混杂设备驱动。原型为:int misc_deregister(struct
miscdevice *misc)
驱动卸载流程:
(1)从misc_list中删除miscdevice
(2)删除设备文件
(3)位图位清0
二、混杂设备驱动代码分析
在这里跟上一篇文章《Linux字符设备驱动模型之按键》一样,使用按键Key1来进行举例。
1、混杂设备的注册与卸载
如上图可知,使用misc_register函数进行注册混杂设备,其中button_miscdev为struct miscdevice结构,原型如下:
如上图,设备名为“key”,次设备号为250。
2、其他关于设备的操作
如上图为中断服务程序。
三、实验现象
1、将驱动进行编译,得到miscdev_driver.ko驱动文件。将其拷贝到根文件系统中,使用命令insmod
miscdev_driver.ko将其加载到内核中,其会在根文件/dev/下生产名为key的设备文件,并且可以查设备号。
2、按下按键的现象
更多Linux教程请查看菜单
Linux字符设备驱动模型之操作函数集
Linux字符设备驱动模型之设备号
Linux字符设备驱动模型之框架解说
Linux字符设备驱动模型之字符设备驱动代码模板
Linux字符设备驱动模型之Linux内核模块参数
Linux字符设备驱动模型之字符设备初始化
Linux字符设备驱动模型之Linux内核驱动访问揭秘
Linux字符设备驱动模型之点亮LED灯
Linux字符设备驱动模型之在Linux内核源码中编写驱动
Linux字符设备驱动模型之按键