ctr_firmware/trunk/bootrom/include/brom/os/common/spinLock.h
nakasima 80a01841ca c++でビルドが通るように修正。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@264 b871894f-2f95-9b40-918c-086798483c85
2009-02-09 08:44:13 +00:00

231 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
Project: CtrBrom - OS - include
File: spinLock.h
Copyright 2009 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.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef BROM_OS_SPINLOCK_H_
#define BROM_OS_SPINLOCK_H_
#include <brom/types.h>
#include <brom/memorymap.h>
#ifdef __cplusplus
extern "C" {
#endif
//======================================================================
// ロック変数
//
//・カード/カートリッジ/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 struct OSLockByte
{
u8 lockFlag;
u8 ownerID;
}
OSLockByte;
/*---------------------------------------------------------------------------*
Name: osInitLock
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 osInitLock(void);
//----------------------------------------------------------------------
// スピンロック
//
//・プロセッサ間やモジュール間で共有リソースを排他制御するための
// ロック変数のスピンロックを行います。
//・ロックが成功するまで試行し続けます。
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
// ロックしなくても構いません。
// 専有リソースはデバッグ時に限定してロックすることもできます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
//
//・戻り値:
// OS_LOCK_SUCCESS ロック成功
//----------------------------------------------------------------------
s32 osLockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osLockCard(u8 lockID);
//----------------------------------------------------------------------
// ロックの解除
//
//・ロックを解除し、共有リソースのアクセス権をサブプロセッサに渡します。
//・ロックしていないモジュールが実行した場合には解除されず、
// OS_UNLOCK_ERROR が返されます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
//
//・戻り値:
// OS_UNLOCK_SUCCESS ロック解除成功
// OS_UNLOCK_ERROR ロック解除エラー
//----------------------------------------------------------------------
s32 osUnlockByByte(u8 lockID, OSLockByte *lockp, void (*ctrlFuncp) (void));
s32 osUnlockCard(u8 lockID);
//----------------------------------------------------------------------
// ロックの試行
//
//・1回だけスピンロックを試行します。
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
// ロックしなくても構いません。
// 専有リソースはデバッグ時に限定してロックすることもできます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
// CtrlFuncp リソース制御関数のポインタ
//
//・戻り値:
// 正 ロック中直前に格納されていたID
// OS_LOCK_SUCCESS ロック成功
//----------------------------------------------------------------------
s32 osTryLockByByte(u8 lockID, OSLockByte *lockp, void (*crtlFuncp) (void));
s32 osTryLockCard(u8 lockID);
//----------------------------------------------------------------------
// ロック変数の所有モジュールIDの読み込み
//
//・ロック変数の所有モジュールID を読み込みます。
//・モジュールID が非0 の場合はその時点でどちらのプロセッサ側が
// 所有権を持っているのかを確認できます。
//・共有リソースの場合は「メインプロセッサ側が所有権を持っている状態」
// のみを割り込みを禁止することによって維持することができます。
// その他の状態はサブプロセッサが変化させてしまう可能性があります。
//・所有モジュールID が 0 であってもロック変数が解除されているとは限りません。
//
//・引数:
// lockp ロック変数のポインタ
//
//・戻り値: 所有モジュールID
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に osReadOwnerOfLockWord() を使用して下さい。
//----------------------------------------------------------------------
u8 osReadOwnerOfLockWord(OSLockByte *lockp);
#define osReadOwnerOfLockCard() osReadOwnerOfLockWord( (OSLockByte *)HW_CARD_LOCK_BUF )
/*---------------------------------------------------------------------------*
Name: osGetLockID
Description: get lock ID
Arguments: None.
Returns: OS_LOCK_ID_ERROR, if fail to get ID
if ARM9
0x400x6f lockID
else if ARM7
0x800xaf lockID
endif
*Notice: ID is allocated only 48 pattern at a highest.
*---------------------------------------------------------------------------*/
s32 osGetLockID(void);
/*---------------------------------------------------------------------------*
Name: osReleaseLockID
Description: release lock ID
Arguments: lockID : id to tend to release
Returns: None.
*---------------------------------------------------------------------------*/
void osReleaseLockID(u8 lockID);
//================================================================
// private function.
// This function is for internal use. Never call from application.
#define OSi_SYNCTYPE_SENDER 0
#define OSi_SYNCTYPE_RECVER 1
#define OSi_SYNCVAL_NOT_READY 0
#define OSi_SYNCVAL_READY 1
void OSi_SyncWithOtherProc( int type, void* syncBuf );
static inline void OSi_SetSyncValue( u8 n )
{
*(vu8*)(HW_INIT_LOCK_BUF+4) = n;
}
static inline u8 OSi_GetSyncValue( void )
{
return *(vu8*)(HW_INIT_LOCK_BUF+4);
}
//--------------------------------------------------------------------------------
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_OS_SPINLOCK_H_ */
#endif