# MI_NDmaSend*

## 構文

  `#include <twl/mi.h>`
  `void MI_NDmaSend( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size );`

  `void MI_NDmaSend_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size );`

  `void MI_NDmaSendAsync( u32 dmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg );`

  `void MI_NDmaSendAsync_SetUp( u32 dmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg );`

  `void MI_NDmaSendEx( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaConfig *config );`

  `void MI_NDmaSendEx_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaConfig *config );`

  `void MI_NDmaSendExAsync( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg,`
`MINDmaConfig *config``);`

  `void MI_NDmaSendExAsync_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg,`
`MINDmaConfig *config``);`

  `void MI_NDmaSend_Dev( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaDevice dev );`

  `void MI_NDmaSend_Dev_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaDevice dev );`

  `void MI_NDmaSendAsync_Dev( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg,`
`MINDmaDevice dev );`

  `void MI_NDmaSendAsync_Dev_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg,`
`MINDmaDevice dev );`

  `void MI_NDmaSendEx_Dev( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaConfig *config,`
`MINDmaDevice dev );`

  `void MI_NDmaSendEx_Dev_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaConfig *config,`
`MINDmaDevice dev );`

  `void MI_NDmaSendExAsync_Dev( u32 ndmaNo,`
`const void* src,`
`volatile void* dest,`
`u32 size,`
`MINDmaCallback callback,`
`void* arg,`
`MINDmaConfig *config,`
`MINDmaDevice dev );`

  `void MI_NDmaSendExAsync_Dev_SetUp( u32 ndmaNo,`
`const void* src,`
`volatile 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_NDmaSend*`は TWL の新規DMAを用いてワード(4byte)単位でデータを送り続けます。転送元アドレス src、転送先アドレスdest は4バイトアラインメントする必要があります。転送サイズ size も4の倍数である必要があります。

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

`MI_NDmaSend*()` には、

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

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

関数 | 関数内でのDMAの終了待ち | 詳細なDMA設定 | DMAの開始
--- | --- | --- | ---
`MI_NDmaSend()` | する | デフォルト | 即時
`MI_NDmaSendAsync()` | しない(Async) | デフォルト | 即時
`MI_NDmaSendEx()` | する | ユーザ指定 | 即時
`MI_NDmaSendExAsync()` | しない(Async) | ユーザ指定 | 即時
`MI_NDmaSend_Dev()` | する | デフォルト | 周辺デバイスからの割り込み
`MI_NDmaSendAsync_Dev()` | しない(Async) | デフォルト | 周辺デバイスからの割り込み
`MI_NDmaSendEx_Dev()` | する | ユーザ指定 | 周辺デバイスからの割り込み
`MI_NDmaSendExAsync_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_NDmaRecv* MI_DmaSend*, MI_CpuSend*, MI_NDmaRestart
新規DMA(overview)`

## 履歴

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