凯发app-凯发天生赢家 >关于创龙 > 新闻资讯 > 技术文章
联系凯发app
contact us公司总机:020-8998-6280
技术热线:020-3893-9437
技术邮箱:support@tronlong.com
销售邮箱:sales@tronlong.com
imx8基于flexspi、pcie与fpga的高速通信开发详解
2021/09/02
前 言
本文主要介绍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
点击图片/图注即可查看产品详细介绍↓↓↓
图 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
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端:读取数据并进行校验,打印误码率、读取速率和读取到的数据。
程序流程图如下:
图 2
1.2 案例测试
图 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
图 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
备注:更换设备树后,需重启评估板方可使设备树生效。
图 5
1.2.1 功能测试
执行如下命令加载flexspi驱动。
target# insmod flexspi_imx8.ko
图 6
执行如下命令进行测试。
target# ./flexspi_read -a 0x08000000 -s 4096
图 7
本次测试速率为37.56mb/s,误码率为0,与理论速率40mb/s接近。
备注:受限于测试板卡的硬件连接形式的影响,37.56mb/s是零误码率时的最高实测速率。
若读取小于或等于2048byte的数据时,每次读完需清空flexspi的rx buffer,否则下次读取的数据是缓存在buffer中的旧数据。
target# devmem2 0x30bb0000 w 0xffff7031
图 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为分频系数,详细说明请查阅驱动说明章节。
图 9
执行如下命令进行测试。
target# ./flexspi_read -a 0x08000000 -s 4096
图 10
可以看到本次测试速率为114.89mb/s,与理论速率133mb/s接近。
备注:受限于测试板卡的硬件连接形式的影响,此速率下的误码率为99.8%。
1.3 案例关键代码
(1) main函数
图 11
(2) 地址映射。
图 12
(3) 读取数据。
图 13
(4) 校验数据。
图 14
(5) 打印数据。
图 15
1.4 fpga工程关键代码
(1) 端口io定义
flexspi_sclk和flexspi_ss0_n为输入信号,flexspi_data和flexspi_data为输出信号。
图 16
(2) 时钟输入信号flexspi_sclk设置为2倍频
图 17
(3) 数据发送
图 18
图 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显示实时图像。
程序工作流程框图如下所示:
图 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显示屏。
图 21
将该案例bin目录下的驱动文件xdma-video.ko拷贝至tlimx8-evm评估板文件系统中,并将案例bin目录下的.bit或.bin文件加载或固化到tlk7-evm评估板。
评估板上电,可执行lspci命令检查pcie连接是否正常。如不能获取到如下信息,请检查硬件连接和fpga端是否正常运行。
target# lspci
图 22
target# insmod xdma-video.ko debug=1
备注:“debug=1”表示打印帧率信息,可根据实际需求选择是否配置。若需修改分辨率和帧率,可执行命令“insmod xdma-video.ko width=1280 height=1024 fps=60”,具体的分辨率和帧率大小,请以相机实际可支持范围为准,分辨率参数需和相机分辨率参数匹配,帧率参数仅作用于软件上相机参数,不影响实际的相机帧率。
图 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为图像的宽和高。
图 24
执行成功后可观察到如下输出,串口不停打印帧率,并在hdmi显示器上观看到实时图像。
备注:帧率显示为61fps,是由于cameralink相机输出的并不是标准的60fps图像。
图 25
图 26
按下“ctrl c”停止录制后,将在当前目录生成test.264文件,并可观察到实际帧率为59.954fps。
图 27
执行如下命令播放编码后的视频,hdmi显示器显示对应图像。
target# gst-play-1.0 test.264
图 28
图 29
播放结束后,将打印视频时长、帧率信息。
图 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
图 31
图 32
注意:h264码流保存成mp4文件,程序可正常工作,录制的视频文件播放帧率正常,但系统会出现概率性的丢帧。为了避免这种情况,在实际的应用编程中,建议将mp4的保存功能另外建立一个pipeline进行,或改用其它开源mp4库进行开发。