//==================================================================== // IrisSubpOS.h // OSライブラリ // // Copyright (C) 2003-2004 NINTENDO Co.,Ltd. //==================================================================== #ifndef _IRIS_SUBP_OS_H #define _IRIS_SUBP_OS_H #ifdef __cplusplus extern "C" { #endif #include #include #include //====================================================================== // ロック変数 // //・カード/カートリッジ/CPU間共有内部ワークRAM/VRAM−C/D // などのCPU間での共有リスースや、CPU間送信FIFO 等の専有リソース // の排他制御ためにこの関数をご使用下さい。 //====================================================================== // ロックID #define OS_UNLOCK_ID 0 // ロック変数がロックされていない場合のID #define OS_MAINP_LOCKED_FLAG 0x40 // メインプロセッサによるロック確認フラグ #define OS_MAINP_LOCK_ID_START 0x40 // メインプロセッサ用ロックIDの割り当て開始番号 #define OS_MAINP_LOCK_ID_END 0x6f // 割り当て終了番号 #define OS_MAINP_DBG_LOCK_ID 0x70 // デバッガ予約番号 #define OS_MAINP_SYSTEM_LOCK_ID 0x7f // システム予約番号 #define OS_SUBP_LOCKED_FLAG 0x80 // サブプロセッサによるロック確認フラグ #define OS_SUBP_LOCK_ID_START 0x80 // サブプロセッサ用ロックIDの割り当て開始番号 #define OS_SUBP_LOCK_ID_END 0xaf // 割り当て終了番号 #define OS_SUBP_DBG_LOCK_ID 0xb0 // デバッガ予約番号 #define OS_SUBP_SYSTEM_LOCK_ID 0xbf // システム予約番号 #define OS_LOCK_SUCCESS 0 // ロック成功 #define OS_LOCK_ERROR -1 // ロックエラー #define OS_UNLOCK_SUCCESS 0 // ロック解除成功 #define OS_UNLOCK_ERROR -2 // ロック解除エラー #define OS_LOCK_FREE 0 // ロック解除中 #define OS_LOCK_ID_ERROR -3 // ロックIDエラー // ロック変数構造体 typedef struct { u32 lockFlag; // ロックフラグ(試行モジュールID格納) u16 ownerID; // 取得モジュールID u16 extension; // 拡張情報 } LockWord; typedef vl LockWord vLockWord; typedef struct { u8 lockFlag; // ロックフラグ(試行モジュールID格納) u8 ownerID; // 取得モジュールID } LockByte; typedef vl LockByte vLockByte; //---------------------------------------------------------------------- // システムロック変数の初期化 // //・システムロック変数を初期化します。 // //・引数: なし // //・戻り値:なし // //※NSYNC_MAINP定義時であっても、カートリッジ排他制御領域は // デバッガも使用するためクリアされません。 //---------------------------------------------------------------------- void OS_InitLock(void); //---------------------------------------------------------------------- // ロックIDの獲得 // //・ロック変数へ設定するIDを獲得します。 // //・引数: なし // //・戻り値: // 0x80 〜 0xaf ロックID // OS_LOCK_ID_ERROR ロックID獲得失敗 // //※IDは48種類までしか割り当てることができません。 // モジュール内にて複数のロック変数を制御する場合は // できるだけ1つのIDを使用するようにして下さい。 //---------------------------------------------------------------------- s32 OS_GetLockID(void); //---------------------------------------------------------------------- // スピンロック(ワード/バイト) // //・プロセッサ間やモジュール間で共有リソースを排他制御するための // ロック変数のスピンロックを行います。 //・ロックが成功するまで試行し続けます。 //・プロセッサ間の共有リソースは必ずロック後に使用して下さい。 //・プロセッサ専有のリソースはタイミング的に調整できるのであれば // ロックしなくても構いません。 // 専有リソースはデバッグ時に限定してロックすることもできます。 // //・引数: // lockID ロックID // lockp ロック変数のポインタ // CtrlFuncp リソース制御関数のポインタ // //・戻り値: // OS_LOCK_SUCCESS ロック成功 // OS_LOCK_ID_ERROR ロックIDエラー // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に OS_LockWord() を使用して下さい。 //---------------------------------------------------------------------- s32 OS_LockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void)); s32 OS_LockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void)); s32 OS_LockCard(u32 lockID); // カード s32 OS_LockCartridge(u32 lockID); // カートリッジ s32 OS_LockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0 s32 OS_LockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1 s32 OS_LockVramC(u32 lockID); // VRAM−C s32 OS_LockVramD(u32 lockID); // VRAM−D s32 OS_LockSendFifo(u32 lockID); // CPU間送信FIFO s32 OS_LockDma0(u32 lockID); // DMA0 s32 OS_LockDma1(u32 lockID); // DMA1 s32 OS_LockDma2(u32 lockID); // DMA2 s32 OS_LockDma3(u32 lockID); // DMA3 s32 OS_LockTimer0(u32 lockID); // タイマー0 s32 OS_LockTimer1(u32 lockID); // タイマー1 s32 OS_LockTimer2(u32 lockID); // タイマー2 s32 OS_LockTimer3(u32 lockID); // タイマー3 //---------------------------------------------------------------------- // ロックの解除(ワード/バイト) // //・ロックを解除します。 //・ロックしていないモジュールが実行した場合には解除されず、 // OS_UNLOCK_ERROR が返されます。 // //・引数: // lockID ロックID // lockp ロック変数のポインタ // CtrlFuncp リソース制御関数のポインタ // //・戻り値: // 正 ロック中(直前に格納されていたID) // OS_UNLOCK_ERROR ロック解除エラー // OS_LOCK_ID_ERROR ロックIDエラー // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に OS_UnLockWord() を使用して下さい。 //---------------------------------------------------------------------- s32 OS_UnLockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void)); s32 OS_UnLockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void)); s32 OS_UnLockCard(u32 lockID); // カード s32 OS_UnLockCartridge(u32 lockID); // カートリッジ s32 OS_UnLockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0 s32 OS_UnLockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1 s32 OS_UnLockVramC(u32 lockID); // VRAM−C s32 OS_UnLockVramD(u32 lockID); // VRAM−D s32 OS_UnLockSendFifo(u32 lockID); // CPU間送信FIFO s32 OS_UnLockDma0(u32 lockID); // DMA0 s32 OS_UnLockDma1(u32 lockID); // DMA1 s32 OS_UnLockDma2(u32 lockID); // DMA2 s32 OS_UnLockDma3(u32 lockID); // DMA3 s32 OS_UnLockTimer0(u32 lockID); // タイマー0 s32 OS_UnLockTimer1(u32 lockID); // タイマー1 s32 OS_UnLockTimer2(u32 lockID); // タイマー2 s32 OS_UnLockTimer3(u32 lockID); // タイマー3 //---------------------------------------------------------------------- // ロックの試行(ワード/バイト) // //・1回だけスピンロックを試行します。 //・プロセッサ間の共有リソースは必ずロック後に使用して下さい。 //・プロセッサ専有のリソースはタイミング的に調整できるのであれば // ロックしなくても構いません。 // 専有リソースはデバッグ時に限定してロックすることもできます。 // //・引数: // lockID ロックID // lockp ロック変数のポインタ // CtrlFuncp リソース制御関数のポインタ // //・戻り値: // 正 ロック中(直前に格納されていたID) // OS_LOCK_SUCCESS ロック成功 // OS_LOCK_ID_ERROR ロックIDエラー // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に OS_TryLockWord() を使用して下さい。 //---------------------------------------------------------------------- s32 OS_TryLockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void)); s32 OS_TryLockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void)); s32 OS_TryLockCard(u32 lockID); // カード s32 OS_TryLockCartridge(u32 lockID); // カートリッジ s32 OS_TryLockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0 s32 OS_TryLockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1 s32 OS_TryLockVramC(u32 lockID); // VRAM−C s32 OS_TryLockVramD(u32 lockID); // VRAM−D s32 OS_TryLockSendFifo(u32 lockID); // CPU間送信FIFO s32 OS_TryLockDma0(u32 lockID); // DMA0 s32 OS_TryLockDma1(u32 lockID); // DMA1 s32 OS_TryLockDma2(u32 lockID); // DMA2 s32 OS_TryLockDma3(u32 lockID); // DMA3 s32 OS_TryLockTimer0(u32 lockID); // タイマー0 s32 OS_TryLockTimer1(u32 lockID); // タイマー1 s32 OS_TryLockTimer2(u32 lockID); // タイマー2 s32 OS_TryLockTimer3(u32 lockID); // タイマー3 //---------------------------------------------------------------------- // ロックフラグの読み込み(ワード/バイト) // //・ロックフラグを読み込みます。 //・ロック変数が解除されているかどうかを確認することができます。 // //・引数: // lockp ロック変数のポインタ // //・戻り値: // 非0 ロック中(直前に格納されていたID) // OS_LOCK_FREE ロック解除中 // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に OS_ReadLockWord() を使用して下さい。 //---------------------------------------------------------------------- s32 OS_ReadLockWord(volatile LockWord *lockp); s32 OS_ReadLockByte(volatile LockByte *lockp); // カード #ifdef IRIS_TS #define OS_ReadLockCard() OS_ReadLockWord((LockWord *)(CARD_LOCK_BUF)) #else #define OS_ReadLockCard() OS_ReadLockCartridge() // カートリッジで代用 #endif // カートリッジ #define OS_ReadLockCartridge() OS_ReadLockWord((LockWord *)(CARTRIDGE_LOCK_BUF)) // CPU内部ワークRAM・ブロック0 #define OS_ReadLockWramBlock0() OS_ReadLockWord((LockWord *)(WRAM_BLOCK0_LOCK_BUF)) // CPU内部ワークRAM・ブロック1 #define OS_ReadLockWramBlock1() OS_ReadLockWord((LockWord *)(WRAM_BLOCK1_LOCK_BUF)) // VRAM−C #define OS_ReadLockVramC() OS_ReadLockWord((LockWord *)(VRAM_C_LOCK_BUF)) // VRAM−D #define OS_ReadLockVramD() OS_ReadLockWord((LockWord *)(VRAM_D_LOCK_BUF)) // CPU間送信FIFO #define OS_ReadLockSendFifo() OS_ReadLockByte((LockByte *)(SEND_FIFO_LOCK_BUF)) // DMA0 #define OS_ReadLockDma0() OS_ReadLockByte((LockByte *)(DMA0_LOCK_BUF)) // DMA1 #define OS_ReadLockDma1() OS_ReadLockByte((LockByte *)(DMA1_LOCK_BUF)) // DMA2 #define OS_ReadLockDma2() OS_ReadLockByte((LockByte *)(DMA2_LOCK_BUF)) // DMA3 #define OS_ReadLockDma3() OS_ReadLockByte((LockByte *)(DMA3_LOCK_BUF)) // タイマー0 #define OS_ReadLockTimer0() OS_ReadLockByte((LockByte *)(TIMER0_LOCK_BUF)) // タイマー1 #define OS_ReadLockTimer1() OS_ReadLockByte((LockByte *)(TIMER1_LOCK_BUF)) // タイマー2 #define OS_ReadLockTimer2() OS_ReadLockByte((LockByte *)(TIMER2_LOCK_BUF)) // タイマー3 #define OS_ReadLockTimer3() OS_ReadLockByte((LockByte *)(TIMER3_LOCK_BUF)) //---------------------------------------------------------------------- // ロック変数の所有モジュールIDの読み込み(ワード/バイト) // //・ロック変数の所有モジュールID を読み込みます。 //・モジュールID が非0 の場合はその時点でどちらのプロセッサ側が // 所有権を持っているのかを確認できます。 //・共有リソースの場合は「サブプロセッサ側が所有権を持っている状態」 // のみを割り込みを禁止することによって維持することができます。 // その他の状態はメインプロセッサが変化させてしまう可能性があります。 //・所有モジュールID が 0 であってもロック変数が解除されているとは限りません。 // //・引数: // lockp ロック変数のポインタ // //・戻り値: 所有モジュールID // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に OS_ReadOwnerOfLockWord() を使用して下さい。 //---------------------------------------------------------------------- s32 OS_ReadOwnerOfLockWord(volatile LockWord *lockp); s32 OS_ReadOwnerOfLockByte(volatile LockByte *lockp); // カード #ifdef IRIS_TS #define OS_ReadOwnerOfLockCard() OS_ReadOwnerOfLockWord((LockWord *)(CARD_LOCK_BUF)) #else #define OS_ReadOwnerOfLockCard() OS_ReadOwnerOfLockCartridge() // カートリッジで代用 #endif // カートリッジ #define OS_ReadOwnerOfLockCartridge() OS_ReadOwnerOfLockWord((LockWord *)(CARTRIDGE_LOCK_BUF)) // CPU内部ワークRAM・ブロック0 #define OS_ReadOwnerOfLockWramBlock0() OS_ReadOwnerOfLockWord((LockWord *)(WRAM_BLOCK0_LOCK_BUF)) // CPU内部ワークRAM・ブロック1 #define OS_ReadOwnerOfLockWramBlock1() OS_ReadOwnerOfLockWord((LockWord *)(WRAM_BLOCK1_LOCK_BUF)) // VRAM−C #define OS_ReadOwnerOfLockVramC() OS_ReadOwnerOfLockWord((LockWord *)(VRAM_C_LOCK_BUF)) // VRAM−D #define OS_ReadOwnerOfLockVramD() OS_ReadOwnerOfLockWord((LockWord *)(VRAM_D_LOCK_BUF)) // CPU間送信FIFO #define OS_ReadOwnerOfLockSendFifo() OS_ReadOwnerOfLockByte((LockByte *)(SEND_FIFO_LOCK_BUF)) // DMA0 #define OS_ReadOwnerOfLockDma0() OS_ReadOwnerOfLockByte((LockByte *)(DMA0_LOCK_BUF)) // DMA1 #define OS_ReadOwnerOfLockDma1() OS_ReadOwnerOfLockByte((LockByte *)(DMA1_LOCK_BUF)) // DMA2 #define OS_ReadOwnerOfLockDma2() OS_ReadOwnerOfLockByte((LockByte *)(DMA2_LOCK_BUF)) // DMA3 #define OS_ReadOwnerOfLockDma3() OS_ReadOwnerOfLockByte((LockByte *)(DMA3_LOCK_BUF)) // タイマー0 #define OS_ReadOwnerOfLockTimer0() OS_ReadOwnerOfLockByte((LockByte *)(TIMER0_LOCK_BUF)) // タイマー1 #define OS_ReadOwnerOfLockTimer1() OS_ReadOwnerOfLockByte((LockByte *)(TIMER1_LOCK_BUF)) // タイマー2 #define OS_ReadOwnerOfLockTimer2() OS_ReadOwnerOfLockByte((LockByte *)(TIMER2_LOCK_BUF)) // タイマー3 #define OS_ReadOwnerOfLockTimer3() OS_ReadOwnerOfLockByte((LockByte *)(TIMER3_LOCK_BUF)) //====================================================================== // プログラムステータスレジスタ //====================================================================== //---------------------------------------------------------------------- // カレント・プログラムステータスレジスタ セット // //・カレント・プログラムステータスレジスタに値をセットします。 // //・引数: セットするカレント・プログラムステータスレジスタの値 // //・戻り値:なし //---------------------------------------------------------------------- void OS_SetCpsr(u32 param); //---------------------------------------------------------------------- // カレント・プログラムステータスレジスタ値 獲得 // //・カレント・プログラムステータスレジスタの値を獲得します。 // //・引数: なし // //・戻り値:カレント・プログラムステータスレジスタの値 //---------------------------------------------------------------------- u32 OS_GetCpsr(void); //---------------------------------------------------------------------- // IRQ イネーブル/ディセーブル // //・カレント・プログラムステータスレジスタのIRQを // イネーブル/ディセーブルにします。 // //・引数: なし // //・戻り値:変更前のカレント・プログラムステータスレジスタの値 //---------------------------------------------------------------------- u32 OS_EnableCpsrIRQ(void); u32 OS_DisableCpsrIRQ(void); //---------------------------------------------------------------------- // FIQ&IRQ イネーブル/ディセーブル // //・カレント・プログラムステータスレジスタのFIQ&IRQを // イネーブル/ディセーブルにします。 // //・引数: なし // //・戻り値:変更前のカレント・プログラムステータスレジスタの値 //---------------------------------------------------------------------- u32 OS_EnableCpsrFIQ_IRQ(void); u32 OS_DisableCpsrFIQ_IRQ(void); #ifdef __cplusplus } #endif #endif // _IRIS_SUBP_OS_H