i.MX 8基于FlexSPI、PCIe与FPGA的高速通信开发案例分享

22d1ca30594edb9b083a7dde21984f8b.gif

 前  言 


本文主要介绍i.MX 8M Mini基于FlexSPI、PCIe与FPGA的高速通信案例。

本文档适用开发环境:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

虚拟机:VMware15.1.0

Linux开发环境:Ubuntu18.04.4 64bit

U-Boot:U-Boot-2020.04

Kernel:Linux-5.4.70

Linux SDK:5.4.70_2.3.0


*测试硬件平台:TLIMX8-EVM评估板(NXP i.MX 8M Mini)

点击图片/图注即可查看产品详细介绍↓↓↓

3c5efc22b2df7def376a1563f6f489bd.png

图 1 TLIMX8-EVM评估板

案例一:主要演示ARM Cortex-A53通过FlexSPI接口读取FPGA(Spartan-6采集卡TL-HSAD-LX)发送的模拟数据,并进行校验,通过串口打印相关信息。实测速率为114.89MB/s。

案例二:主要演示ARM Cortex-A53通过PCIe接口与FPGA进行通信,实现对CameraLink相机图像的采集、编码和显示。实测传输帧率为60fps。

案例详细说明、源码请扫描下方二维码或点击下载链接:

http://site.tronlong.com/pfdownload

94fb3e995077f47fc995957f78603b06.png

1 flexspi_read案例

1.1 案例说明

本案例主要演示ARM Cortex-A53通过FlexSPI接口读取FPGA(Spartan-6采集卡TL-HSAD-LX)发送的模拟数据,并进行校验,通过串口打印相关信息。

(1) 驱动默认配置FlexSPI为DDR模式(双边沿),配置FlexSPI的时钟源为400MHz,分频系数pre_divider和post_divider分别为2和5,此时FlexSPI的ROOT CLK时钟为400MHz/2/5 = 40MHz,DDR模式的传输时钟SCLK= ROOT SCLK/2 = 20MHz,数据位宽为8bit,即理论传输速率为40MB/s,实测速率为37.56MB/s。

(2) 驱动如配置FlexSPI为DDR模式(双边沿),配置FlexSPI的时钟源为400MHz,分频系数pre_divider和post_divider分别为1和3,此时FlexSPI的ROOT SCLK时钟为400MHz/1/3 = 133MHz,DDR模式的传输时钟SCLK = ROOT SCLK/2 = 66.5MHz,数据位宽为8bit,即理论传输速率为133MB/s,实测速率为114.89MB/s。

FPGA端:发送从0x00递增至0xFF的数据。

ARM端:读取数据并进行校验,打印误码率、读取速率和读取到的数据。

程序流程图如下:

546e76ce10037c4850e1c46f751d6278.png

图 2

 1.2 案例测试

f5b68f4b800e7b4a80dd50a565bb8564.png

图 3

请按照上图进行硬件连接,并将案例bin目录下的可执行文件flexspi_read、“driver\bin\”目录下驱动文件flexspi_imx8.ko、“dts\image\”目录下的设备树文件tlimx8-evm-flexspi.dtb拷贝至评估板文件系统。采集卡TL-HSAD-LX加载或固化“data_to_flexspi\bin\”目录下的.bit或.mcs文件。在评估板文件系统flexspi_read文件所在路径下,执行如下命令查询程序参数说明。

Target#  ls

Target#  ./flexspi_read -h

c45ca2b3951c201e1ac453e2d18919e0.png

图 4

执行如下命令将默认使用的设备树tlimx8-evm.dtb进行备份,然后把tlimx8-evm-flexspi.dtb拷贝至“/run/media/mmcblk1p1/”目录并重命名为tlimx8-evm.dtb。

Target#  cp /run/media/mmcblk1p1/tlimx8-evm.dtb linux-tlimx8-evm.dtb//备份默认的tlimx8-evm.dtb,新文件名为linux-tlimx8-evm.dtb

Target#  cp tlimx8-evm-flexspi.dtb /run/media/mmcblk1p1/tlimx8-evm.dtb

备注:更换设备树后,需重启评估板方可使设备树生效。

37af2ba848ed1271c6104f5c548d328e.png

图 5

1.2.1 功能测试

执行如下命令加载FlexSPI驱动。

Target#  insmod flexspi_imx8.ko

2b3d6ddbee3568cd0f73b2ec39f18594.png

图 6

执行如下命令进行测试。

Target#  ./flexspi_read -a 0x08000000 -s 4096

42f57a1dd89e8dae6a8b4aa69118cb62.png

图 7

本次测试速率为37.56MB/s,误码率为0,与理论速率40MB/s接近。

