#include <nitro/mi.h>
void MI_DmaCopy32( u32 dmaNo, const void* src, void* dest, u32 size );
void MI_DmaCopy16( u32 dmaNo, const void* src, void* dest, u32 size );
void MI_DmaCopy32Async( u32 dmaNo, const void* src, void* dest, u32 size,
MIDmaCallback callback, void* arg );
void MI_DmaCopy16Async( u32 dmaNo, const void* src, void* dest, u32 size,
MIDmaCallback callback, void* arg );
| dmaNo | DMA channel used. |
src |
The transfer source address. |
dest |
The transfer destination address. |
size |
Transfer size. |
callback |
Callback when DMA ends. |
arg |
Callback argument when DMA ends. |
None.
Uses DMA to copy.
MI_DmaCopy16() and MI_DmaCopy16Async() copy in 16-bit units. Both the transfer source address and the transfer destination address must be 2-byte aligned. MI_DmaCopy32() and MI_DmaCopy32Async() copy in 32-bit units. Both the transfer source address and the transfer destination address must be 4-byte aligned.
MI_DmaCopy16() and MI_DmaCopy32() wait within the function until DMA completes. MI_DmaCopy16Async() and MI_DmaCopy32Async() call a callback function when DMA ends. The callback, callback, is a MIDmaCallback type (a void type function which takes one void* argument). callback is called from the system DMA interrupt handler and therefore is called while interrupts are prohibited.
It is necessary to understand how to use Async-type APIs in order to obtain maximum functionality.
The following is an example of a function nameCall_BackGroundJob_with_DMA() that is placed within TCM.
The following processes are performed:
TRUE is entered in isDmaFinished in callback().
isDmaFinished is polled as an end flag and BackGroundJob() can be called continuously until DMA ends.
However, the following must be considered to have this process proceed as intended:
isDmaFinished is not taken inside TCM, then stalling will occur during the while(!isDmaFinished) check.
BackGroundJob() accesses the ARM bus.
BackGroundJob() cannot be called continuously.
//--- sample code ( This code must be in ITCM ) void Call_BackGroundJob_with_DMA(void) { vu32 isDmaFinished = FALSE; MI_DmaCopy32Async( dmaNo, srcArea, destArea, dataSize, callback, (void*)&isDmaFinished ); while( !isDmaFinished ){ BackGroundJob(); } } void callback( void* arg ) { *(vu32*)arg = TRUE; }
Uses the following IO registers: DMAn source register (0x40000B0 + 12n), DMAn destination register (0x40000B4 + 12n), and DMAn control register (0x40000B8 + 12n). n is the DMA channel used.)
MI_DmaFill*, MI_DmaClear*, MI_DmaSend*, MI_CpuCopy*
03/08/2005 Standardized the Japanese term for "interrupt".
12/22/2004 Added a description regarding callback.
12/01/2003 Initial version
CONFIDENTIAL