diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 1087f4ea..1bbaabe6 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -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