# CARD_ReadRomAsync

## 構文

  `#include <nitro/card.h>`
  `void CARD_ReadRomAsync(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg);`

## 引数

dma | 転送に使用するDMAチャンネルを0からMI_DMA_MAX_NUMの範囲で指定します。 TWLモードで動作していれば、新規DMAチャンネルを(MI_DMA_USING_NEW+0)から(MI_DMA_USING_NEW+MI_DMA_MAX_NUM)の範囲で指定することも可能です。 範囲外のチャンネルまたは明示的にMI_DMA_NOT_USEを指定するとDMA転送は使用せずCPUによって直接処理されます。
src | 転送元の CARD ROM アドレス
dst | 転送先のメモリアドレス
len | 読み出すデータのバイト長
callback | 完了時のコールバック関数 必要ない場合は NULL を指定します。 有効なDMAチャンネルを指定した場合、このコールバックはDMA割り込みハンドラ内から呼び出されます。
arg | 完了時のコールバック関数に与える引数 callback に NULL を指定した場合は単に無視されます。

## 返り値

なし。

## 説明

ROM の配置されたデバイスからデータを非同期的に読み込みます。
有効なDMAチャンネルを指定されている場合、MI_StopDma( )で明示的に停止してから使用します。
また、前回のアクセスが完了していなければ完了までブロッキングします。
この関数で明示的に CPU 転送を指定した場合は、同期版のCARD_ReadRom( ) と同じ動作になります。

## 注意

- この関数を使用する場合、事前にCARD_LockRom( )を呼び出してアクセスバスをロックしている必要があります。
- この関数で有効なDMAチャンネルを指定した場合、転送が完了するまでこのDMAチャンネルを使用できません。
- カードアクセスの転送元はIOレジスタなので、TWLモード動作時でかつ`SCFG_IsDmacFixed( )`がTRUEを返す状況でない限りDMAチャンネル0を指定することはできません。
- この関数は内部で割り込みを使用しますので、割り込みを禁止にしたまま待ち続けると処理が完了しないという点に注意してください。

## 内部動作

`この関数は、以下の条件を満たした場合に限りDMA転送とIRQハンドラを使用して非同期的に動作します。
この場合にはカードデータの転送とCPU処理を並列に行うことができます。`

- 転送先範囲がDMAアクセス可能かつ32バイトでアラインメントされている。
- 転送元範囲がCARD_ROM_PAGE_SIZEバイトでアラインメントされている。
- 転送サイズがCARD_ROM_PAGE_SIZEバイトでアラインメントされている。

これらの条件に合わない場合は、DMA転送の指定の有無にかかわらずCARDライブラリ内部のスレッドを使用してCPU処理による非同期処理を実行します。
このスレッドについては、CARD_GetThreadPriority( )の説明を参照ください。
DMA転送の条件を満たすために実際にアプリケーションで注意すべき点は主に以下の通りです。

- 自動変数を転送先に指定しない (スタックはデフォルトでDTCMから割り当てられるため、DMAアクセスが不可能となります。)。
- RSFファイルのRomSpec セクション内でAlignまたはAlignAllを指定し、512バイトアラインメントするようファイルを配置する。
- ファイルサイズが512バイトの整数倍でない場合、なるべく512バイトの整数倍単位に分割して読み込むようにする。

## 参照

`CARD_ROM_PAGE_SIZE, CARD_LockRom, CARD_ReadRom, CARD_TryWaitRomAsync, CARD_WaitRomAsync, CARD_GetThreadPriority`

## 履歴

2008/11/19 DMAチャンネルの指定範囲について動作モードとの関連を追記
2008/01/24 DMAチャンネルの指定範囲について追記
2006/05/10 転送先範囲が32バイトアラインメントされていないとDMA転送されないように仕様変更
2005/08/22 [内部動作] の項を大幅に修正
2005/06/01 コールバックが割り込みハンドラから呼び出される旨を補足
2005/04/28 DMAチャンネル0が指定できない旨を追記
2004/12/09 記述修正 「IOプロセッサ」→「ARM7プロセッサ」
2004/11/02 引数名をヘッダファイルと同一に訂正
2004/07/28 コールバックの型を修正
2004/07/19 内部動作説明の変更
2004/07/09 関数形式の変更による記述の修正 / 内部動作説明の追加
2004/07/05 初版