当前位置: 首页 > news >正文

基于瑞芯微 RK3588 的 ARM 与 FPGA 交互通信实战指南 - 详解

PCIe通信案例(DMA方式)

案例说明

案例机制:ARM端基于PCIe总线(开启PCIe DMA)对FPGA BRAM进行读写测试。应用程序通过ioctl函数发送命令开启PCIe DMA传输数据后,等待驱动上报input事件;当应用层接收到input事件,说明DMA传输数据做完。

ARM端案例位于产品资料“4-软件资料\Demo\platform-demos\dma_memcpy_demo\”目录下,FPGA端案例位于产品资料“4-软件资料\Demo\FPGA-demos\bram_pcie\”目录下,具体说明如下:

表 1

备注:dma_memcpy_demo案例同时支持使用CPU DMA对DDR进行读写测试,详情请查看“基于CPU DMA的DDR读写测试”小节。

程序流程如下图所示。

图 1

程序原理说明:

ARM端:

  1. 采用PCIe DMA方式;
  2. 将数据写入至dma_memcpy/pcie_dma_memcpy驱动申请的连续内存空间(位于DDR);
  3. 配置PCIe DMA,如源地址、目标地址、传输的数据大小等;
  4. 写操作:通过ioctl函数启动PCIe DMA,通过PCIe总线将内容搬运至FPGA BRAM;
  5. 代码接收驱动上报input事件后,将通过ioctl函数获取PCIe DMA搬运数据耗时,并计算DMA传输速率(即写速率);
  6. 读操作:通过ioctl函数启动PCIe DMA,通过PCIe总线将FPGA BRAM中的信息搬运至dma_memcpy/pcie_dma_memcpy驱动申请的连续内存空间(位于DDR);
  7. 程序接收驱动上报input事件后,将数据从内核空间读取至用户空间,然后校验数据,同时通过ioctl函数获取PCIe DMA搬运数据耗时,并计算DMA传输速率(即读速率)。

FPGA端:

  1. 达成PCIe Endpoint作用;
  2. 处理PCIe RC端发起的PCIe BAR0空间读写事务;
  3. 将PCIe BAR0读写数据缓存至FPGA BRAM中。

案例测试

请将创龙科技TLZU-EVM评估板PCIe(CON25)接口连接至TL3588-EVM评估板PCIe RC(CON21)接口,硬件连接如下图所示。

图 2

请将创龙科技TLZU-EVM评估板上电启动,加载运行FPGA案例"bram_pcie\bin\"目录下的可执行程序。

请将案例"dma_memcpy_demo\dts\bin\"目录下的boot-dma-memcpy.img内核镜像文件拷贝至评估板文件系统。执行如下命令,替换内核镜像文件至系统启动卡,评估板重启生效。

备注:如需固化至eMMC,请将设备节点修改为"/dev/mmcblk0p3"。

Target#dd if=boot-dma-memcpy.img of=/dev/mmcblk1p3

Target#sync

Target#reboot

图 3

请将案例"bin\dma_memcpy_demo"可执行程序和"driver\bin\pcie_dma_memcpy.ko"PCIe DMA驱动程序拷贝至文件系统任意目录下。

图 4

执行如下命令,赋予可执行程序dma_memcpy_demo执行权限。

Target#chmod a+x dma_memcpy_demo

图 5

进入评估板文件系统,在可执行程序所在目录执行如下命令查看程序参数。

Target#./dma_memcpy_demo -h

参数解析:

-a:设置DDR或PCIe地址;

-s:设置传输数据大小(单位:Byte);

-c:设置循环读写次数;

-d:设置输入设备;

-v:显示版本信息;

-h:显示帮助内容。

图 6

执行如下命令,查看PCIe BAR空间地址。从下图可见,PCIe BAR空间映射至0xf0200000地址,大小为128KByte,并查看PCIe设备连接状态。

备注:若打印信息与"Speed 5GT/s (ok),Width x4 (ok)"不一致,可能是接触不良导致,需断电后擦拭金手指部分,重新插拔。

Target#lspci -s 01:00.0 -vv

图 7

进入评估板文件系统执行如下命令,加载PCIe DMA驱动程序。

Target#insmod -f pcie_dma_memcpy.ko

图 8

执行如下命令,查看事件号。

Target#cat /proc/bus/input/devices

图 9

图 10

执行如下命令,调整打印级别,避免调试串口终端打印内核信息影响观察测试结果。

