一、驱动代码介绍: zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├── COPYING ├── include │ └── libxdma_api.h ├── LICENSE ├── readme.txt ├── RELEASE ├── tests │ ├── data │ │ ├── datafile0_4K.bin │ │ ├── datafile1_4K.bin │ │ ├── datafile2_4K.bin │ │ ├── datafile_256K.bin │ │ ├── datafile_32M.bin │ │ ├── datafile3_4K.bin │ │ └── datafile_8K.bin │ ├── dma_memory_mapped_test.sh │ ├── dma_streaming_test.sh │ ├── load_driver.sh │ ├── perform_hwcount.sh │ └── run_test.sh ├── tools │ ├── \001 │ ├── dma_from_device.c │ ├── dma_to_device.c │ ├── dma_utils.c │ ├── Makefile │ ├── performance.c │ ├── perform_hwcount.sh │ └── reg_rw.c └── xdma ├── cdev_bypass.c ├── cdev_ctrl.c ├── cdev_ctrl.h ├── cdev_events.c ├── cdev_sgdma.c ├── cdev_sgdma.h ├── cdev_xvc.c ├── cdev_xvc.h ├── libxdma.c ├── libxdma.h ├── Makefile ├── version.h ├── xdma_cdev.c ├── xdma_cdev.h ├── xdma_mod.c ├── xdma_mod.h ├── xdma_thread.c └── xdma_thread.h 5 directories, 43 files zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ 二、查看驱动源码里面的介绍: <project_root>/ |__ build/ - Generated directory containing build output binaries. |__ exe/ - Contains sample client application source code. | |__ user_events/ - Sample code demonstrating access to user event interrupts. | |__ xdma_info/ - Utility application which prints out the XDMA core ip | | configuration. | |__ xdma_rw/ - Utility for reading/writing to/from xdma device nodes such | | as control, user, bypass, h2c_0, c2h_0 etc. | |__ xdma_test/ - Basic test application which performs H2C/C2H transfers on | all present channels. |__ inc/ - Contains public API header file for XDMA driver. |__ sys/ - Contains the XDMA driver source code. |__ README.md - This file. |__ XDMA.sln - Visual Studio Solution. 三、主要节点 比如使用user来读取我工程的用户寄存器。即AXI_LITE控制的bram上的数据。 例如: xdma_rw.exe user(操作模式) read(读or写) 0x00(操作地址) -l(读出的形式文件或者字节)4(读出的字节数) 四、XDMA IP介绍: DMA Interface,在XDMA IP核中,DMA接口设置部分有两个选项,一个就是 AXI Memory Mapped,而另外一个就是AXI Stream。 提到上述两个选项,看到的时候也是很莫名,这两个选项究竟有何区别,让我们通过AXI总线协议来说明他们的相同与不同。
应用场景 AXI4.0-lite主要用于内核和外设寄存器之间的通信。AXI4.0-lite就特别合适。 AXI4.0-full主要用于往DDR或者OCM中写入大量数据时使用。 AXI_stream主要用于往FIFO等没有地址的数据缓冲区传送大量数据时使用 根据上述对AXI总线协议的介绍,需要根据使用环境来选择协议类型,通过DDR进行大量数据读写时,会使用AXI-full总线模式,也就是在IP核设置中的AXI Memory Mapped选项。AXI Stream协议是不包含地址线的,所以在读写FIFO等没有地址的数据缓存区时,可以使用AXI Stream协议,也就是AXI Stream选项。上位机通常会通过PCIE接口向下位机发送各种控制或者配置指令,此时就需要使用添加AXI-Lite选项,可以勾选下图中所示选项进行添加,AXI-lite可以说是简化版的AXI-full。在使用WDK进行读写时,有BAR0和BAR1两个空间,一个就是勾选的PCIe to AXI Lite Master Interface接口,用于设置寄存器。另一个就是默认勾选的PCIe to DMA Interface接口,用于数据的读写。 PCIe to AXI Lite Master Interface 在BARs页面中,会有PCIe to AXI Lite Master Interface一栏,众所周知主机访问地址与下位机实际控制地址是不一样的,所以PCIe to AXI Lite Master Interface这个接口就是将上位机地址与下位机地址进行一个映射,将两部分联系起来,比如在这一栏中设置0x80000000,那么实际的意义就是bar的0地址对应的是外设的0x80000000地址,当上位机对0地址进行操作的时候实际是对下位机的0x80000000地址进行操作。 握手过程 每个通道进行数据的交互时,需要进行双向握手操作即VALID和READY信号均为高时,写入的数据才会有效。在握手过程中可能会出现,1.VALID先有效,然后READY再有效,在两者均有效的时候写入数据有效。2.READY先有效,然后VALID再有效,在两者均有效的时候写入数据有效。3.恰好READY有效,VALID也有效,在两者均有效的时候写入数据有效。 就好像有两个人做工作,彼此的工作是相关的,A对B说,我已经弄完了,等你弄完告诉我一声,我们联合测试。基本就是这个道理。 可以通过下图来看到三种握手协议。 AXI4内存映射接口 首先,测试用例启动H2C引擎,H2C引擎从Host内存中读取数据然后写到用户端的Block RAM。然后,测试用例启动C2H引擎,从Block RAM 中读取数据然后写到Host 内存中。 五、FPGA仿真的步骤:
|
|
来自: charlie_linux > 《pcie》