瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
第16章 一个驱动兼容不同设备实验
在Linux中,使用主设备号来表示对应某一类驱动,使用次设备号来表示这类驱动下的各个设备。假如现在驱动要支持的主设备号相同,但是次设备号不同的设备。驱动程序要怎样编写呢,上一章节学习的私有数据private_date在此时就派上了用场,具体是怎样使用的呢,多个设备是如何在一个驱动中兼容的呢,带着疑问,让我们开始本章节的学习吧。
16.1 container_of函数简介
container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。那么可以使用这个函数获取不同设备的地址,来对不同的设备进行操作,从而一个驱动可以兼容不同的设备。
container_of
函数原型:
container_of(ptr,type,member)
函数作用:
通过结构体变量中某个成员的首地址获取到整个结构体变量的首地址。
参数含义:
ptr是结构体变量中某个成员的地址。
type是结构体的类型
member是该结构体变量的具体名字
container_of宏的作用是通过结构体内某个成员变量的地址和该变量名,以及结构体类型。找到该结构体变量的地址。
16.2 实验程序编写
16.2.1 驱动程序编写
本驱动程序对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\11\module。
本章实验将使用container_of函数编写一个驱动兼容不同设备的实例代码,编写完成的代码如下所示:
16.2.2 编写测试 APP
本应用程序对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\11\app。
编写应用程序,打开生成的俩个设备,并向俩个设备中写入数据,编写完成的应用程序app.c代码如下所示:
16.3 运行测试
16.3.1 编译驱动程序
在上一小节中的file.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下(图5-4)所示:
对于Makefile的内容注释已在上图添加,保存退出之后,来到存放file.c和Makefile文件目录下,如下图(图16-1)所示:
然后使用命令“make”进行驱动的编译,编译完成如下图(图16-2)所示:
编译完生成 file.ko目标文件,如下图(图16-3)所示:
至此我们的驱动模块就编译成功了,下面进行应用程序编译
16.3.2 编译应用程序
因为测试APP是要在开发板上运行的,所以需要aarch64-linux-gnu-gcc来编译,输入以下命令,编译完成以后会生成一个app的可执行程序,如下图(图 16-4)所示:
aarch64-linux-gnu-gcc app.c -o app
下面进行驱动程序的测试。
16.3.2 运行测试
驱动模块file.ko和测试程序app都已经准备好了,接下来就是运行测试。
输入以下命令加载驱动模块,如下图(图 16-6)所示:
insmod file.ko
驱动加载成功之后会生成/dev/test1和/dev/test2设备驱动文件,输入以下命令查看设备,可以看到一个驱动创建并管理了多个驱动设备,如下图(图 16-8)所示:
运行应用程序,如下(图 16-10)所示:
如上图所示,可以看到用户顺利向俩个设备写入数据,且每个设备拥有私有数据。