首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
  • GM-3568JHF

    • 一、简介

      • GM-3568JHF 简介
    • 二、快速开始

      • 01 环境搭建
      • 02 编译说明
      • 03 烧录指南
      • 04 调试工具
      • 05 软件更新
      • 06 查看信息
      • 07 测试命令
      • 08 应用编译
      • 09 源码获取
    • 三、外设与接口

      • USB
      • 显示与触摸
      • 以太网
      • WIFI
      • 蓝牙
      • TF-Card
      • 音频
      • 串口
      • CAN
      • RTC
    • 四、应用开发

      • 01 UART读写案例
      • 02 按键检测案例
      • 03 LED灯闪烁案例
      • 04 MIPI屏幕检测案例
      • 05 读取 USB 设备信息案例
      • 06 FAN 检测案例
      • 07 FPGA FSPI 通信案例
      • 08 FPGA DMA 读写案例
      • 09 GPS调试案例
      • 10 以太网测试案例
      • 11 RS485读写案例
      • 12 FPGA IIC 读写案例
      • 13 PN532 NFC读卡案例
      • 14 TF卡读写案例
    • 五、QT开发

      • 01 ARM64交叉编译器环境搭建
      • 02 QT 程序加入开机自启服务
    • 六、其他

      • 01 根目录文件系统的修改
      • 02 系统自启服务

08 FPGA DMA 读写案例

1 案例简介

案例功能描述:ARM端利用PCIe总线对FPGA的DRAM执行读写操作。应用程序通过ioctl函数触发DMA数据传输后,将等待驱动程序发出的input事件作为响应。应用程序接收到该事件时,表示DMA数据传输已经结束。

2 测试程序执行流程

ARM端

1.将数据写至 dma_memcpy 驱动申请的连续内存空间(位于 DDR)。配置 DMA,如源地址、目标地址、传输的数据大小等;

2.写操作:通过 ioctl 函数启动 DMA,通过 PCIe 总线将数据搬运至 FPGA DRAM;程序接收驱动上报 input 事件后,将通过 ioctl 函数获取 DMA 搬运数据耗时,并计算DMA写速率;

3.读操作:通过 ioctl 函数启动 DMA,通过 PCIe 总线将 FPGA DRAM 中的数据搬运至dma_memcpy 驱动申请的连续内存空间(位于 DDR);程序接收驱动上报 input 事件后,将数据从内核空间读取至用户空间,然后校验数据,同时通过 ioctl 函数获取 DMA 搬运数据耗时,并计算 DMA 读速率。

FPGA端

1.实现 PCIe Endpoint 功能;

2.处理 PCIe RC 端发起的 PCIe BAR0 空间读写事务;

3.将 PCIe BAR0 读写数据缓存至 FPGA DRAM 中。

3 操作流程

打开终端,将本案例 bin 目录下(05-开发资料\软件开发资料\linux_demo\smdt_fpga_dma_memcpy_demo\bin)的可执行程序 smdt_dma_memcpy_demo 拷贝至开发板文件系统 (源码可以在 src 路径下查看)。

#修改 Linux 内核日志的显示级别,内核的日志级别被设置为只显示紧急或更高级别的消息
echo 1 4 1 7 > /proc/sys/kernel/printk

在终端执行如下指令,切换到 smdt_dma_memcpy_demo 可执行程序所在目录

#切换到 smdt_dma_memcpy_demo 可执行程序所在目录
cd ‘可执行文件所在目录’

#查看 smdt_dma_memcpy_demo 是否在该目录下
ls

若可执行文件 smdt_dma_memcpy_demo 在当前目录下,则修改可执行文件的权限

#修改文件权限
chmod 777 smdt_dma_memcpy_demo 

#查询是否修改成功
ls -ld smdt_dma_memcpy_demo

查询确认文件修改权限成功后,执行 ./smdt_dma_memcpy_demo -h 可以查看该程序的帮助信息

#查看帮助信息
./smdt_dma_memcpy_demo  -h
#-a:设置 PCIe 地址;
#-s:设置传输数据大小(单位:Byte);
#-c:设置循环读写次数;
#-d:设置输入设备;
#-v:显示版本信息;
#-h:显示帮助内容。

执行结果如下图:

FPGA_DMA_3

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

lspci -s 0002:21:00.0 -vv
FPGA_DMA_1

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

echo 1 > /sys/class/pci_bus/0002\:21/device/0002\:21\:00.0/enable

应用程序通过ioctl函数发送命令开启 DMA 传输数据后,等待驱动上报 input 事件;当应用层接收到 input事件,说明 DMA 传输数据完成。执行以下指令以查看input输入事件接口。如图所示,input事件接口为/dev/input/event0。

evetest
FPGA_DMA_4

执行以下指令,将随机生成的数据写入FPGA的DRAM,随后从FPGA的DRAM中读取数据。测试结束后,通过/dev/input/event0接收事件通知,输出测试结果,其中包括平均读写时间、平均传输速率以及读写错误数量等统计信息。执行结果如下图。

./dma_memcpy_demo -a 0xf0200000 -s 65536 -c 100 -d /dev/input/event6
#这里的event0根据evetest查询到的结果更改。
FPGA_DMA_3
在 GitHub 上编辑此页
上次更新:
贡献者: chj
Prev
07 FPGA FSPI 通信案例
Next
09 GPS调试案例