IMX8基于FlexSPI、PCIe与FPGA的高速通信开发详解
csdh11 2024-12-23 09:26 25 浏览
前 言
本文主要介绍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)
图 1 TLIMX8-EVM评估板
案例一:主要演示ARM Cortex-A53通过FlexSPI接口读取FPGA(Spartan-6采集卡TL-HSAD-LX)发送的模拟数据,并进行校验,通过串口打印相关信息。实测速率为114.89MB/s。
案例二:主要演示ARM Cortex-A53通过PCIe接口与FPGA进行通信,实现对CameraLink相机图像的采集、编码和显示。实测传输帧率为60fps。
想要获取案例详细说明、源码的朋友请于评论区留言~
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库进行开发。
相关推荐
- 阿里巴巴的DataX ETL工具的使用心得,数据库主从热备份神器
-
简介这是阿里出的一个ETL工具,其实就是把不同数据库的数据,高效的互相拷贝。做了很多底层优化,平均能达到1秒/1W条。如果有牛逼的优化,能达到1秒/9W条。一般用在半夜的数据获取,或者主从热备份。...
- Java开发环境搭建与配置,最全手册看这一篇就够了
-
Java开发环境搭建与配置,工具集合包括:Tomcat\JDK\JRE\Redis\Maven。JDK下载JDK安装包:jdk-8u161-windows-x64.exe。可以加关注私信我,提供百度网...
- JAVA安装教程——JDK安装(java 安装)
-
一个初学者的尝试与理解,欢迎广大网友的评论与指正。(纯兴趣爱好学习)。一、什么是JDKJDK,又称为JavaSDK是Java语言的软件开发工具包。JDK中包含JRE和Java开发工具包,JRE又...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- JAVA 8 环境安装配置(java环境怎么装)
-
一、下载这里选择的是OracleJDK,首先到Oracle官网下载JDK8,以Windows10操作系统为例,若是32位系统则下载“Windowsx86”,否则64位系统下载“Windows...
- 真的要开始用 JDK 17 了(jdk17好用吗)
-
最近在调研JDK17,并且试着将之前的一个小项目升级了一下,在测试环境跑了一段时间。...
- 在Windows 10下搭建Java环境(使用jdk-13.0.1)
-
一、初识JDK、JRE和JVM对于使用Java语言的开发者来说,在安装开发工具(Eclipse等)之前首先需要安装JDK(JavaDevelopmentKit,Java开发工具包)。它是整个JAV...
- 「是时候升级Java11了」 JDK11优势和JDK选择
-
专注于Java领域优质技术,欢迎关注作者:冷冷ggJava8商用收费从2019年1月份开始,OracleJDK开始对JavaSE8之后的版本开始进行商用收费,确切的说是8u201/20...
- 如何安装jdk(如何安装jdk1.8)
-
学习java首先要安装Java开发工具箱(JDK):要在计算机上编写和运行Java程序,需要安装Java开发工具箱(JDK)。JDK包括Java编译器(javac)和Java虚拟机(JVM)。可以从O...
- Java JDK下载安装及Windows环境变量配置
-
JavaJDK下载安装JDK是Java的开发工具包,要进行Java学习或开发之前,需先下载安装,下载地址如下:...
- JDK安装、Eclipse安装及运行环境配置
-
1、eclipse下载打开地址:http://www.eclipse.org/downloads/;根据自己机器的操作系统,页面上显示适应机器操作系统的Eclipse下载列表,也可以点击下图所示位置切...
- 宝塔面板安装jdk16 – 卸载默认的jdk1.8
-
昨天想安装一个halo博客,开始的时候一直安装不上,后来发现jdk版本不对,halo博客默认的jdk版本最低是jdk11,宝塔默认的是jdk1.8,所以这篇文章就来倒腾下如何在宝塔面板环境下卸载默认的...
- JDK1.8安装&环境变量配置(jdk安装步骤环境变量配置)
-
1、下载并安装JDK1.8链接:https://pan.baidu.com/s/1bfceFjfTQvLylu7a3T7fyg?pwd=ydtm...
- 如何在Windows10中配置java的JDK环境
-
今天给大家分享一下如何配置java的JDK环境。操作步骤如下:1.下载好jdk的安装文件,我下载的是jdk-10.0.1_windows-x64_bin.exe这个版本的安装文件;2.使用鼠标...
- 一周热门
- 最近发表
-
- 阿里巴巴的DataX ETL工具的使用心得,数据库主从热备份神器
- Java开发环境搭建与配置,最全手册看这一篇就够了
- JAVA安装教程——JDK安装(java 安装)
- Windows和Linux环境下的JDK安装教程
- JAVA 8 环境安装配置(java环境怎么装)
- 真的要开始用 JDK 17 了(jdk17好用吗)
- 在Windows 10下搭建Java环境(使用jdk-13.0.1)
- 「是时候升级Java11了」 JDK11优势和JDK选择
- Java近期新闻:JDK 24 RC1、JDK Mission Control、Spring、Hibernate、Vert.x
- 如何安装jdk(如何安装jdk1.8)
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 反恐24小时电话铃声 (33)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)