imx8基于flexspi、pcie与fpga的高速通信开发详解-凯发app

    凯发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库进行开发。

    联系创龙

    公司总机:020-8998-6280

    技术热线:020-3893-9734

    技术邮箱:support@tronlong.com

    销售邮箱:sales@tronlong.com



    创龙官方微信公众号

    凯发app copyright © 2013~2021 广州创龙电子科技有限公司 all rights reserved  |

    网站地图