MI_DmaRecv*

構文

#include <nitro/mi.h>

void MI_DmaRecv32( u32 dmaNo,
           volatile const void* src,
           void* dest,

                 u32 size );

void MI_DmaRecv32_SetUp( u32 dmaNo,
           volatile const void* src,
           void* dest,

                 u32 size );

void MI_DmaRecv16( u32 dmaNo,
           volatile const void* src,
           void* dest,
           u32 size );


void MI_DmaRecv16_SetUp( u32 dmaNo,
           volatile const void* src,
           void* dest,
           u32 size );


void MI_DmaRecv32Async( u32 dmaNo,
             volatile const void* src,
             void* dest,
             u32 size,

                    MIDmaCallback callback,
             void* arg );

void MI_DmaRecv32Async_SetUp( u32 dmaNo,
             volatile const void* src,
             void* dest,
             u32 size,

                    MIDmaCallback callback,
             void* arg );

void MI_DmaRecv16Async( u32 dmaNo,
              volatile const void* src,
              void* dest,
              u32 size,

                     MIDmaCallback callback,
              void* arg );


void MI_DmaRecv16Async_SetUp( u32 dmaNo,
              volatile const void* src,
              void* dest,
              u32 size,

                     MIDmaCallback callback,
              void* arg );

引数

dmaNo 使用DMAチャンネル
src 転送元アドレス
dest 転送先アドレス
size 転送サイズ
callback DMA終了時のコールバック
arg DMA終了時のコールバック引数

返り値

なし。

説明

DMAを用いて同じアドレスからデータを受け取ります。
転送元アドレスを変えず、転送先アドレスだけをインクリメントし、連続領域にデータを次々と受け取ります。

*_SetUp() は実際にはDMAを行なわず、その設定のみを行います。実際のDMA開始は MI_DmaRestart() を呼んで下さい。

MI_DmaRecv16(), MI_DmaRecv16Async() は 16ビット単位で転送します。転送元アドレス、転送先アドレスは2バイトアラインメントする必要があります。
MI_DmaRecv32(), MI_DmaRecv32Async() は 32ビット単位で転送します。転送元アドレス、転送先アドレスは4バイトアラインメントする必要があります。

MI_DmaRecv16(), MI_DmaRecv32() はDMAの終了を関数内で待ちます。
MI_DmaRecv16Async(), MI_DmaRecv32Async() は、DMA終了時にコールバック callback を呼びます。コールバックは MIDmaCallback 型 ( void* 引数1つを取る void 型関数 ) です。callback は システムのDMA割り込みハンドラ内から呼び出されますので、割り込み禁止状態で呼び出されます。

Async 型の API の機能を引き出すにはその使用法を十分に理解する必要があります。 これについては、MI_DmaCopy() を参照してください。


DMAコントローラの不具合

MI_DmaCopy() のリファレンス中の「DMAコントローラの不具合」を参照してください。

内部動作

IOレジスタのDMAnソースレジスタ(0x40000B0 + 12n)、DMAnデスティネーションレジスタ(0x40000B4 + 12n)、DMAnコントロールレジスタ(0x40000B8 + 12n)を使用します。( n は 使用するDMAチャンネルです。)

参照

MI_DmaCopy*, MI_DmaFill*, MI_DmaClear*, MI_DmaSend*, MI_CpuRecv*, MI_DmaRestart

履歴

2009/11/20 DMAコントローラの不具合について追記
2007/10/31 _SetUp() 追加
2007/10/23 初版