Target#echo 1 4 1 7 > /proc/sys/kernel/printk

图 11

执行如下命令,使能PCIe设备。

Target#echo 1 > /sys/class/pci_bus/0000\:01/device/0000\:01\:00.0/enable

图 12

执行如下命令,将随机内容先写入FPGA BRAM,再从FPGA BRAM读出。测试完成后,软件将会打印最终测试结果,包含读写平均传输耗时、读写平均传输速率、读写错误统计等信息。

Target#./dma_memcpy_demo -a 0xf0200000 -s 131072 -c 100 -d /dev/input/event8

图 13

表 2

PCIe Gen2编码开销为8b/10b,PCIe Gen2传输数据的开销如下:

(1)物理层:Start(1Byte)、End(1Byte)

(2)数据链路层:Sequence(2Byte)、LCRC(4Byte)

(3)传输层:Header(12Byte或16Byte)、ECRC(4Byte)

PCIe理论带宽计算如下:

写速率:rate = 5Gb/s x num-lanes x 编码开销 x (MPS/ (MPS + 传输数据的开销))

读速率:rate = 5Gb/s x num-lanes x 编码开销 x (RCB/ (RCB + 传输数据的开销))

MaxPayload为128Byte,RCB为64Byte,为了计算协议消耗更高的理论带宽,取TLP header size =16Byte,因此可计算到PCIe Gen2传输数据的开销为28字节。

若num-lanes为2,则计算得到理论速率为:

写速率:rate = 5Gb/s x 2 x 8/10 x (128 / (128 + 28)) ≈ 840.20MB/s

读速率:rate = 5Gb/s x 2 x 8/10 x (64 / (64 + 28)) ≈ 712.34MB/s

若num-lanes为4,则计算得到理论速率为:

写速率:rate = 5Gb/s x 4 x 8/10 x (128 / (128 + 28)) ≈ 1640.4MB/s

读速率:rate = 5Gb/s x 4 x 8/10 x (64 / (64 + 28)) ≈ 1424.68MB/s

案例编译(ARM端)

请将产品资料“4-软件资料\Demo\platform-demos\dma_memcpy_demo\”案例源码拷贝至Ubuntu工作目录。

(1)应用程序编译

进入案例应用程序源码目录,执行如下命令,配置应用程序交叉编译工具链环境变量,然后进行编译,编译搞定将会在当前目录下生成dma_memcpy_demo可执行程序。

Host#export PATH=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

Host# make

图 14

(2)驱动程序编译

进入案例驱动程序源码目录,执行如下命令,配置驱动程序交叉编译软件链环境变量,然后进行编译,编译完成将会在当前目录下生成dma_memcpy.ko、pcie_dma_memcpy.ko驱动程序。

Host#export PATH=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

Host#make KDIR=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/kernel/

图 15

(3)设备树编译

请将案例"dts\src\tl3588-evm-dma-memcpy.dts"设备树源文件拷贝至LinuxSDK源码目录"kernel/arch/arm64/boot/dts/rockchip/"。

图 16

备注:案例"arm\dts\src\tl3588-evm-dma-memcpy.dts"设备树源文件主要新增dma_memcpy节点,用于加载dma_memcpy或pcie_dma_memcpy驱动,具体如下图所示。内核镜像文件"arm\dts\bin\boot-dma-memcpy.img"已囊括tl3588-evm-dma-memcpy.dts编译生成的设备树镜像文件。

图 17

由于tl3588-evm-dma-memcpy.dts设备树源文件需要引用reserved-mempcy节点,因此需要新增reserved-mempcy节点别名。进入LinuxSDK源码目录,执行如下命令,修改"rk3588-evb7-lp4.dtsi"文件。

Host#vi kernel/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi

图 18

修改内容如下:

