MI_NDmaRecv*

構文

#include <twl/mi.h>

void MI_NDmaRecv( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size );
void MI_NDmaRecv_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size );
void MI_NDmaRecvAsync( u32 dmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg );
void MI_NDmaRecvAsync_SetUp( u32 dmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg );
void MI_NDmaRecvEx( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaConfig *config );
void MI_NDmaRecvEx_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaConfig *config );
void MI_NDmaRecvExAsync( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaConfig *config );
void MI_NDmaRecvExAsync_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaConfig *config );
void MI_NDmaRecv_Dev( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaDevice dev );
void MI_NDmaRecv_Dev_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaDevice dev );
void MI_NDmaRecvAsync_Dev( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaDevice dev );
void MI_NDmaRecvAsync_Dev_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaDevice dev );
void MI_NDmaRecvEx_Dev( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaConfig *config,
                    MINDmaDevice dev );
void MI_NDmaRecvEx_Dev_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaConfig *config,
                    MINDmaDevice dev );
void MI_NDmaRecvExAsync_Dev( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaConfig *config,
                    MINDmaDevice dev );
void MI_NDmaRecvExAsync_Dev_SetUp( u32 ndmaNo,
                    volatile const void* src,
                    void* dest,
                    u32 size,
                    MINDmaCallback callback,
                    void* arg,
                    MINDmaConfig *config,
                    MINDmaDevice dev );

引数

ndmaNo 使用DMAチャンネル (新規DMAの中で0〜3)
src 転送元アドレス
dest 転送先アドレス
size 転送サイズ
callback DMA終了時のコールバック
arg DMA終了時のコールバック引数
config DMA 設定
dev デバイス起動する場合のデバイス

返り値

なし。

説明

新規 DMA を用いて同じ転送元アドレスからデータを受け取ります。
(但し、*_SetUp() は設定のみを行います。)

MI_NDmaRecv*は TWL の新規DMAを用いてワード(4byte)単位でデータを受け取り続けます。転送元アドレス src、転送先アドレスdest は4バイトアラインメントする必要があります。転送サイズ size も4の倍数である必要があります。

使用する新規DMA を、0〜3の番号で ndmaNo で指定します。

MI_NDmaRecv*() には、

・DMAの終了を関数内で待つか、待たないか
・DMAの詳細な設定をデフォルトのまま行うか、ユーザが指定するか
・DMAを即時に開始するか、周辺デバイスからの割り込みで開始するか

の動作別に関数が用意されています。
また、*_SetUp() は実際にはDMAを行なわず、その設定のみを行います。実際のDMA開始は MI_NDmaRestart() を呼んで下さい。

関数 関数内でのDMAの終了待ち 詳細なDMA設定 DMAの開始
MI_NDmaRecv() する デフォルト 即時
MI_NDmaRecvAsync() しない(Async) デフォルト 即時
MI_NDmaRecvEx() する ユーザ指定 即時
MI_NDmaRecvExAsync() しない(Async) ユーザ指定 即時
MI_NDmaRecv_Dev() する デフォルト 周辺デバイスからの割り込み
MI_NDmaRecvAsync_Dev() しない(Async) デフォルト 周辺デバイスからの割り込み
MI_NDmaRecvEx_Dev() する ユーザ指定 周辺デバイスからの割り込み
MI_NDmaRecvExAsync_Dev() しない(Async) ユーザ指定 周辺デバイスからの割り込み


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

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

config はDMA の動作を詳細に決定する構造体へのポインタです。

dev は周辺デバイス起動DMA を行うときの、デバイスを指定します。指定できる値については、新規DMA(overview) の「DMA 起動のタイミングについて」 を参照してください。

内部動作

IOレジスタの新規DMAレジスタを使用します。

参照

MI_NDmaFill*, MI_NDmaClear*, MI_NDmaSend*, MI_DmaRecv*, MI_CpuRecv*, MI_NDmaRestart
新規DMA(overview)

履歴

2008/11/19 MINDmaDevice についての参照先を記述
2007/10/31 _SetUp() 追加
2007/10/23 初版