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

瑞芯微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开发板

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先我们需要了解一下 rk3399 的架构和 dma-buf 机制。 rk3399 是一款64位六核处理器,其中包含了两个 Cortex-A72 核和四个 Cortex-A53 核,还有一个 Mali-T860MP4 GPU,可以支持多种操作系统,例如 Ubuntu、Android、Debian 等。 dma-buf 机制是 Linux 内核中的一种机制,用于在不同的设备之间共享内存,可以很方便地实现高效的数据传输。 接下来我们来创建一个字符设备,并利用 dma-buf 机制从网卡读取数据的流程如下: 1. 首先,我们需要创建一个字符设备,可以使用 Linux 内核中的 misc 设备(miscdevice)来实现。在 misc 设备中,我们需要实现 open、release、read、write 函数,这些函数用于打开设备、释放设备、读取数据、写入数据等操作。 2. 接下来,我们需要使用 dma-buf 机制从网卡读取数据。首先,我们需要申请一个 dma-buf,可以使用 dma_alloc_coherent 函数来实现。然后,我们需要将网卡接收到的数据复制到 dma-buf 中,可以使用 skb_to_sgvec 函数将 sk_buff(套接字缓冲区)中的数据复制到 scatterlist 中,然后使用 dma_map_sg 函数将 scatterlist 映射到 dma-buf 中。 3. 最后,我们需要将 dma-buf 中的数据传输到用户空间。可以使用 mmap 函数将 dma-buf 映射到用户空间,然后用户空间就可以直接访问 dma-buf 中的数据了。 以上就是从网卡读取数据并使用 dma-buf 机制进行传输的流程。需要注意的是,在实现过程中需要考虑到多线程同步、内存泄漏等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值