仅对英特尔可见 — GUID: nik1410905618754
Ixiasoft
5.11.4. 读DMA实例
本实例将3个数据块从系统存储器移动到Avalon-MM address space. 地址空间。在嵌入式CPU上运行的主机软件分配存储器并在系统存储器中创建描述符列表。
本实例使用的地址位于 <install_dir>/ ip/altera/altera_pcie/altera_pcie_<dev>_ed/example_design/<dev>目录的Qsys设计实例,ep_g3x8_avmm256_integrated.qsys中。
下图介绍PCIe和Avalon-MM地址空间中数据块的位置和大小,以及描述符列表格式。此实例中,RD_TABLE_SIZE的值为127。
图 29. 通过读DMA,把数据块从PCIe地址空间传输到Avalon-MM地址空间。
假设描述符列表包含128个条目。 状态列表优先于存储器中各种数量的描述符。读和写状态,以及描述符列表分别位于RC Read Descriptor Base Register和RC Write Descriptor Base Register指定的地址。
图 30. 描述符列表格式
- 计算所需的存储器分配:
- 状态列表中每个条目是4 bytes。128个条目需要存储器的512 bytes。
- 每个描述符是32 bytes。3个描述符需要存储器的96 bytes。
状态和描述符列表共需分配存储器608 bytes。 - 在PCI Express地址空间中分配存储器的608 bytes。
此实例中所分配的存储器起始地址为0xF000_0000。将此地址编程到根复合读状态以及描述符基地址寄存器中。
- 在PCI Express地址空间创建描述符列表。由于状态列表先于描述符被储存,于是首个描述符被储存在:0xF000_0000 + 0x200 = 0xF000_0200。
- 编程0x0000_0000到描述符0的源地址0xF000_0204中。
这是源地址的上32 bits。
- 编程 0x1000_0000到描述符0的源地址0xF000_0200中。
这是源地址的下32 bits。
- 编程0x0000_0000到描述符0的目的地址0xF000_020C中。
这是目的地址的上32 bits。
- 编程0x5000_0000到描述符0的目的地址0xF000_0208中。
这是目的地址的下32 bits。通过这四个步骤把存储器64KB块的Avalon-MM目的地址编程到描述符列表。
- 编程0x0000_4000到0xF000_0210以传输描述符ID 0数据的16K dword (64 KB)。
- 编程0x0000_0000到描述符0的源地址0xF000_0204中。
- 为第二数据块重复此流程:
- 编程0x0000_0000到源地址0xF000_0224。
- 编程0x2000_0000到源地址0xF000_0220。
- 编程0x0000_0000到目的地址0xF000_022C。
- 编程0x0001_0000到目的地址0xF000_0228。
- 编程0x0004_2000到0xF000_0230以传输描述符ID 1数据的8K dword (32 KB)。
- 为第三数据块重复此流程:
- 编程0x0000_0001到源地址0xF000_0244。
- 编程0x2000_0000到源地址0xF000_0240。
- 编程0x0000_0000到目的地址0xF000_024C。
- 编程0x1000_00 00到目的地址0xF000_0248。
- 编程0x0008_1000到0xF000_0250以传输描述符ID 2数据的4K dword (16 KB)。
下图显示了完成编程后描述符列表中的值。图 31. 描述符列表格式 - 使用PCI Express系统存储器地址空间状态地址和描述符列表地址编程DMA描述符控制器。如果是内部DMA描述符,就通过组合BAR0和BAR1访问这些寄存器,因为此实例使用64-bit地址。DMA读控制寄存器起始于偏移0x0000。写DMA控制寄存器起始于偏移0x0100。
- 编程0x0000_0000到偏移0x0000_0004。
此为存储状态和描述符列表的PCIe系统存储器的上32 bits。
- 编程0xF000_0000到偏移0x0000_0000。
此为存储状态和描述符列表的PCIe存储器地址的下32 bits。读DMA自动添加一个0x200的偏移到该值,以开启基于存储器状态列表的描述符副本。
- 编程0x0000_0000到偏移0x0000_0004。
- 通过片上FIFO地址编程DMA描述符控制器。描述符控制器将从该地址复制状态和描述符列表。
- 编程0x0000_0000到偏移0x0000_000C
此为 Avalon-MM地址域中片上FIFO地址的上32 bits。
- 编程0x0100_0000到偏移0x0000_0008。
此为片上FIFO地址的下32位。它是内部片上FIFO的地址,同时也是透过RX Master所见到描述符控制器的一部分。图 32. 片上FIFO的地址
- 编程0x0000_0000到偏移0x0000_000C
- 编程描述符控制器RD_DMA_LAST_PTR寄存器。
由此步骤开启DMA。完成3个描述符后也由它指定需要被更新的状态dword。
-
– 将最后一个描述符单独更新为done位,并编程0x2到偏移0x0000_0010。描述符控制器处理完全部3个描述符并在状态列表中的0xF000_0008写done位。
- – 要把全部3个描述符更新为 done 位,使用值0,1,2三次编程地址0x0000_0010 RD_DMA_LAST_PTR。描述符控制器为地址0xF000_0000, 0xF000_0004,及0xF000_0008设置done 位。如果系统支持无序读完成,则描述符控制器可能会无序完成描述符。在这样的系统中,您必须采用这样的方法为每个描述符请求done 状态。软件必须查看每个描述符的done状态。
-
相关信息