mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei) 抜き差し処理を行うスレッド部分を少し修正
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080206_hotsw@593 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
50a8457972
commit
841d90b1f8
@ -35,6 +35,18 @@
|
||||
#define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
||||
#define HOTSW_MSG_BUFFER_NUM 32 // 受信バッファの数
|
||||
|
||||
#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT
|
||||
#define HOTSW_EXMEMCNT_SELB_MASK REG_MI_EXMEMCNT_MPB_MASK
|
||||
#define HOTSW_EXMEMCNT_SELB_SHIFT REG_MI_EXMEMCNT_MPB_SHIFT
|
||||
#else // SDK_ARM7
|
||||
#define reg_HOTSW_EXMEMCNT reg_MI_EXMEMCNT_L
|
||||
#define HOTSW_EXMEMCNT_SELB_MASK 0x0400
|
||||
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
||||
#endif
|
||||
|
||||
// enum ---------------------------------------------------------------------
|
||||
typedef enum IntrType{
|
||||
HOTSW_INSERT = 0,
|
||||
@ -54,6 +66,7 @@ typedef struct CardThreadData{
|
||||
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
|
||||
OSThread thread;
|
||||
|
||||
// [TODO:] 受信バッファ分のメッセージを用意する。u32 index_Insert, index_pulled とかも必要?
|
||||
HotSwMessage hotswInsertMsg;
|
||||
HotSwMessage hotswPulledOutMsg;
|
||||
OSMessageQueue hotswQueue;
|
||||
@ -85,6 +98,9 @@ static void DecryptObjectFile(void);
|
||||
|
||||
static void SetHotSwState(BOOL busy);
|
||||
|
||||
static s32 LockExCard(u16 lockID);
|
||||
static s32 UnlockExCard(u16 lockID);
|
||||
|
||||
static BOOL CheckArm7HashValue(void);
|
||||
static BOOL CheckArm9HashValue(void);
|
||||
static BOOL CheckExtArm7HashValue(void);
|
||||
@ -170,10 +186,10 @@ void HOTSW_Init(void)
|
||||
|
||||
#ifdef SDK_ARM7
|
||||
// チャッタリングカウンタの値を設定
|
||||
reg_MI_MC1 = (u32)((reg_MI_MC1 & 0xffff) | 0xe00000);
|
||||
reg_MI_MC1 = (u32)((reg_MI_MC1 & 0xfff) | 0xfff0000);
|
||||
|
||||
// Counter-Aの値を設定
|
||||
reg_MI_MC2 = 0xe0;
|
||||
reg_MI_MC2 = 0xfff;
|
||||
#else
|
||||
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
|
||||
|
||||
@ -206,11 +222,12 @@ void HOTSW_Init(void)
|
||||
// Secure Segment バッファの設定
|
||||
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
||||
|
||||
// CDETフラグがおちていたらカードブートスレッドを起動する
|
||||
if(!(reg_MI_MC1 & SLOT_STATUS_CDET_MSK)){
|
||||
// カードが挿さってあったらスレッドを起動する
|
||||
if(IsCardExist()){
|
||||
OS_PutString("Card Boot Start\n");
|
||||
|
||||
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
|
||||
// [TODO:] メッセージを配列で用意する
|
||||
s_ctData.hotswInsertMsg.hotswCount = CARDi_GetSlotResetCount();
|
||||
s_ctData.hotswInsertMsg.type = HOTSW_INSERT;
|
||||
|
||||
@ -272,7 +289,12 @@ BOOL HOTSW_LoadCardData(void)
|
||||
// ブート処理開始
|
||||
if(IsCardExist() && retval){
|
||||
// カードのロック
|
||||
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
LockExCard(s_cbData.lockID);
|
||||
#else
|
||||
OS_LockCard(s_cbData.lockID);
|
||||
#endif
|
||||
OS_PutString("!! Card Lock\n");
|
||||
|
||||
// カード側でKey Tableをロードする
|
||||
LoadTable();
|
||||
@ -284,11 +306,11 @@ BOOL HOTSW_LoadCardData(void)
|
||||
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
||||
if(s_cbData.id_nml & 0x80000000){
|
||||
s_cbData.cardType = DS_CARD_TYPE_2;
|
||||
OS_TPrintf("Card Type2\n");
|
||||
// OS_TPrintf("Card Type2\n");
|
||||
}
|
||||
else{
|
||||
s_cbData.cardType = DS_CARD_TYPE_1;
|
||||
OS_TPrintf("Card Type1\n");
|
||||
// OS_TPrintf("Card Type1\n");
|
||||
}
|
||||
|
||||
{
|
||||
@ -314,7 +336,7 @@ BOOL HOTSW_LoadCardData(void)
|
||||
}
|
||||
}
|
||||
if(s_cbData.debuggerFlg){
|
||||
OS_PutString("Read Debugger\n");
|
||||
// OS_PutString("Read Debugger\n");
|
||||
s_cbData.cardType = ROM_EMULATION;
|
||||
SYSMi_GetWork()->gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
|
||||
}
|
||||
@ -339,7 +361,7 @@ BOOL HOTSW_LoadCardData(void)
|
||||
if( retval ) {
|
||||
// NTRカードかTWLカードか
|
||||
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){
|
||||
OS_TPrintf("TWL Card.\n");
|
||||
// OS_TPrintf("TWL Card.\n");
|
||||
s_cbData.twlFlg = TRUE;
|
||||
}
|
||||
else{
|
||||
@ -394,11 +416,16 @@ BOOL HOTSW_LoadCardData(void)
|
||||
|
||||
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
|
||||
DecryptObjectFile();
|
||||
|
||||
// デバッグ出力
|
||||
// ShowRomHeaderData();
|
||||
}
|
||||
OS_TPrintf("-----------------------------------------------\n\n");
|
||||
|
||||
// カードのロック開放
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
UnlockExCard(s_cbData.lockID);
|
||||
#else
|
||||
OS_UnlockCard(s_cbData.lockID);
|
||||
#endif
|
||||
OS_PutString("!! Card Unlock\n");
|
||||
OS_TPrintf("-----------------------------------------------\n");
|
||||
}
|
||||
else{
|
||||
OS_TPrintf("Card Not Found\n");
|
||||
@ -408,7 +435,7 @@ BOOL HOTSW_LoadCardData(void)
|
||||
// カードロックIDの開放
|
||||
OS_ReleaseLockID( s_cbData.lockID );
|
||||
|
||||
OS_TPrintf( "Load Card Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||
OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -837,6 +864,8 @@ static void SetMCSCR(void)
|
||||
Name: McThread
|
||||
|
||||
Description: カード抜け・挿し処理スレッド
|
||||
|
||||
[TODO:]フラグ処理・条件分岐の見直し
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void McThread(void *arg)
|
||||
{
|
||||
@ -850,102 +879,116 @@ static void McThread(void *arg)
|
||||
while(1){
|
||||
OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
|
||||
|
||||
OS_TPrintf("Before proc is insert? --> %d\n", insert);
|
||||
|
||||
// 活線挿抜回数を比較
|
||||
if(CARDi_IsPulledOutEx(msg->hotswCount)){
|
||||
// カード挿し割り込みによるスレッド起動 かつ 前回のスレッド起動が抜け処理だった かつ カードが挿してある
|
||||
if(msg->type == HOTSW_INSERT && !insert && IsCardExist()){
|
||||
OS_PutString("--- Insert\n");
|
||||
// カード挿し割り込みによるスレッド起動 かつ 前回のスレッド起動が抜け処理だった
|
||||
if(msg->type == HOTSW_INSERT && !insert){
|
||||
OS_PutString("*** Insert\n");
|
||||
|
||||
// 挿し処理フラグを立てる
|
||||
insert = TRUE;
|
||||
|
||||
|
||||
// 活線挿抜抑制フラグが立っていたら処理しない
|
||||
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
// HotSwをbusy状態にする
|
||||
SetHotSwState(TRUE);
|
||||
// カード読み込み開始
|
||||
retval = HOTSW_LoadCardData();
|
||||
// HotSwをfree状態にする
|
||||
SetHotSwState(FALSE);
|
||||
|
||||
// カード読み込みに失敗してた場合 or 挿抜回数不一致 or カード抜かれてた
|
||||
if(!retval || !CARDi_IsPulledOutEx(msg->hotswCount) || !IsCardExist()){
|
||||
// フラグ処理
|
||||
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
|
||||
// カードが挿してある
|
||||
if(IsCardExist()){
|
||||
// HotSwをbusy状態にする
|
||||
SetHotSwState(TRUE);
|
||||
// カード読み込み開始
|
||||
retval = HOTSW_LoadCardData();
|
||||
// HotSwをfree状態にする
|
||||
SetHotSwState(FALSE);
|
||||
|
||||
// カード読み込みに失敗してた場合 or 挿抜回数不一致 or カード抜かれてた
|
||||
if(!retval || !CARDi_IsPulledOutEx(msg->hotswCount) || !IsCardExist()){
|
||||
OS_TPrintf("Load Card Data Retval : %x HotSwCount : %d(msg : %d) IsCardExist : %d\n",
|
||||
retval, CARDi_GetSlotResetCount(),msg->hotswCount,IsCardExist());
|
||||
|
||||
// ロックの開放
|
||||
|
||||
// カードロックIDの開放
|
||||
OS_ReleaseLockID( s_cbData.lockID );
|
||||
// フラグ処理
|
||||
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
|
||||
|
||||
OS_PutString("### Card Read Error\n");
|
||||
}
|
||||
// カード読み込み・状態に問題がない場合
|
||||
else{
|
||||
u16 id = (u16)OS_GetLockID();
|
||||
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
|
||||
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus;
|
||||
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0;
|
||||
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0;
|
||||
// HOTSW_Finalize();
|
||||
}
|
||||
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
OS_ReleaseLockID( id );
|
||||
// カードロックの開放
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
UnlockExCard(s_cbData.lockID);
|
||||
#else
|
||||
OS_UnlockCard(s_cbData.lockID);
|
||||
#endif
|
||||
OS_PutString("!! Card Unlock\n");
|
||||
|
||||
// カードロックIDの開放
|
||||
OS_ReleaseLockID( s_cbData.lockID );
|
||||
|
||||
OS_PutString("### Card Read Error\n");
|
||||
}
|
||||
// カード読み込み・状態に問題がない場合
|
||||
else{
|
||||
u16 id = (u16)OS_GetLockID();
|
||||
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
|
||||
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus;
|
||||
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0;
|
||||
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0;
|
||||
// HOTSW_Finalize();
|
||||
}
|
||||
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
OS_ReleaseLockID( id );
|
||||
|
||||
// 新しいカードのIDを入れる
|
||||
SYSMi_GetWork()->nCardID = s_cbData.id_gam;
|
||||
// 新しいカードのIDを入れる
|
||||
SYSMi_GetWork()->nCardID = s_cbData.id_gam;
|
||||
|
||||
// デバッガ情報
|
||||
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
|
||||
SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
|
||||
}
|
||||
// デバッガ情報
|
||||
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
|
||||
SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
|
||||
}
|
||||
} // end [if(IsCardExist())]
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
// カード抜き割り込みによるスレッド起動 かつ 前回のスレッド起動が挿し処理だった かつ カードが抜かれている
|
||||
else if(msg->type == HOTSW_PULLEDOUT && insert && !IsCardExist()){
|
||||
OS_PutString("--- Init\n");
|
||||
// カード抜き割り込みによるスレッド起動 かつ 前回のスレッド起動が挿し処理だった
|
||||
else if(msg->type == HOTSW_PULLEDOUT && insert){
|
||||
OS_PutString("*** Init\n");
|
||||
|
||||
// 挿し処理フラグを下ろす。
|
||||
insert = FALSE;
|
||||
|
||||
|
||||
// HOTSW抑制フラグが立ってたら、処理しない
|
||||
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// カードが抜かれている
|
||||
if(!IsCardExist()){
|
||||
// バッファの初期化
|
||||
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
|
||||
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
|
||||
|
||||
// フラグケア
|
||||
{
|
||||
u16 id = (u16)OS_GetLockID();
|
||||
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
|
||||
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
OS_ReleaseLockID( id );
|
||||
}
|
||||
|
||||
// バッファの初期化
|
||||
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
|
||||
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
|
||||
|
||||
// フラグケア
|
||||
{
|
||||
u16 id = (u16)OS_GetLockID();
|
||||
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
|
||||
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
|
||||
OS_ReleaseLockID( id );
|
||||
}
|
||||
// ロックの開放
|
||||
|
||||
|
||||
// カードロックIDの開放
|
||||
OS_ReleaseLockID( s_cbData.lockID );
|
||||
|
||||
// カードブート用構造体の初期化
|
||||
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
||||
}
|
||||
// カードブート用構造体の初期化
|
||||
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -957,9 +1000,10 @@ static void McThread(void *arg)
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void InterruptCallbackCard(void)
|
||||
{
|
||||
// OS_TPrintf("*** Pulled Out\n");
|
||||
OS_TPrintf("★ Pulled Out Interrupt\n");
|
||||
|
||||
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
|
||||
// [TODO:] メッセージを配列で用意する
|
||||
s_ctData.hotswPulledOutMsg.hotswCount = CARDi_GetSlotResetCount();
|
||||
s_ctData.hotswPulledOutMsg.type = HOTSW_PULLEDOUT;
|
||||
|
||||
@ -980,12 +1024,13 @@ static void InterruptCallbackCard(void)
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void InterruptCallbackCardDet(void)
|
||||
{
|
||||
// OS_TPrintf("*** Insert\n");
|
||||
OS_TPrintf("★ Insert Interrupt\n");
|
||||
|
||||
// SDKのカード状態をリセットする
|
||||
CARDi_ResetSlotStatus();
|
||||
|
||||
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
|
||||
// [TODO:] メッセージを配列で用意する
|
||||
s_ctData.hotswInsertMsg.hotswCount = CARDi_GetSlotResetCount();
|
||||
s_ctData.hotswInsertMsg.type = HOTSW_INSERT;
|
||||
|
||||
@ -1032,6 +1077,61 @@ static void SetHotSwState(BOOL busy)
|
||||
OS_ReleaseLockID( id );
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: AllocateExCardBus
|
||||
|
||||
Description: アクセス権を設定する
|
||||
*---------------------------------------------------------------------------*/
|
||||
static inline void SetExCardProcessor(MIProcessor proc)
|
||||
{
|
||||
reg_HOTSW_EXMEMCNT =
|
||||
(u16)((reg_HOTSW_EXMEMCNT & ~HOTSW_EXMEMCNT_SELB_MASK) | (proc << HOTSW_EXMEMCNT_SELB_SHIFT));
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: AllocateExCardBus
|
||||
|
||||
Description: スロットBへのアクセス権を設定する
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void AllocateExCardBus(void)
|
||||
{
|
||||
#ifdef SDK_ARM9
|
||||
SetExCardProcessor(MI_PROCESSOR_ARM9); // Arm9側で動作している場合
|
||||
#else
|
||||
SetExCardProcessor(MI_PROCESSOR_ARM7); // Arm7側で動作している場合
|
||||
#endif
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: FreeExCardBus
|
||||
|
||||
Description: スロットBへのアクセス権を設定する
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void FreeExCardBus(void)
|
||||
{
|
||||
SetExCardProcessor(MI_PROCESSOR_ARM7); // Card for SUB
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: LockSlotB
|
||||
|
||||
Description: スロットBをロックする
|
||||
*---------------------------------------------------------------------------*/
|
||||
static s32 LockExCard(u16 lockID)
|
||||
{
|
||||
return OS_LockByWord(lockID, (OSLockWord *)SLOT_B_LOCK_BUF, AllocateExCardBus);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: UnlockSlotB
|
||||
|
||||
Description: スロットBをロックする
|
||||
*---------------------------------------------------------------------------*/
|
||||
static s32 UnlockExCard(u16 lockID)
|
||||
{
|
||||
return OS_UnlockByWord(lockID, (OSLockWord *)SLOT_B_LOCK_BUF, FreeExCardBus);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: SetInterruptCallback
|
||||
SetInterruptCallbackEx
|
||||
|
||||
Loading…
Reference in New Issue
Block a user