打印
[嵌入式linux]

RK3568驱动指南|第二篇 字符设备基础-第15章 文件私有数据实验

[复制链接]
4086|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
遥寄山川|  楼主 | 2024-4-11 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
第15章 文件私有数据实验
在之前章节编写的驱动程序中,将生成字符设备的一些硬件属性(设备号、类、设备名称等)全都写成了变量的形式,虽然这样编写驱动代码不会产生报错,但是会显得有点不专业。通常在驱动开发中会为设备定义相关的设备结构体,将硬件属性的描述信息全部放在该结构体中,在本章节中将对设备结构体的功能实现和文件私有数据进行学习。

15.1 文件私有数据简介
Linux中并没有明确规定要使用文件私有数据,但是在linux驱动源码中,广泛使用了文件私有数据,这是Linux驱动遵循的“潜规则”,实际上也体现了Linux面向对象的思想。struct file 结构体中专门为用户留了一个域用于定义私有数据。结构体内容如下所示:

文件私有数据的概念在Linux驱动中有着非常广泛的应用,文件私有数据就是将私有数据private_data指向设备结构体。通过它可以将私有数据一路从open函数带到read, write函数层层传入。一般是在open 的时候赋值,read、write时使用。open函数中私有数据的使用如下所示:

在上述代码中,定义了一个设备结构体dev1,然后在open函数中,将私有数据private_data指向了设备结构体dev1。

我们可以在read write函数中通过private_data访问设备结构体,如下所示:


15.2 实验程序编写
15.2.1 驱动程序编写
本驱动程序对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\10\module。
本章实验将编写Linux下的使用文件私有数据实例代码,在open函数中对私有数据结构体赋值,在write函数中使用。编写完成的代码如下所示:

15.2.2 编写测试 APP
本应用程序对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\10\app。
编写测试APP其实是在编写Linux应用,在应用程序中向设备文件写入数据,编写完成的应用程序app.c代码如下所示:

15.3 运行测试
对于Makefile的内容注释已在上图添加,保存退出之后,来到存放file.c和Makefile文件目录下,如下图(图15-1)所示:

然后使用命令“make”进行驱动的编译,编译完成如下图(图15-2)所示:

编译完生成 file.ko目标文件,如下图(图15-3)所示:

至此我们的驱动模块就编译成功了,下面进行应用程序编译,
15.3.2 编译应用程序
因为测试APP是要在开发板上运行的,所以需要aarch64-linux-gnu-gcc来编译,输入以下命令,编译完成以后会生成一个app的可执行程序,如下图(图15-4)所示:
aarch64-linux-gnu-gcc app.c -o app

下面进行驱动程序的测试。


驱动加载成功之后会生成/dev/test设备驱动文件,输入以下命令查看杂项设备的主次设备号。
ls /dev/test -al
结果如下图(图15-6)所示:

运行应用程序,如下(图 15-6)所示:

在此实验中,将硬件属性的信息全部放在一个结构体private_data,依然可以实现字符设备的操作。
更多内容可以B站搜索:迅为RK3568开发板



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

341

主题

348

帖子

1

粉丝