MI_SendGXCommand*

構文

#include <nitro/mi.h>

void MI_SendGXCommand( u32 dmaNo, const void* src, u32 commandLength );

void MI_SendGXCommandAsync( u32 dmaNo, const void* src, u32 commandLength,
                 MIDmaCallback callback, void* arg );

void MI_SendGXCommandAsyncFast( u32 dmaNo, const void* src, u32 commandLength,
                 MIDmaCallback callback, void* arg );

引数

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

返り値

なし。

説明

DMA を用いてディスプレイリスト ( GXコマンド列 ) をコマンドFIFOに送ります。転送元アドレスは 4バイトアラインメントする必要があります。

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

MI_SendGXCommandAsync()MI_SendGXCommandAsyncFast() の違いは以下の通りです。前者は Geometry 転送 DMA を使用せず、通常の同期 DMA のみを使用しています。GXFIFO のアンダーハーフ割り込みを利用して少量ずつの DMA を行っています。後者は Geometry 転送 DMA を使用していますので、GXFIFO が少なくなったときに自動起動で DMA がスタートします。自動起動 DMA はハードウェアの制限により複数のものを同時に起動できませんので注意が必要です。( 但し同じタイプの自動起動 DMA は同時に複数起動することがハード的には可能です )

TWL-SDK ではグラフィクスコマンドの動作速度を優先する立場から MI_SendGXCommandAsync*()と他の G3_ 系 API との排他処理を行なっておりません。このため MI_SendGXCommandAsync*()によりGX コマンドを転送している間に G3_ コマンドによってコマンド FIFO へ直接GXコマンドを書き込んだ場合の動作は保証できません。API 呼び出し側でこうした事態が起こらないように注意する必要があります。


使用する DMA について

この関数は従来の DMA を用いますが、新規 DMA を用いで同様のことを行う関数は MI_SendNDmaGXCommand*() となります。MI_SendNDmaGXCommand*() 系の関数と MI_SendGXCommand*() 系の関数を同時に使用することは出来ません。


DMAコントローラの不具合

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

内部動作

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

参照

MI_DmaCopy*, G3_BeginMakeDL, G3_EndMakeDL
MI_SendNDmaGXCommand*

履歴

2009/11/20 DMAコントローラの不具合について追記
2008/10/16 新規 DMA を使った関数について追加
2005/03/08 用語統一 [割込み] → [割り込み]
2004/12/22 callback の呼び出しについての記述を追加
2004/08/26 MI_SendGXCommandAsyncFast について記述を追加
2004/07/18 callback がNULLの場合について記述追加
2003/12/01 初版