#include <iris/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チャンネル |
| src | 転送元アドレス |
| dest | 転送先アドレス |
| size | 転送サイズ |
| callback | DMA終了時のコールバック |
| arg | DMA終了時のコールバック引数 |
なし。
DMAを用いてコピーを行います。
MI_DmaCopy16(), MI_DmaCopy16Async() は 16ビット単位でコピーを行います。転送元アドレス、転送先アドレスは2バイトアラインメントする必要があります。
MI_DmaCopy32(), MI_DmaCopy32Async() は 32ビット単位でコピーを行います。転送元アドレス、転送先アドレスは4バイトアラインメントする必要があります。
MI_DmaCopy16(), MI_DmaCopy32() はDMAの終了を関数内で待ちます。
MI_DmaCopy16Async(), MI_DmaCopy32Async() は、DMA終了時にコールバックを呼びます。コールバックは MIDmaCallback 型(void* 引数1つを取る void 型関数)です。
Async 型の API の機能を引き出すにはその使用法を十分に理解する必要があります。
例として、次のようなCall_BackGroundJob_with_DMA()というTCM内に配置された関数がある場合を考えます。
このときは以下のような処理が行なわれます.
但し、この処理が意図通りに処理されるには以下のようなことに注意しなくてはなりません。
//--- 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; }
IOレジスタのDMAnソースレジスタ(0x40000B0 + 12n)、DMAnデスティネーションレジスタ(0x40000B4 + 12n)、DMAnコントロールレジスタ(0x40000B8 + 12n)を使用します。( n は 使用するDMAチャンネルです。)
MI_DmaFill*, MI_DmaClear*, MI_CpuCopy*
2003/12/01 初版