备注:受限于测试板卡的硬件连接形式的影响,37.56MB/s是零误码率时的最高实测速率。

若读取小于或等于2048Byte的数据时,每次读完需清空FlexSPI的RX Buffer,否则下次读取的数据是缓存在Buffer中的旧数据。

Target#  devmem2 0x30bb0000 w 0xFFFF7031

08426106883edfff4dd167983db2fac9.png

图 8

1.2.2 性能测试

执行如下命令卸载flexspi驱动,并重新加载驱动。同时采集卡TL-HSAD-LX重新加载或固化FPGA程序。

Target#  rmmod flexspi_imx8

Target#  insmod flexspi_imx8.ko pre_divider=1 post_divider=3

备注:pre_divider和post_divider为分频系数,详细说明请查阅驱动说明章节。

7f61dcdf5ac537e4765599c74e7e77f5.png

图 9

执行如下命令进行测试。

Target#  ./flexspi_read -a 0x08000000 -s 4096

d9cd66936a7052e795a21541d64f22e6.png

图 10

可以看到本次测试速率为114.89MB/s,与理论速率133MB/s接近。

备注:受限于测试板卡的硬件连接形式的影响,此速率下的误码率为99.8%。

1.3 案例关键代码

(1) main函数

8973188000906194597824c1e5f2c200.png

图 11

(2) 地址映射。

b4818ede87706559a2a479bb49ddee2f.png

图 12

(3) 读取数据。

dabffc6a4bd2bc084813982a5853d3a0.png

图 13

(4) 校验数据。

474229ce23be4fd446d82fb6e41cd2cd.png

图 14

(5) 打印数据。

85b08b914d297f36df5d8a3a4229cc55.png

图 15

1.4 FPGA工程关键代码

(1) 端口IO定义

flexspi_sclk和flexspi_ss0_n为输入信号,flexspi_data和flexspi_data为输出信号。

a89477b855b56486f8996ea0fb9e5890.png

图 16

(2) 时钟输入信号flexspi_sclk设置为2倍频

2ea7cfcabb4baf4c3c168f023c837141.png

图 17

(3) 数据发送

3cc8c5c344dec7e0a2d668607a9ef30b.png

图 18

4e638157575c4b726d24df1e6da41803.png 图 19

2 gst_pcie_enc案例

2.1 案例说明

本案例主要演示ARM Cortex-A53通过PCIe接口与FPGA进行通信,实现对CameraLink相机图像的采集、编码和显示。其中ARM端获取到的原始图像通过dma-buf机制,在采集、硬件编码和显示输出等功能中进行共享,可实现高效的图像数据“零拷贝”的录播方案。

FPGA端:

(1) 采集CameraLink相机图像;

(2) 通过XDMA IP实现为PCIe EP设备,RC端可通过PCIe接口访问FPGA端DDR以及对VDMA IP的寄存器进行配置。

ARM端:

(1) 作为PCIe RC设备,配置VDMA IP将图像存储到FPGA DDR指定位置、将图像从FPGA DDR通过XDMA搬运到ARM端DDR;

(2) 调用协处理器VPU进行H264硬件编码,并将编码后的数据存储到文件;

(3) 编码的同时,通过HDMI显示实时图像。

程序工作流程框图如下所示:

5f842ecc2a0c210a232a66ccbc10afa1.png 

图 20

2.2 案例测试

请参考下图,将创龙科技的TLCamerLinkF模块连接至TLK7-EVM评估板的FMC2接口,TLK7-EVM评估板J1跳线帽选择1.8V档位,以配置FMC IO的BANK电压为1.8V。将CameraLink相机的CL0通过数据线连接至TLCameraLinkF模块的CameraLink1接口。再将TLK7-EVM评估板的PCIe插到TLIMX8-EVM评估板的PCIe插槽上,使用HDMI线缆连接TLIMX8-EVM评估板的HDMI OUT接口至HDMI显示屏。

079a5e7649267bde138dd04268c59201.png

图 21

将该案例bin目录下的驱动文件xdma-video.ko拷贝至TLIMX8-EVM评估板文件系统中,并将案例bin目录下的.bit或.bin文件加载或固化到TLK7-EVM评估板。

评估板上电,可执行lspci命令检查PCIe连接是否正常。如不能获取到如下信息,请检查硬件连接和FPGA端是否正常运行。

Target#  lspci

9a166f5c1fe5baf6043455942fdfd0c5.png

图 22

Target#  insmod xdma-video.ko debug=1

