mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@204 4ee2a332-4b2b-5046-8439-1ba90f034370
313 lines
11 KiB
C
313 lines
11 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: NitroSDK - OS - include
|
||
File: spinLock.h
|
||
|
||
Copyright 2003-2006 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Log: spinLock.h,v $
|
||
Revision 1.31 2006/01/18 02:12:28 kitase_hirotake
|
||
do-indent
|
||
|
||
Revision 1.30 2005/03/01 01:57:00 yosizaki
|
||
copyright の年を修正.
|
||
|
||
Revision 1.29 2005/02/28 05:26:01 yosizaki
|
||
do-indent.
|
||
|
||
Revision 1.28 2004/09/02 06:28:15 yada
|
||
only change comment
|
||
|
||
Revision 1.27 2004/07/23 04:28:23 yada
|
||
OS_UnLock* restored for compatibility
|
||
|
||
Revision 1.26 2004/07/23 01:52:32 yada
|
||
inline->static inline
|
||
|
||
Revision 1.25 2004/07/23 00:58:43 yada
|
||
rename OS_UnLock* -> OS_Unlock*
|
||
|
||
Revision 1.24 2004/07/22 08:21:41 yada
|
||
change some lockID's type u32->u16
|
||
|
||
Revision 1.23 2004/06/21 11:02:32 yada
|
||
fix comment. incorrect about return value.
|
||
|
||
Revision 1.22 2004/04/07 02:03:17 yada
|
||
fix header comment
|
||
|
||
Revision 1.21 2004/03/26 10:37:49 yada
|
||
OS_GetLockID(), OS_ReleaseLockID() 追加
|
||
|
||
Revision 1.20 2004/03/25 07:25:21 yada
|
||
OS_LockCard() 等カードのロックについて追加
|
||
|
||
Revision 1.19 2004/03/04 09:48:59 yada
|
||
カートリッジのロックに限りIRQ/FIQ禁止にした。
|
||
|
||
Revision 1.18 2004/02/05 07:27:19 yada
|
||
履歴文字列のIRISだったものを NITRO から IRISに戻した。
|
||
|
||
Revision 1.17 2004/02/05 07:09:03 yasu
|
||
change SDK prefix iris -> nitro
|
||
|
||
Revision 1.16 2004/01/14 01:43:41 yada
|
||
lockやunlockの途中実行関数を設定出来るようにした
|
||
|
||
Revision 1.15 2003/12/25 07:29:56 yada
|
||
型ルール統一による変更
|
||
|
||
Revision 1.14 2003/12/22 13:42:13 yasu
|
||
OS_LockWord/LockByte に struct タグを追加
|
||
|
||
Revision 1.13 2003/12/18 07:25:26 yada
|
||
不要コメント削除
|
||
|
||
Revision 1.12 2003/12/18 07:18:59 yada
|
||
MAINP, SUBP 優先度デファインを削除
|
||
|
||
Revision 1.11 2003/12/17 06:08:12 yasu
|
||
細かな修正
|
||
|
||
Revision 1.10 2003/12/11 00:35:38 yasu
|
||
target.h のコメントアウト
|
||
|
||
Revision 1.9 2003/12/10 10:56:18 yasu
|
||
ISDPrint で必要な SpinLock 関数のみの移植
|
||
OS_LockWord() -> OS_LockByWord()
|
||
volatile LockWord -> OS_LockWord などの変更
|
||
|
||
Revision 1.8 2003/12/08 12:21:03 yada
|
||
12/3 REDSDK への変更対応
|
||
|
||
Revision 1.7 2003/11/28 01:54:47 yada
|
||
REDSDKの03-11-27反映
|
||
|
||
Revision 1.6 2003/11/14 06:50:13 yada
|
||
システムが用意している OS_Halt() → OS_HaltA9() に。
|
||
|
||
Revision 1.5 2003/11/06 10:35:55 yada
|
||
IRIS_BB時とNITRO_TEG時の処理を分離
|
||
|
||
Revision 1.4 2003/11/05 07:29:55 yada
|
||
ファイル名をl 小文字からL大文字に
|
||
|
||
Revision 1.2 2003/11/04 09:08:43 yada
|
||
(none)
|
||
|
||
Revision 1.1 2003/10/31 04:12:03 yada
|
||
初版作成
|
||
|
||
|
||
$NoKeywords: $
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#ifndef NITRO_OS_SPINLOCK_H_
|
||
#define NITRO_OS_SPINLOCK_H_
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <nitro/types.h>
|
||
|
||
//======================================================================
|
||
// ロック変数
|
||
//
|
||
//・カード/カートリッジ/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エラー
|
||
|
||
|
||
//---- structure of lock variable
|
||
typedef volatile struct OSLockWord
|
||
{
|
||
u32 lockFlag;
|
||
u16 ownerID;
|
||
u16 extension;
|
||
}
|
||
OSLockWord;
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: OS_InitLock
|
||
|
||
Description: initialize system lock variable
|
||
and privilege to access shared resources
|
||
|
||
* cartridge exclusive control area is not cleared
|
||
because debugger uses.
|
||
|
||
Arguments: None.
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
void OS_InitLock(void);
|
||
|
||
//----------------------------------------------------------------------
|
||
// スピンロック
|
||
//
|
||
//・プロセッサ間やモジュール間で共有リソースを排他制御するための
|
||
// ロック変数のスピンロックを行います。
|
||
//・ロックが成功するまで試行し続けます。
|
||
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
|
||
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
|
||
// ロックしなくても構いません。
|
||
// 専有リソースはデバッグ時に限定してロックすることもできます。
|
||
//
|
||
//・引数:
|
||
// lockID ロックID
|
||
// lockp ロック変数のポインタ
|
||
//
|
||
//・戻り値:
|
||
// OS_LOCK_SUCCESS ロック成功
|
||
//----------------------------------------------------------------------
|
||
s32 OS_LockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
|
||
s32 OS_LockCartridge(u16 lockID);
|
||
s32 OS_LockCard(u16 lockID);
|
||
s32 OS_LockExCard(u16 lockID);
|
||
|
||
//----------------------------------------------------------------------
|
||
// ロックの解除
|
||
//
|
||
//・ロックを解除し、共有リソースのアクセス権をサブプロセッサに渡します。
|
||
//・ロックしていないモジュールが実行した場合には解除されず、
|
||
// OS_UNLOCK_ERROR が返されます。
|
||
//
|
||
//・引数:
|
||
// lockID ロックID
|
||
// lockp ロック変数のポインタ
|
||
//
|
||
//・戻り値:
|
||
// OS_UNLOCK_SUCCESS ロック解除成功
|
||
// OS_UNLOCK_ERROR ロック解除エラー
|
||
//----------------------------------------------------------------------
|
||
s32 OS_UnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
|
||
s32 OS_UnlockCartridge(u16 lockID);
|
||
s32 OS_UnlockCard(u16 lockID);
|
||
s32 OS_UnlockExCard(u16 lockID);
|
||
|
||
//---- for compatibility to old name ('UnLock' <-> 'Unlock')
|
||
// because isd lib calls OS_UnLock*, these cannot be inline.
|
||
s32 OS_UnLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void));
|
||
s32 OS_UnLockCartridge(u16 lockID);
|
||
s32 OS_UnLockCard(u16 lockID);
|
||
|
||
//----------------------------------------------------------------------
|
||
// ロックの試行
|
||
//
|
||
//・1回だけスピンロックを試行します。
|
||
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
|
||
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
|
||
// ロックしなくても構いません。
|
||
// 専有リソースはデバッグ時に限定してロックすることもできます。
|
||
//
|
||
//・引数:
|
||
// lockID ロックID
|
||
// lockp ロック変数のポインタ
|
||
// CtrlFuncp リソース制御関数のポインタ
|
||
//
|
||
//・戻り値:
|
||
// 正 ロック中(直前に格納されていたID)
|
||
// OS_LOCK_SUCCESS ロック成功
|
||
//----------------------------------------------------------------------
|
||
s32 OS_TryLockByWord(u16 lockID, OSLockWord *lockp, void (*crtlFuncp) (void));
|
||
s32 OS_TryLockCartridge(u16 lockID);
|
||
s32 OS_TryLockCard(u16 lockID);
|
||
s32 OS_TryLockExCard(u16 lockID);
|
||
|
||
//----------------------------------------------------------------------
|
||
// ロック変数の所有モジュールIDの読み込み
|
||
//
|
||
//・ロック変数の所有モジュールID を読み込みます。
|
||
//・モジュールID が非0 の場合はその時点でどちらのプロセッサ側が
|
||
// 所有権を持っているのかを確認できます。
|
||
//・共有リソースの場合は「メインプロセッサ側が所有権を持っている状態」
|
||
// のみを割り込みを禁止することによって維持することができます。
|
||
// その他の状態はサブプロセッサが変化させてしまう可能性があります。
|
||
//・所有モジュールID が 0 であってもロック変数が解除されているとは限りません。
|
||
//
|
||
//・引数:
|
||
// lockp ロック変数のポインタ
|
||
//
|
||
//・戻り値: 所有モジュールID
|
||
//
|
||
//※但し、メインメモリに対してはキャッシュ経由でなければ
|
||
// バイトアクセスはできないことに注意して下さい。
|
||
// ですので、メインメモリ上では基本的に OS_ReadOwnerOfLockWord() を使用して下さい。
|
||
//----------------------------------------------------------------------
|
||
u16 OS_ReadOwnerOfLockWord(OSLockWord *lockp);
|
||
#define OS_ReadOwnerOfLockCartridge() OS_ReadOwnerOfLockWord( (OSLockWord *)HW_CTRDG_LOCK_BUF )
|
||
#define OS_ReadOwnerOfLockCard() OS_ReadOwnerOfLockWord( (OSLockWord *)HW_CARD_LOCK_BUF )
|
||
#define OS_ReadOwnerOfLockExCard() OS_ReadOwnerOfLockWord( (OSLockWord *)HW_CARD_B_LOCK_BUF )
|
||
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: OS_GetLockID
|
||
|
||
Description: get lock ID
|
||
|
||
Arguments: None.
|
||
|
||
Returns: OS_LOCK_ID_ERROR, if fail to get ID
|
||
|
||
if ARM9
|
||
0x40~0x6f lockID
|
||
else if ARM7
|
||
0x80~0xaf lockID
|
||
endif
|
||
|
||
*Notice: ID is allocated only 48 pattern at a highest.
|
||
|
||
*---------------------------------------------------------------------------*/
|
||
s32 OS_GetLockID(void);
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: OS_ReleaseLockID
|
||
|
||
Description: release lock ID
|
||
|
||
Arguments: lockID : id to tend to release
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
void OS_ReleaseLockID(u16 lockID);
|
||
|
||
#ifdef __cplusplus
|
||
} /* extern "C" */
|
||
#endif
|
||
|
||
/* NITRO_OS_SPINLOCK_H_ */
|
||
#endif
|