RK3568驱动指南|第二篇 字符设备基础-第16章 一个驱动兼容不同设备实验

瑞芯微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)所示:

如上图所示,可以看到用户顺利向俩个设备写入数据,且每个设备拥有私有数据。

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值