备注:“debug=1”表示打印帧率信息,可根据实际需求选择是否配置。若需修改分辨率和帧率,可执行命令“insmod xdma-video.ko width=1280 height=1024 fps=60”,具体的分辨率和帧率大小,请以相机实际可支持范围为准,分辨率参数需和相机分辨率参数匹配,帧率参数仅作用于软件上相机参数,不影响实际的相机帧率。

282062d09cbc72cd55ce8d73b78e6a78.png

图 23

执行如下命令进行图像的采集、编码和显示,编码后的test.264文件将保存在当前目录下。

Target#  gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! "video/x-raw, format=(string)NV12, width=(int)1280, height=(int)1024" ! tee name=t ! queue ! vpuenc_h264 ! h264parse ! filesink location=test.264 t. ! queue ! waylandsink

其中"/dev/video1"为设备节点,请以实际节点为准,1280和1024为图像的宽和高。

d065b26b221a5b7c215513c5763b6879.png

图 24

执行成功后可观察到如下输出,串口不停打印帧率,并在HDMI显示器上观看到实时图像。

备注:帧率显示为61fps,是由于CameraLink相机输出的并不是标准的60fps图像。

5bb153897d0b8f11cffd4a53a6eeebc9.png

图 25

e640a231e6d21f00042244c76a89ae10.png

图 26

按下“Ctrl+C”停止录制后,将在当前目录生成test.264文件,并可观察到实际帧率为59.954fps。

1b26e2a495c438cd8ed5e2549dccc383.png

 图 27

执行如下命令播放编码后的视频,HDMI显示器显示对应图像。

Target#  gst-play-1.0 test.264

28a6b4eca3d240ad536747908be76e3a.png

图 28

2d0ecf2a2907dee64eb92d380f47ffca.png

图 29

播放结束后,将打印视频时长、帧率信息。

768c267d1e8d6b9a551f53eab40040ef.png

 图 30

备注:由于码流文件中不包含播放帧率信息,因此在执行“gst-play-1.0 test.264”时未能按60fps进行播放。从串口打印信息可知,实际是以30fps进行播放,并且播放时长为录制时长的两倍。在录制时,将H264码流封装成MP4格式可解决此问题,因为封装成MP4格式时,播放帧率信息将被记录在MP4文件中。

执行如下命令,可将H264码流保存成MP4文件。

Target#  gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! "video/x-raw, format=(string)NV12, width=(int)1280, height=(int)1024" !  tee name=t ! queue ! vpuenc_h264 ! h264parse ! qtmux ! filesink location=test.mp4 t. ! queue ! waylandsink

48f8a1bcf5d8f8af32a81827f949ad64.png

 图 31

40fa25e42c561b81519b54745228d5e1.png

图 32

注意:H264码流保存成MP4文件,程序可正常工作,录制的视频文件播放帧率正常,但系统会出现概率性的丢帧。为了避免这种情况,在实际的应用编程中,建议将MP4的保存功能另外建立一个pipeline进行,或改用其它开源MP4库进行开发。

e22a0a712a801825e9764016d097ff91.png

推荐阅读

为什么i.MX8特别适合现代医疗设备?

【重磅】创龙首款NXP工业评估板,全新i.MX 8惊艳登场!!!

欢迎加入NXP i.MX 8技术交流群!

感谢您的关注,如果您也认为这篇优质推文让您满意,可以在每次阅读后,在页面下方点一个「赞」或「在看」,转发到朋友圈或好友群里进行分享。

或将我们的公众号设为「置顶」。您可以在进入公众号主页后点击「设为置顶」,我们公众号名称旁边就会出现在您的好友列表前面,后续还将会有更多产品、技术案例持续推送分享。

9d699c41961d8be6e64f34afa2dd63f3.gif

聚焦行业趋势, 了解最新技术

始终致力于打造高品质工业核心板

欢迎长按二维码关注!

e5f0cc2c9b2de0dfd8f6f18a2ed8aeda.png

创龙科技官网

创龙科技官方公众号

d3e22d62bd9cf214079c09628f633a19.png48cdc5daac7443528d8d466ba79d3750.png

更多方案,欢迎与Tronlong联系:

销售邮箱:sales@tronlong.com

技术邮箱:support@tronlong.com

创龙总机:020-8998-6280

技术热线:020-3893-9734

创龙官网:www.tronlong.com

技术论坛:www.51ele.net

官方商城:https://tronlong.tmall.com

fe6f1d0c7239ae6a10ed8cbd5dba43fb.png 90658e21e3c275977dcd904024a741c2.png

71d5e1795a17107d4d82ef8c4f80dc6c.png           

在看点这里

da897b991bfd2b037bdf963b24f08ee8.gif

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:博客之星2020 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值