嵌入式Linux设备驱动程序开发指南(原书第2版)
上QQ阅读APP看书,第一时间看更新

4.11 杂项字符设备驱动

杂项框架是Linux内核提供的一个接口。该框架允许模块注册其各自的从设备编号。

通过杂项框架实现的字符设备驱动使用Linux内核为杂项设备分配主设备编号。这样可以避免为驱动定义一个专门的主设备编号。这一点很重要,因为主设备编号冲突的可能性与日俱增。使用杂项设备类别是一个避免该冲突的有效策略。对于每一个被侦测到的设备,系统动态地分配一个从设备编号。这个设备也会以一个目录的形式出现在sysfs虚拟文件系统的/sys/class/misc/目录下。

官方分配给杂项驱动的主设备编号是10。对于只需要一个文件系统目录的小型设备,模块可以通过杂项驱动注册独有的从设备编号并管理。

注册一个从设备编号

杂项设备是通过包含在include/linux/miscdevice.h中的miscdevice数据结构定义的:

090-02

其中:

  • minor是请求的从设备编号。
  • name是设备名称,通过/proc/misc文件查看。
  • fops是一个指向file_operations数据结构的指针。
  • parent是一个指向device数据结构的指针,用于表示由该驱动暴露的硬件设备。

杂项驱动导出两个函数,misc_register()misc_deregister(),用于注册/注销对应的从设备编号。这些函数在include/linux/miscdevice.h文件中定义其函数原型,drivers/char/misc.c文件中则定义了具体实现:

091-01

misc_register()函数向内核注册一个杂项设备。如果从设备编号被设置为MISC_DYNAMIC_MINOR,那么系统会动态分配一个从设备编号并存放在miscdevice数据结构中的minor字段。对于其他情况则使用请求的从设备编号。

传递进来的数据结构会被内核持续引用,直到设备注销时该数据结构才会被销毁。默认情况下,针对设备执行open()系统调用时,会将file->private_data指向该数据结构。驱动不需要在fopsopen接口中做相应的赋值操作。成功返回0,失败则返回一个负的错误码。

动态分配从设备编号的典型代码顺序如下:

091-02