MISC类设备驱动
随笔--MISC类设备驱动
misc类设备的本质是字符设备,在驱动框架中使用register_chrdev注册了一个主设备号为10的设备
[TOC]
misc类设备介绍
- 何为misc
(1)中文名:杂散设备
(2)/sys/class/misc
(3)典型的字符设备。misc是对原始的字符设备注册接口的一个类层次的封装,很多典型字符设备都可以归类到misc类中,使用misc驱动框架来管理
(4)像LED一样也有一套驱动框架,内核实现一部分(misc.c,led是led-class.c),驱动实现一部分(x210-buzzer.c)
- 涉及文件
/drivers/char/misc.c
/driver/char/buzzer/x210-buzzer.c
misc驱动框架源码分析
源码框架的主要工作:注册misc类,使用老接口注册字符设备(主设备号10),开放device注册的接口misc_register给驱动工程师
####驱动框架模块的注册
在框架中使用
register_chrdev
注册了一个主设备号为10的设备,而在设备驱动中device_create
创建设备文件主设备号都为10,次设备号不同,从而实现分类(分为misc类)。我们也可以模仿这种方式创建自己的分类,但是其实不简单,还有好多东西需要积累!
以下文件位于/drivers/char/misc.c:
misc_open:分析misc_open,发现其最终指向某一个设备对应的miscdevice结构体变量中的file_operations结构体变量
中的open。(没具体分析应用层打开misc类设备是通过这里的open间接调用具体的open,还是直接调用某一具体misc设备的open)
####开放出来的注册接口
misc_register
以下文件位于/drivers/char/misc.c:
struct miscdevice:misc类设备的抽象
misc_list:内核维护的管理misc设备类的链表,将来添加一个设备就往这个链表添加相应的miscdevice的结构体变量的地址(指针)
misc设备驱动源码分析
####以misc类设备蜂鸣器为例
定义一个
struct miscdevice
结构体变量并进行填充,然后调用驱动框架提供的misc_register
进行注册。
下列代码位于/driver/char/buzzer/x210-buzzer.c:
miscdevice:
x210_pwm_ioctl:
x210_pwm_open/x210_pwm_close:
static struct semaphore lock
/down_trylock(&lock)
/up(&lock)
:信号量使用旧式接口,关于信号量的使用可以看内核源码如何使用
####板载蜂鸣器驱动测试
确认/dev目录下有buzzer设备,没有需要make menuconfig 进行配置(确保子Makefile和子Kconfig相关变量相一致)
简单测试app_buzzer.c:
注意0:关于文中涉及到的内核链表可以参考这篇文章《内核链表实现分析与使用(双向环形链表)》
注意1:register_chrdev和device_creator的区别。register_chrdev是向内核维护的一个指针数组添加一个字符设备抽象对应的地址,来注册驱动;device_create是利用给的设备号和类名去创建设备文件(创建后的设备文件位于/dev)。
注意2:分析LED驱动框架源码的时候,并没有register_chrdev,只有class_create和device_creator,而且走的是attribute路线。所以用attribute方式实现的驱动只能通过/sys/class下的文件进行访问,详细可以查看这篇文章谈论attribute驱动实现方式(及device_create与设备节点的关系)