定义一个misc 设备,一般只需要填充minor、name、fops 这三个成员变量。
minor指次设备号,可以从“内核源码/include/linux/miscdevice.h”文件中预定义的次设备号挑选,也可以自行定义子设备号(没有被其他设备使用即可),通常情况下将该参数设置为MISC_DYNAMIC_MINOR,表示自动分配子设备号。
name表示misc设备的名字。misc设备驱动注册成功之后,会在dev目录下生成名为name的设备节点。
fops 指向了file_operations的结构体,表示字符设备的操作集合。
13.2 杂项设备的注册和卸载
不同于字符设备的注册和卸载的繁琐,杂项设备的注册可以直接使用函数misc_register函数来完成,杂项设备的卸载可以直接使用misc_deregister函数来完成。上述两个函数均定义在“内核源码/include/linux/miscdevice.h”文件当中。
杂项设备的注册:
函数原型:
int misc_register(struct miscdevice *misc)
函数作用:
基于misc_class构造一个设备,将miscdevice结构挂载到misc_list列表上,并初始化与linux设备模型相关的结构。进而起到杂项设备注册的作用。
参数含义:
misc: 杂项设备的结构体指针
函数返回值:申请成功返回0,申请失败返回负数
杂项设备的卸载:
函数原型:
int misc_deregister(struct miscdevice *misc)
函数作用:
从mist_list中删除miscdevice,进而起到杂项设备卸载的作用。
参数含义:
misc: 杂项设备的结构体指针
**函数返回值:**卸载成功返回0,申请失败返回负数
至此,注册和卸载杂项设备的API函数就讲解完成了,会在接下来的驱动章节中对上述函数进行具体使用。
13.3 杂项设备驱动框架
MISC驱动一般使用以下结构:
13.4 实验程序的编写
本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\08。
本小节将编写最简单的misc驱动,在驱动入口函数中通过misc_register(…)函数注册杂项设备驱动,在驱动出口函数中通过misc_deregister(…)函数注销杂项设备驱动。编写完成的miscdevice.c代码如下所示:
13.5 运行测试在上一小节中的miscdevice.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下所示:
Makefile保存退出之后,来到存放miscdevice.c和Makefile文件目录下,如下图(图13-1)所示:
然后使用命令“make”进行驱动的编译,编译完成如下图(图 13-2)所示:
编译完生成 miscdevice.ko目标文件,如下图(图 13-3)所示:
至此我们的驱动模块就编译成功了,下面进行驱动的运行测试。
可以看到驱动加载之后,打印“misc registe is succeed”,说明misc驱动注册成功。输入以下命令查看加载的驱动模块,驱动加载成功如下(图13-5)所示:
然后来到/sys/class/misc目录下,可以看到名为“test”的文件夹已经被创建了,在/sys/class/misc目录下有misc类的所有设备,每个注册的杂项设备对应一个文件夹目录,如下图(图13-6)所示:
驱动加载成功之后会生成/dev/test设备驱动文件,输入以下命令查看杂项设备的主次设备号。
结果如下图(图 13-8)所示:
从上图可以看出,/dev/test这个杂项设备的主设备号为10,次设备号为53,最后可以使用以下命令对驱动进行卸载,卸载完成如下图(图 13-9)所示:
更多内容:B站搜索迅为RK3568开发板