AXI DMA用于AXI4 memory mapped和AXI4-Stream之间的转换
Scatter Gather Mode性能更好,更消耗逻辑资源,使用更复杂一些。
Direct Register Mode则相反。
AXI DMA更加详细的介绍请参考:pg021_axi_dma.pdf
使用AXI DMA传输的步骤:
非Scatter Gather mode
To use the Simple mode DMA engine for transfers, the following setup is required:
-
DMA Initialization using XAxiDma_CfgInitialize() function. This step initializes a driver instance for the given DMA engine and resets the engine.
-
Enable interrupts if chosen to use interrupt mode. The application is responsible for setting up the interrupt system, which includes providing and connecting interrupt handlers and call back functions, before enabling the interrupts.
-
Set the buffer address and length field in respective channels to start the DMA transfer
-
DMA Initialization using XAxiDma_CfgInitialize() function. This step initializes a driver instance for the given DMA engine and resets the engine.
-
BD Ring creation. A BD ring is needed per DMA channel and can be built by calling XAxiDma_BdRingCreate().
-
Enable interrupts if chose to use interrupt mode. The application is responsible for setting up the interrupt system, which includes providing and connecting interrupt handlers and call back functions, before enabling the interrupts.
-
Start a DMA transfer: Call XAxiDma_BdRingStart() to start a transfer for the first time or after a reset, and XAxiDma_BdRingToHw() if the channel is already started. Calling XAxiDma_BdRingToHw() when a DMA channel is not running will not put the BDs to the hardware, and the BDs will be processed later when the DMA channel is started through XAxiDma_BdRingStart().
Post-Processing 这个不是很了解 Software Post-Processing on completed DMA transactions If the interrupt system has been set up and the interrupts are enabled, a DMA channels notifies the software about the completion of a transfer through interrupts. Otherwise, the user application can poll for completions of the BDs, using XAxiDma_BdRingFromHw() or XAxiDma_BdHwCompleted().
-
Once BDs are finished by a channel, the application first needs to fetch them from the channel using XAxiDma_BdRingFromHw().
-
On the TX side, the application now could free the data buffers attached to those BDs as the data in the buffers has been transmitted.
-
On the RX side, the application now could use the received data in the buffers attached to those BDs.
-
For both channels, completed BDs need to be put back to the Free group using XAxiDma_BdRingFree(), so they can be used for future transactions.
-
On the RX side, it is the application's responsibility to have BDs ready to receive data at any time. Otherwise, the RX channel refuses to accept any data if it has no RX BDs.