仅对英特尔可见 — GUID: nik1410905619848
Ixiasoft
5.11.5. 软件编程以同时读和写DMA
按以下步骤编程从而实现按DMA同步传输:
- 为读和写DMA描述符列表分配根端口存储器。假设列表包含多达128个, 8-dword描述符和128个, 1-dword状态条目,总共1152个dword。用于读和写DMA描述符列表的存储器总容量为2304 dword。
- 分配根端口存储器并通过数据将它初始化以用于读DMA进行读取。
- 分配根端口存储器以用于写DMA写入。
- 为读 DMA描述符列表创建所有描述符。逐步分配DMA Descriptor ID,从0开始,最多到127。对于读DMA来说,源地址是步骤2中所分配的存储器空间。目的地址是读DMA模块写入的Avalon‑MM地址。以dword为单位指定DMA长度。每个描述符传输相邻的存储器。假设用于读DMA的基地址为0,以下分配说明了一个读描述符的构成:
- RD_RC_LOW_SRC_ADDR = 0x0000 (根端口中用于读描述符列表的基地址)
- RD_RC_HIGH_SRC_ADDR = 0x0004
- RD_CTLR_LOW_DEST_ADDR 0x0008
- RD_CTLR_HIGH_DEST_ADDR = 0x000C
- RD_DMA_LAST_PTR = 0x0010
写RD_DMA_LAST_PTR寄存器开始操作。 - 关于写DMA,源地址是写DMA模块应该读取的Avalon-MM地址。目的地址是步骤3中所分配的根端口存储器空间。以dword为单位指定DMA长度。假设用于写DMA的基地址为0x100,以下分配说明一个写描述符的构成:
- RD_RC_LOW_SRC_ADDR = 0x0100 (根端口中用于读描述符列表的基地址)
- WD_RC_HIGH_SRC_ADDR = 0x0104
- WD_CTLR_LOW_DEST_ADDR 0x0108
- WD_CTLR_HIGH_DEST_ADDR = 0x010C
- WD_DMA_LAST_PTR = 0x0110
写WD_DMA_LAST_PTR寄存器开始操作。 - 为提高吞吐量,读DMA模块在操作开始之前就将描述符列表复制到Avalon-MM存储器。通过写EP Descriptor Table Base (Low)和(High)寄存器指定存储器地址。
- 为每个WD_DMA_LAST_PTR或RD_DMA_LAST_PTR完成发送一个MSI中断。这些完成会引起done状态位的更新。然后主机软件会读状态位以决定哪个DMA操作已被完成。
注: 支持读DMA请求的无序完成。如果读DMA的传输量超过读请求的最大量,则读DMA创建多个读请求。例如,Maximum Read Request Size为512 bytes,读DMA把一个4 KB读请求分成8个请求并使用8个不同标签标示。读完成可按任何顺序返回。读DMA Avalon-MM主端口根据标签把读完成写入正确的位置。