reserved_memory: reserved-memory { //新增内容

图 19

修改完成后,保存退出,请按照《Debian系统使用手册》文档Debian系统镜像编译、生成章节,替换设备树并重新编译内核,将生成的内核镜像文件拷贝至评估板文件系统进行固化。该内核镜像已具备tl3588-evm-dma-memcpy.dts对应的设备树镜像文件。

关键代码说明(ARM端)

(1)打开设备节点。

图 20

(2)写数据操作。

图 21

图 22

图 23

(3)读取数据操作。

图 24

图 25

基于CPU DMA的DDR读写测试

本小节采用dma_memcpy_demo案例,通过CPU DMA对DDR进行读写,并计算传输速率。

备注:本次测试由CPU对DDR进行读写,未使用PCIe总线。

请将案例"bin\dma_memcpy_demo"可执行程序和"driver\bin\dma_memcpy.ko"驱动程序拷贝至文件系统任意目录下。

图 26

执行如下命令,赋予可执行程序dma_memcpy_demo执行权限。

Target#chmod a+x dma_memcpy_demo

图 27

进入评估板文件系统执行如下命令,加载CPU DMA驱动程序。

Target#insmod -f dma_memcpy.ko

图 28

执行如下命令,查看事件号。

Target#cat /proc/bus/input/devices

图 29

图 30

执行如下命令,调整打印级别,避免调试串口终端打印内核信息影响观察测试结果。

Target#echo 1 4 1 7 > /proc/sys/kernel/printk

图 31

执行如下命令,进行DDR读写测试。测试完成后,程序将会打印最终测试结果,包含读写平均传输耗时、读写平均传输速率、读写错误统计等信息。其中,写速率为2575.41MB/s,读速率为2583.04MB/s。

Target#./dma_memcpy_demo -a 0x80000000 -s 4194304 -c 100 -d /dev/input/event8

图 32

表 3

备注:0x80000000为预留的DDR地址空间,如下图所示,大小为128MByte。

图 33 tl3588-evm-dma-memcpy.dts

PCIe通信案例(非DMA方式)

案例说明

案例功能:ARM端利用PCIe总线(非DMA方式)对FPGA BRAM进行数据读写测试,同时校验数据和计算读写速率。

ARM端案例位于产品资料“4-软件资料\Demo\base-demos\devmem_rw\”目录下,FPGA端案例位于产品资料“4-软件资料\Demo\FPGA-demos\bram_pcie\”目录下,具体说明如下:

表 4

程序流程说明:

(1)ARM端依据PCIe总线将数据写入FPGA BRAM;

(2)ARM端通过PCIe总线从FPGA BRAM读取数据;

(3)判断写入与读取数据的正确性,并计算读写速率。

图 34

案例原理说明:

ARM端:

  1. ARM端使用mmap函数对物理地址进行转换;
  2. 可根据指定的访问运行类型按字节(Byte)、按半字(Halfword)进行访问。

FPGA端:

  1. 实现PCIe Endpoint作用;
  2. 处理PCIe RC端发起的PCIe BAR0空间读写事务;
  3. 将PCIe BAR0读写信息缓存至FPGA BRAM中。

案例测试

请将创龙科技TLZU-EVM评估板PCIe(CON25)接口连接至TL3588-EVM评估板PCIe RC(CON21)接口,硬件连接如下图所示。

图 35

请将创龙科技TLZU-EVM评估板上电启动,加载运行FPGA案例"bram_pcie\bin\"目录下的可执行程序。

评估板默认内核镜像未支持PCIe RC接口测试,请将产品资料“4-软件资料\Debian\Kernel\image\linux-5.10.160-[版本号]-[Git序列号]\”目录下boot-enable-pcie.img文件(支持PCIe RC接口测试)拷贝至评估板文件系统,执行如下命令将其固化至系统启动卡。

备注:若从eMMC启动环境,请将设备节点"mmcblk1p3"修改为"mmcblk0p3"。

Target#dd if=boot-enable-pcie.img of=/dev/mmcblk1p3

Target#sync

Target#reboot

图 36

执行如下命令,查看PCIe BAR空间地址。从下图可见,PCIe BAR空间映射至0xf0200000地址,大小为128KByte,并查看PCIe设备连接状态。

接触不良导致,需断电后擦拭金手指部分,重新插拔。就是备注:若打印信息与"Speed 5GT/s (ok),Width x4 (ok)"不一致,可能

Target#lspci -s 01:00.0 -vv

图 37

请将ARM端案例"devmem_rw\bin\"目录下的可执行程序devmem_rw拷贝至文件系统任意目录,在devmem_rw可执行程序所在目录执行如下命令,查看应用参数。

Target#./devmem_rw -h

参数解析:

-t:表示测试模式。先写后读,并检验材料的准确性。

-r:读模式,从参数"-a <address>"指定的内存空间地址处,读出参数"-s <size>"指定长度的数据(以字节为单位)。

-w:写模式,从参数"-f <file>"指定的文件获取数据,写入参数"-a <address>"指定的内存空间地址。

-a <address>:指定内存空间地址。

-s <size>:指定数据的长度,以字节为单位。

-o:以字节或半字方式访问内存空间。

-f <file>:指定文件。用于写模式测试。

图 38

执行如下命令,使能PCIe设备。

Target#echo 1 > /sys/class/pci_bus/0000\:01/device/0000\:01\:00.0/enable

图 39

执行如下命令,将随机材料先写入FPGA BRAM,再从FPGA BRAM读出,校验资料并统计读写速率。

Target#./devmem_rw -t -a 0xf0200000 -s 131072 -o halfword

图 40

重复三次测试,调试串口终端打印"Test pass!"信息,表示读写测试通过。

备注:由于本案例采用非DMA方式对FPGA BRAM进行数据读写测试,可能会出现速率波动较大的情况。

案例编译(ARM端)

请将产品资料“4-软件资料\Demo\base-demos\devmem_rw\src\”案例源码拷贝至Ubuntu工作目录。进入案例源码目录,执行如下命令进行编译,编译完成将会在当前目录下生成可执行程序。

Host#source /home/tronlong/RK3588/rk3588_linux_release_v1.2.1/debian/sysroots/environment

Host#make CC=aarch64-linux-gnu-gcc

图 41

关键代码(ARM端)

(1)将内存设备地址映射至虚拟地址。

图 42

(2)根据指定的运行方式进行数据读取。

图 43

(3)根据指定的操作方式进行信息写入。

图 44

http://www.jsqmd.com/news/345920/

相关文章:

  • PHP毕设项目:基于php的宠物商城网站的设计与制作(源码+文档,讲解、调试运行,定制等)
  • Java面向对象——方法重写
  • 2026武汉本地生活团购代运营TOP5推荐:全平台突围指南,商户实战案例解析 - 野榜数据排行
  • 盘点2026年黑龙江汽车灯光升级靠谱企业,费用怎么收? - 工业品牌热点
  • 【毕业设计】基于php的宠物商城网站的设计与制作(源码+文档+远程调试,全bao定制等)
  • 2026年艺术漆厂家权威推荐/艺术漆代理,艺术漆加盟,艺术漆代理加盟艺术漆招商 - 品牌策略师
  • 人才缺口行业以及过剩行业
  • 【计算机毕业设计案例】基于php的宠物用品,宠物购物商城网站的设计与制作(程序+文档+讲解+定制)
  • 2026年南昌地区良好口碑AI搜索品牌有哪些 - 工业品网
  • 爱舒适,用方盾:守护雕刻师的每一次呼吸
  • 创客匠人的IP进化论:AI智能体如何重塑创始人价值坐标系
  • 西门子PLC200smart,3轴控制程序,西门子V90 西门子触摸屏程序, 有详细注释和IO表
  • 加多宝“开盖有奖”:再互动深度剖析! - 品牌智鉴榜
  • 【Charge】网格错误
  • sql注入流程示例
  • MYSQL日志
  • 清洗设备流量测量优选:2026年超声波流量计品牌推荐 - 品牌2025
  • 2026年艺术漆厂家口碑推荐:艺术漆代理/艺术漆加盟/艺术漆代理加盟艺术漆招商 - 品牌策略师
  • 人工智能应用- 语言理解:06.大语言模型
  • 分析金华高性价比的欧美空运小包货代机构排名情况 - myqiye
  • 千匠网络登顶B2B电商软件排名榜首:创新引领产业数字化新纪元 - 圆圆小达人
  • 上海装修公司选择指南+优质企业盘点|避坑选型,适配各类需求 - 博客万
  • 探讨2026年渭南好的电子电竞学校,哪家教学质量优 - mypinpai
  • 2026雅思培训机构前十榜单出炉!选对机构=半只脚踏进梦校 - 品牌测评鉴赏家
  • 无污染超纯水流量测量:2026年值得关注的超声波流量传感器推荐 - 品牌2025
  • 预见2026:镇江鱼头泡饼饭店推荐与品鉴指南 - 2026年企业推荐榜
  • 2026年中国商标律所推荐榜单:聚焦AI时代品牌资产保护,覆盖多场景与合规痛点的五强权威评测 - 十大品牌推荐
  • 面向液冷流量测量应用,2026年高可靠超声波流量传感器品牌推荐 - 品牌2025
  • 分期乐永辉超市卡(生活服务套装)春节回收价格是多少? - 畅回收小程序
  • 2026年汽车音响改装服务价格大揭秘,哈尔滨靠谱品牌推荐 - 工业品网