瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
第11章 创建设备节点实验
在上两个章节的学习中,我们已经成功的申请了设备号并且注册了相应的字符设备。系统通过设备号对设备进行查找,而字符设备注册到内核之后,并不能直接进行设备文件操作命令(打开、关闭、读、写等),需要相应的设备文件作为桥梁以此来进行设备的访问,在本章节将对如何创建设备节点进行学习。
11.1 创建设备节点
在Linux操作系统中一切皆文件,设备访问也是通过文件的方式来进行的,对于用来进行设备访问的文件称之为设备节点,设备节点被创建在/dev目录下,将内核中注册的设备与用户层进行链接,这样应用程序才能对设备进行访问。
根据设备节点的创建方式不同,分为了手动创建设备节点和自动创建设备节点,下面对两种设备节点创建方式进行介绍。
11.1.1 手动创建设备节点
使用mknod命令手动创建设备节点,mknod 命令格式为:
mknod NAME TYPE MAJOR MINOR
参数含义:
NAME: 要创建的节点名称
TYPE: b表示块设备,c表示字符设备,p表示管道
MAJOR:要链接设备的主设备号
MINOR: 要链接设备的从设备号
例如使用以下命令创建一个名为device_test的字符设备节点,链接设备的主设备号和从设备号分别为236和0:
mknod /dev/device_test c 236 0
11.1.2 自动创建设备节点
设备文件的自动创建是利用udev(mdev)机制来实现,多数情况下采用自动创建设备节点的方式。udev(mdev)可以检测系统中硬件设备状态,可以根据系统中硬件设备状态来创建或者删除设备文件。在驱动中首先使用class_create(…)函数对class进行创建,这个类存放于/sys/class/ 目录下,之后使用device_create(…)函数创建相应的设备,在进行模块加载时,用户空间中的udev会自动响应device_create()函数,寻找对应的类从而创建设备节点。
下面对于自动创建节点中所用到的函数进行解释说明:
class_create(…)函数
该函数在“内核源码/include/linux/device.h”文件中所引用(由于上一小节中引用的cdev.h文件已包含device.h,所以不需要再重复引用),如下(图11-1)所示:
函数作用:
用于动态创建设备的逻辑类,并完成部分字段的初始化,然后将其添加进Linux内核系统。
参数含义:
owner:struct module结构体类型的指针,指向函数即将创建的这个struct
class的模块。一般赋值为THIS_MODULE。
name:char类型的指针,代表即将创建的struct class变量的名字。
返回值:struct class * 类型的结构体。
class_destroy(…)函数
该函数在“内核源码/include/linux/device.h”文件中所引用,如下(图11-2)所示:
图 11-2
函数作用:
用于删除设备的逻辑类,即从Linux内核系统中删除设备的逻辑类。
参数含义:
owner:struct module结构体类型的指针,指向函数即将创建的这个struct
class的模块。一般赋值为THIS_MODULE。
name:char类型的指针,代表即将创建的struct class变量的名字。
返回值:无
device_create(…)函数
该函数在“内核源码/include/linux/device.h”文件中所引用,如下(图11-3)所示:
函数作用:
用来在class类中下创建一个设备属性文件,udev会自动识别从而进行设备节点的创建。
参数含义:
cls:指定所要创建的设备所从属的类。
parent:指定该设备的父设备,如果没有就指定为NULL。
devt:指定创建设备的设备号。
drvdata:被添加到该设备回调的数据,没有则指定为NULL。
fmt:添加到系统的设备节点名称。
返回值:struct device * 类型结构体
device_destroy(…)函数
在“内核源码/include/linux/device.h”文件中所引用,如下(图11-4)所示:
函数作用:
用来删除class类中的设备属性文件,udev会自动识别从而进行设备节点的删除。
参数含义:
cls:指定所要创建的设备所从属的类。
devt:指定创建设备的设备号。
返回值:无
至此,关于自动创建节点相关的函数就介绍完成了,会在下一小节中对于设备节点的自动创建进行相应实验程序的编写。
11.2 实验程序的编写
本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\06。
本章实验将编写Linux下的自动创建设备节点实验代码,首先采用自动申请设备号的方式进行设备号的申请,并对获取的主设备号与次设备号进行打印,之后对字符设备进行注册(file_operations结构体只填充owner 字段即可,会在下个章节对file_operations结构体进行讲解),最后自动对设备节点进行创建。
编写完成的chrdev_node.c代码如下(图11-5)所示
相较于上一章节实验,本章节代码在入口函数中添加了自动创建设备节点相关代码,在驱动出口函数中添加了相应的删除设备节点相关代码(相关代码已加粗)。
需要注意的是,在进行设备节点添加时,类的创建要放在设备创建之前;在进行设备节点删除时,类的删除要放在设备删除之后。
11.3 运行测试
11.3.1 编译驱动程序
在上一小节中的chrdev_node.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下(图11-6)所示:
对于Makefile的内容注释已在上图添加,保存退出之后,来到存放chrdev_node.c和Makefile文件目录下,如下图(图11-7)所示:
然后使用命令“make”进行驱动的编译,编译完成如下图(图11-8)所示:
编译完生成 chrdev_node.ko目标文件,如下图(图11-9)所示:
至此我们的驱动模块就编译成功了,下面进行驱动的运行测试。
|