【米尔-Xilinx XC7A100T FPGA开发板试用】+02.PCIE接口测试(zmj)
1. FPGA程序设计
PCI Express (peripheral component interconnect express) 简称 PCIe,是一种高速串行计算机扩展总线标准。是一种全双工总线,使用高速串行传送方式,能够支持更高的频率,连接的设备不再像 PCI 总线那样共享总线带宽。PCIe 目前发布了 多 个版本——PCIe1.0、PCIe2.0、PCIe3.0、PCIe4.0等。
米尔-Xilinx XC7A100T FPGA开发板的PCIe可配置成 X1、 X2 模式,它 的单通道通信速率可高达 5G bit 带宽。本例程中通过利用 XILINX 的 XDMA IP 来实现 PCIE 的发送和接收速度测试。
1.1 参考电路
米尔-Xilinx XC7A100T FPGA开发板的PCIe参考电路:
1.2 工程框架
【图】工程框架
1.3 编译结果
编译结果时序正常。
【图】编译结果
1.4 烧录
Vivado-2022.2不支持mx25l25645g-spi-x1_x2_x4,因此通过JTAG烧录JTAG的模式测试。
//
mx25l25645g-spi-x1_x2_x4
//
ERROR: [Labtoolstcl 44-349] Unrecognized config mem part - mx25l25645g-spi-x1_x2_x4. Please run get_cfgmem_parts and select a valid part or use the cfgmem GUI to assist in selecting a valid device.
//
烧录bit调试,烧录完成后系统需要不掉电重启Reboot。
【图】FPGA烧录-固化FLASH时报错(错误原因是Vivado-2022.2不支持QSPI-FLASH“mx25l25645g-spi-x1_x2_x4”)
2. 驱动
2.1 驱动下载与编译安装
驱动下载与编译安装,分别测试了Ubuntu-22.04.4-LTS和CentOS-7.9,驱动编译正常。
1.驱动编译:在xdma中执行sudo make install命令编译驱动,生成xmda.ko文件。
2.编译工具:在tools中执行make命令编译工程,生成reg_rw、dma_to_device、dma_from_device可执行文件。
3.驱动加载:在tests中执行sudo ./load_driver.sh加载驱动
4.如果需要增加设备ID,需要修改xdma/xdma_mod.c文件,在”pci_device_id“结构体下增加PCI_DEVICE的Vendor ID和Device ID。
a.驱动下载
git clone https:
b.进入目录
cd dma_ip_drivers
cd XDMA/linux-kernel
cd ./xdma
c.编译与安装(普通用户注意权限问题)
sudo make install
d.其他
XDMA的驱动编译、安装及测试参考文件:dma_ip_drivers/XDMA/linux-kernel/readme.txt
zhaomj@localhost:~/zmj_ws/git_xilinx$ git clone https:
zhaomj@localhost:~/zmj_ws/git_xilinx$ cd dma_ip_drivers/XDMA/linux-kernel/xdma
zhaomj@localhost:~/zmj_ws/git_xilinx$ sudo make install
zhaomj@localhost:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma$ sudo make install
Makefile:17: XVC_FLAGS: .
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build M=/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64'
/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/Makefile:17: XVC_FLAGS: .
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/libxdma.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_cdev.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_ctrl.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_events.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_sgdma.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_xvc.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_bypass.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_mod.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_thread.o
LD [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.o
Building modules, stage 2.
/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/Makefile:17: XVC_FLAGS: .
MODPOST 1 modules
CC /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.mod.o
LD [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64'
installing kernel modules to /lib/modules/3.10.0-1160.119.1.el7.x86_64/xdma ...
‘xdma.ko’ -> ‘/lib/modules/3.10.0-1160.119.1.el7.x86_64/xdma/xdma.ko’
zhaomj@localhost:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma$
zhaomj@ahag_121:~/zmj_ws$ cd git_xilinx/
zhaomj@ahag_121:~/zmj_ws/git_xilinx$ git clone https:
zhaomj@ahag_121:~/zmj_ws/git_xilinx$ ls
dma_ip_drivers dma_ip_drivers.tar.gz readme.txt
zhaomj@ahag_121:~/zmj_ws/git_xilinx$ cd dma_ip_drivers/
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers$ ls
docs index.html QDMA README.md XDMA XVSEC
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers$ cd XDMA/linux-kernel/
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel$ ls
COPYING include LICENSE readme.txt RELEASE tests tools xdma
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel$ cd xdma/
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma$ sudo make install
Makefile:17: XVC_FLAGS: .
make -C /lib/modules/3.10.0-1160.el7.x86_64/build M=/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'
/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/Makefile:17: XVC_FLAGS: .
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/libxdma.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_cdev.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_ctrl.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_events.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_sgdma.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_xvc.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/cdev_bypass.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_mod.o
CC [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma_thread.o
LD [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.o
Building modules, stage 2.
/xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/Makefile:17: XVC_FLAGS: .
MODPOST 1 modules
CC /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.mod.o
LD [M] /xdsk/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma/xdma.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'
installing kernel modules to /lib/modules/3.10.0-1160.el7.x86_64/xdma ...
‘xdma.ko’ -> ‘/lib/modules/3.10.0-1160.el7.x86_64/xdma/xdma.ko’
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/xdma$ cd ..
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel$ ls
COPYING include LICENSE readme.txt RELEASE tests tools xdma
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel$ cd tools/
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ ls
dma_from_device.c dma_to_device.c dma_utils.c Makefile performance.c reg_rw.c test_chrdev.c
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ sudo make
cc -c -std=c99 -o reg_rw.o reg_rw.c -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -o reg_rw reg_rw.o
cc -c -std=c99 -o dma_to_device.o dma_to_device.c -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -lrt -o dma_to_device dma_to_device.o -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -c -std=c99 -o dma_from_device.o dma_from_device.c -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -lrt -o dma_from_device dma_from_device.o -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -c -std=c99 -o performance.o performance.c -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -o performance performance.o -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -c -std=c99 -o test_chrdev.o test_chrdev.c -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE
cc -o test_chrdev test_chrdev.o
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ ls
dma_from_device dma_to_device dma_utils.c performance.c reg_rw.c test_chrdev.c
dma_from_device.c dma_to_device.c Makefile performance.o reg_rw.o test_chrdev.o
dma_from_device.o dma_to_device.o performance reg_rw test_chrdev
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ sudo modprobe xdma
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ dmesg | tail
[ 10.868269] virbr0: port 1(virbr0-nic) entered listening state
[ 10.868301] IPv6: ADDRCONF(NETDEV_UP): virbr0: link is not ready
[ 10.888705] virbr0: port 1(virbr0-nic) entered disabled state
[ 14.333459] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 14.333461] Bluetooth: BNEP filters: protocol multicast
[ 14.333463] Bluetooth: BNEP socket layer initialized
[ 14.559749] rfkill: input handler disabled
[ 17.463079] TCP: lp registered
[ 756.672292] xdma:xdma_mod_init: Xilinx XDMA Reference Driver xdma v2020.2.2
[ 756.672294] xdma:xdma_mod_init: desc_blen_max: 0xfffffff/268435455, timeout: h2c 10 c2h 10 sec.
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$
【图】Ubuntu-22.04.4-LTS编译安装驱动
【图】CentOS-7.9编译安装驱动
2.2 驱动源文件说明
文件说明
序号 |
文件 |
说明 |
---|
1 |
include |
编译依赖文件。 |
2 |
tests |
测试文件:load_driver负责加载驱动,run_test.sh执行DMA测试,dma_memory_mapped_test是MM测试调用脚本,dma_streaming_test.sh是Stream测试调用脚本,data是测试数据文件夹(包含测试数据) |
3 |
tools |
工具文件(测试文件):reg_rw.c是AXI4-Lite和AXI4-Bypass通道读写寄存器工具,dma_to_device.c是AXI4通道写工具,dma_from_device.c是AXI4通道读工具。 |
4 |
xdma |
驱动源文件,其中xdma_mod.c添加设备的VendorID和DeviceID |
5 |
readme.txt |
说明文件(编译及测试流程的简要说明) |
6 |
RELEASE |
版本说明 |
7 |
COPYING |
权限 |
8 |
LICENSE |
证书 |
2.3 驱动加载及验证
2.3.1 驱动加载
通过“modprobe”或者“insmod”加载xdma驱动,此处执行驱动加载指令:sudo modprobe xdma
还可以通过执行驱动加载脚本:sudo ./load_driver.sh 加载驱动;执行:sudo rmmod xdma 卸载驱动。
通过观察dmesg日志,可以看到驱动正确加载。
【图】使用“modprobe”加载驱动
【图】使用load_driver.sh脚本加载驱动失败(原因是FPGA未加载XDMA固件,因此无法识别PCIE设备导致驱动加载异常)
2.3.2 驱动验证
可以通过“lsmod | grep xdma”查看xdma驱动是否成功加载。
驱动加载正常时,会打印和XDMA相关的驱动信息:
//------lspci:
功能:用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息。
语法: Ispci(选项)
选项
-n:以数字方式显示PCI厂商和设备代码;
-t:以树状结构显示PCI设备的层次关系,包括所有的总线、桥、设备以
及它们之间的联接;
-b:以总线为中心的视图;
-d:仅显示给定厂商和设备的信息;
-s:仅显示指定总线、插槽上的设备和设备上的功能块信息;
-i:指定PCI编号列表文件,而不使用默认的文件;
-m:以机器可读方式显示PCI设备信息。
//---参数说明
BDF(Bus-Function-Module):0000:01:00.0
Vendor-ID: 10ee 表示Xilinx
Device-ID: 7022 表示7Series/PCIe-Gen2.0/2X
BDF(Bus-Function-Module):
0000:01:00.0
Vendor-ID:
10ee 表示Xilinx
Device-ID:
7022 表示7Series/PCIe-Gen2.0/2X
【图】驱动加载验证正常
2.4 驱动基本解析
从DMA的角度出发去讨论Xilinx的PCIE传输过程。
值得注意的是,在pcie dma传输数据的过程中,驱动程序会申请两次DMA。第一次是在驱动初始化的时候:
engine->desc = dma_alloc_coherent(&xdev->pdev->dev,
XDMA_TRANSFER_MAX_DESC *
sizeof(struct xdma_desc),
&engine->desc_bus, GFP_KERNEL);
申请的是xdma IP规定的dma描述符,其结构体定义如下:
struct xdma_desc {
u32 control;
u32 bytes;
u32 src_addr_lo;
u32 src_addr_hi;
u32 dst_addr_lo;
u32 dst_addr_hi;
u32 next_lo;
u32 next_hi;
} __packed;
把engine->desc_bus直接写到XDMA IP的0H2C SGDMA Descriptor Low Address和H2C SGDMA Descriptor High Address寄存器,然后xdma ip就可以获取到内存中该结构体对应的内容。
第二次申请是在应用程序和pcie设备传输数据的时候,也就是H2C或C2H的时候。驱动程序会根据应用程序申请内存空间大小进行流式dma映射,然后把pcie设备能操作的总线地址写到struct xdma_desc的src_addr_lo、src_addr_hi、dst_addr_lo和dst_addr_hi,要传输的大小写到bytes,这样pcie设备就可以通过XDMA IP的0H2C SGDMA Descriptor Low Address和H2C SGDMA Descriptor High Address寄存器的地址去获取dma的传输信息了。
3. 功能测试
3.1 PCIE设备状态
如上述“2.3 驱动加载及验证”,通过“lspci”指令查看PCIE设备状态。
//------指令:
sudo lspci -vv -s 0000:01:00.0
sudo lspci -xxv -s 0000:01:00.0
//------
BAR0寄存器(AXI4-Lite)存储空间:
Memory at 50500000 (32-bit, non-prefetchable) [size=64K]
//------示例Log信息
zhaomj@ahag_121:~/zmj_ws$ sudo lspci -vv -s 0000:01:00.0
01:00.0 Memory controller: Xilinx Corporation Device 7022
Subsystem: Xilinx Corporation Device 0007
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 171
Region 0: Memory at 50500000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [40] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [48] MSI: Enable+ Count=1/1 Maskable- 64bit+
Address: 00000000fee002f8 Data: 0000
Capabilities: [60] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 75.000W
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+
MaxPayload 256 bytes, MaxReadReq 512 bytes
DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
LnkCap: Port
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 5GT/s, Width x2, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis-, LTR-, OBFF Not Supported
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [100 v1] Device Serial Number 00-00-00-00-00-00-00-00
Kernel driver in use: xdma
Kernel modules: xdma
zhaomj@ahag_121:~/zmj_ws$ sudo lspci -xxv -s 0000:01:00.0
01:00.0 Memory controller: Xilinx Corporation Device 7022
Subsystem: Xilinx Corporation Device 0007
Flags: bus master, fast devsel, latency 0, IRQ 171
Memory at 50500000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [40] Power Management version 3
Capabilities: [48] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [60] Express Endpoint, MSI 00
Capabilities: [100] Device Serial Number 00-00-00-00-00-00-00-00
Kernel driver in use: xdma
Kernel modules: xdma
00: ee 10 22 70 06 00 10 00 00 00 80 05 10 00 00 00
10: 00 00 50 50 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 ee 10 07 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 ff 01 00 00
zhaomj@ahag_121:~/zmj_ws$
【图】PCIE设备状态
3.2 寄存器读写
寄存器读写使用reg_rw通过AXI4-Lite通道进行读写操作。
写寄存器指令格式:./reg_rw <设备> <地址> <数据长度> <写入数据>
sudo ./reg_rw /dev/xdma0_control 0x1004 w 0x11223344
解析:设备xdma0_control,偏移地址0x1004,操作写,数据0x11223344
读寄存器指令格式:./reg_rw <设备> <地址> <数据长度>
sudo ./reg_rw /dev/xdma0_control 0x1004 r
解析:设备xdma0_control,偏移地址0x1004,操作读
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ sudo ./reg_rw /dev/xdma0_control 0x1004 w 0x11223344
device: /dev/xdma0_control, address: 0x1004 (0x1000+0x4), access write.
access width: word (32-bits)
character device /dev/xdma0_control opened.
Memory 0x1000 mapped at address 0x7f194fac1000.
Write 32-bits value 0x11223344 to 0x1004 (0x0x7f194fac1004)
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$ sudo ./reg_rw /dev/xdma0_control 0x1004 r
device: /dev/xdma0_control, address: 0x1004 (0x1000+0x4), access write.
access width: default to word (32-bits)
character device /dev/xdma0_control opened.
Memory 0x1000 mapped at address 0x7fa5823ba000.
Read 32-bit value at address 0x1004 (0x7fa5823ba004): 0x11223344
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tools$
【图】BAR0寄存器读写测试
3.3 完整测试
执行tests文件夹下的脚本“run_test.sh”可以完成对XDMA的测试,整个测试流程包括查询使能通道、确定接口方式(MM or ST),根据接口方式调用脚本dma_memory_mapped_test.sh或者dma_streaming_test。dma_memory_mapped_test.sh和dma_streaming_test脚本首先使用dma_to_device命令发送测试数据到BRAM,然后使用dma_from_device命令从BRAM中取出数据,最后对比两个文件的数据是否一致。测试记过如下图所示。
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tests$ sudo ./run_test.sh
Info: Number of enabled h2c channels = 2
Info: Number of enabled c2h channels = 2
Info: The PCIe DMA core is memory mapped.
Info: Running PCIe DMA memory mapped write read test
transfer size: 1024, count: 1
Info: Writing to h2c channel 0 at address offset 0.
Info: Writing to h2c channel 1 at address offset 1024.
Info: Wait for current transactions to complete.
/dev/xdma0_h2c_0 ** Average BW = 1024, 22.168821
/dev/xdma0_h2c_1 ** Average BW = 1024, 24.960390
Info: Writing to h2c channel 0 at address offset 2048.
Info: Writing to h2c channel 1 at address offset 3072.
Info: Wait for current transactions to complete.
/dev/xdma0_h2c_0 ** Average BW = 1024, 28.497482
/dev/xdma0_h2c_1 ** Average BW = 1024, 28.234257
Info: Reading from c2h channel 0 at address offset 0.
Info: Reading from c2h channel 1 at address offset 1024.
Info: Wait for current transactions to complete.
/dev/xdma0_c2h_0 ** Average BW = 1024, 25.516434
/dev/xdma0_c2h_1 ** Average BW = 1024, 23.529953
Info: Reading from c2h channel 0 at address offset 2048.
Info: Reading from c2h channel 1 at address offset 3072.
Info: Wait for current transactions to complete.
/dev/xdma0_c2h_0 ** Average BW = 1024, 20.966421
/dev/xdma0_c2h_1 ** Average BW = 1024, 24.374569
Info: Checking data integrity.
Info: Data check passed for address range 0 - 1024
Info: Data check passed for address range 1024 - 2048
Info: Data check passed for address range 2048 - 3072
Info: Data check passed for address range 3072 - 4096
Info: All PCIe DMA memory mapped tests passed.
Info: All tests in run_tests.sh passed.
zhaomj@ahag_121:~/zmj_ws/git_xilinx/dma_ip_drivers/XDMA/linux-kernel/tests$
【图】运行完整测试
//------end