diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 1fce3fb5..da5884c5 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -212,10 +212,10 @@ TwlSpMain(void) ( SYSM_GetLauncherParamBody()->v1.bootTitleID ) ) { // ランチャーパラメータでダイレクトカードブート以外の指定がある時は、活線挿抜をOFFにする。 - SYSMi_GetWork()->flags.common.isEnableHotSW = 0; + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 0; }else { // それ以外の時は活線挿抜ON - SYSMi_GetWork()->flags.common.isEnableHotSW = 1; + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1; } HOTSW_Init(); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 2fb45049..ccf7c5d9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -36,7 +36,7 @@ static void SetMCSCR(void); *---------------------------------------------------------------------------*/ HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -71,7 +71,7 @@ HotSwState ChangeModeNormal_DSType1(CardBootData *cbd) GCDCmd64 tempCnd, cnd; u64 vae64 = cbd->vae; - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -176,7 +176,7 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState ReadIDSecure_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -213,7 +213,7 @@ HotSwState ReadSegSecure_DSType1(CardBootData *cbd) GCDCmd64 cndLE, cndBE; for(i=0; i<4; i++){ - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -269,7 +269,7 @@ HotSwState ReadSegSecure_DSType1(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -296,7 +296,7 @@ HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -325,7 +325,7 @@ HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState ChangeModeSecure_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -356,7 +356,7 @@ HotSwState ChangeModeSecure_DSType1(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState ReadIDGame_DSType1(CardBootData *cbd) { - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -396,7 +396,7 @@ HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u3 // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; idebuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); for(i=0; iflags.common.is1stCardChecked = TRUE; + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; } } @@ -306,7 +306,7 @@ static HotSwState LoadCardData(void) MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); // ブート処理開始 - if(HOTSW_IsCardExist()){ + if(HOTSW_IsCardAccessible()){ // Arm9との排他制御用ロックIDを取得する u16 id = (u16)OS_GetLockID(); @@ -516,18 +516,18 @@ static HotSwState LoadBannerData(void) } else{ // バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK) - SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE; - SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; - SYSMi_GetWork()->flags.common.isExistCard = TRUE; + SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; return retval; } // バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK) state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE; - SYSMi_GetWork()->flags.common.isValidCardBanner = state; - SYSMi_GetWork()->flags.common.isCardStateChanged = state; - SYSMi_GetWork()->flags.common.isExistCard = state; + SYSMi_GetWork()->flags.hotsw.isValidCardBanner = state; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = state; + SYSMi_GetWork()->flags.hotsw.isExistCard = state; return retval; } @@ -668,7 +668,7 @@ static HotSwState CheckCardAuthCode(void) u8 *p = (u8 *)authBuf; - if(!HOTSW_IsCardExist()){ + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -962,6 +962,29 @@ static void UnlockHotSwRsc(OSLockWord* word) } } +/* ----------------------------------------------------------------- + * HOTSW_IsCardAccessible関数 + * + * カードスロットにアクセスできる状態か判定する + * + * ※SCFG_MC1のCDETフラグとM(モード)を見ている + * ----------------------------------------------------------------- */ +BOOL HOTSW_IsCardAccessible(void) +{ +#ifndef DEBUG_USED_CARD_SLOT_B_ + u32 mask = (u32)(REG_MI_MC_SL1_CDET_MASK << GetMcSlotShift()); +#else + u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift()); +#endif + + if( !(reg_MI_MC1 & mask) && CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ + return TRUE; + } + else{ + return FALSE; + } +} + /* ----------------------------------------------------------------- * IsSwap関数 * @@ -1143,13 +1166,13 @@ static void McThread(void *arg) OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); // カードデータロード完了フラグを下ろす - SYSMi_GetWork()->flags.common.isCardLoadCompleted = FALSE; + SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE; while(1){ // 活線挿抜抑制フラグが立っていたら処理しない - if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) { + if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { //#ifdef DEBUG_USED_CARD_SLOT_B_ - SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; //#endif break; } @@ -1162,10 +1185,10 @@ static void McThread(void *arg) if(CARDi_IsPulledOutEx(hotswCount)){ 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; + if( SYSMi_GetWork()->flags.hotsw.reqChangeHotSW ) { + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = SYSMi_GetWork()->flags.hotsw.nextHotSWStatus; + SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 0; + SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = 0; // HOTSW_Finalize(); } (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); @@ -1175,8 +1198,8 @@ static void McThread(void *arg) { u16 id = (u16)OS_GetLockID(); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); - SYSMi_GetWork()->flags.common.isExistCard = TRUE; - SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; + SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); OS_ReleaseLockID( id ); } @@ -1189,7 +1212,7 @@ static void McThread(void *arg) SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg; // カードデータロード完了フラグ - SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE; + SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE; OS_PutString("ok!\n"); @@ -1220,9 +1243,9 @@ static void McThread(void *arg) { 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; + SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; + SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); OS_ReleaseLockID( id ); } @@ -1237,7 +1260,7 @@ static void McThread(void *arg) } } //#ifdef DEBUG_USED_CARD_SLOT_B_ - SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; + SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; //#endif } } @@ -1297,7 +1320,7 @@ static void SetHotSwState(BOOL busy) { LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); - SYSMi_GetWork()->flags.common.isBusyHotSW = busy ? 1 : 0; + SYSMi_GetWork()->flags.hotsw.isBusyHotSW = busy ? 1 : 0; UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index cae9822d..7ad29c69 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -41,7 +41,7 @@ HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd) // u32 n = 0; for(i=0; iflags.common.isValidCardBanner ) { + if( SYSMi_GetWork()->flags.hotsw.isValidCardBanner ) { DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 ); MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) ); } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index fe1c5d22..e9b2d2b1 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -121,7 +121,7 @@ TitleProperty *SYSM_ReadParameters( void ) } //#ifdef DEBUG_USED_CARD_SLOT_B_ // ARM7のカードチェック完了を待つ - while( !SYSMi_GetWork()->flags.common.is1stCardChecked ) { + while( !SYSMi_GetWork()->flags.hotsw.is1stCardChecked ) { SVC_WaitByLoop( 0x1000 ); } //#endif diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index bafb0997..1afa8494 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -144,7 +144,7 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) // region_codeが本体情報と違うもの // の場合は、正常に認識できないタイトルであることを示す。 - if( SYSMi_GetWork()->flags.common.isCardStateChanged ) { + if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) { MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) ); @@ -162,7 +162,7 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ); pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; - SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE; // カード情報更新フラグを落とす + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = FALSE; // カード情報更新フラグを落とす (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する OS_ReleaseLockID( id ); @@ -1049,27 +1049,27 @@ void SYSMi_EnableHotSW( BOOL enable ) enable = enable ? 1 : 0; // 現在の値と同じなら何もせずリターン - if( SYSMi_GetWork()->flags.common.isEnableHotSW == enable ) { + if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == enable ) { return; } { u16 id = (u16)OS_GetLockID(); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); - if( !SYSMi_GetWork()->flags.common.isBusyHotSW ) { + if( !SYSMi_GetWork()->flags.hotsw.isBusyHotSW ) { // ARM7側がビジーでなければ、直接書き換え - SYSMi_GetWork()->flags.common.isEnableHotSW = enable; + SYSMi_GetWork()->flags.hotsw.isEnableHotSW = enable; }else { // ARM7側がビジーなら、変更要求をしてARM7が値を書き換えてくれるのを待つ。 - SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 1; - SYSMi_GetWork()->flags.arm9.nextHotSWStatus = enable; + SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 1; + SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = enable; } (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); OS_ReleaseLockID( id ); } // 値が変化するまでスリープして待つ。 - while( SYSMi_GetWork()->flags.common.isEnableHotSW != enable ) { + while( SYSMi_GetWork()->flags.hotsw.isEnableHotSW != enable ) { OS_Sleep( 2 ); } } diff --git a/build/libraries_sysmenu/sysmenu/common/src/status.c b/build/libraries_sysmenu/sysmenu/common/src/status.c index dcc97297..d2b24cb2 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/status.c +++ b/build/libraries_sysmenu/sysmenu/common/src/status.c @@ -86,7 +86,7 @@ BOOL SYSM_IsValidTSD( void ) // 有効なTWL/NTRカードが差さっているか? BOOL SYSM_IsExistCard( void ) { - return (BOOL)SYSMi_GetWork()->flags.common.isExistCard; + return (BOOL)SYSMi_GetWork()->flags.hotsw.isExistCard; } diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index e53a69e7..7e312405 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -30,7 +30,10 @@ extern "C" { void HOTSW_Init(void); // カードの存在判定 - BOOL HOTSW_IsCardExist(void); +BOOL HOTSW_IsCardExist(void); + +// カードにアクセスできる状態か判定 +BOOL HOTSW_IsCardAccessible(void); // Boot Segment バッファの指定 void HOTSW_SetBootSegmentBuffer(void* buf, u32 size); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index f226408e..0a85382f 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -87,37 +87,31 @@ typedef struct SYSM_work { vu32 isValidTSD :1; // NITRO設定データ無効フラグ vu32 isLogoSkip :1; // ロゴデモスキップ vu32 isOnDebugger :1; // デバッガ動作か? - vu32 isExistCard :1; // 有効なNTR/TWLカードが存在するか? - vu32 isCardStateChanged :1; // カード状態更新フラグ vu32 isLoadSucceeded :1; // アプリロード完了? vu32 isCardBoot :1; // カードブートか? vu32 isBrokenHWNormalInfo :1; // HWノーマル情報が破損している。 vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。 vu32 isResetRTC :1; // RTCリセット発生 vu32 :0; - - vu32 isEnableHotSW :1; // 活線挿抜有効? - vu32 isBusyHotSW :1; // 活線挿抜処理中? - vu32 isCardLoadCompleted :1; // カードからデータロード完了? -//#ifdef DEBUG_USED_CARD_SLOT_B_ - vu32 isValidCardBanner :1; - vu32 is1stCardChecked :1; -//#endif - vu32 :0; }common; - struct { - vu16 reqChangeHotSW :1; - vu16 nextHotSWStatus :1; - vu16 :0; - }arm9; - struct { - vu16 rsv:16; - }arm7; - }flags; // 12B - + struct { + vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか? + vu16 isEnableHotSW :1; // 活線挿抜有効? + vu16 isBusyHotSW :1; // 活線挿抜処理中? + vu16 isCardLoadCompleted :1; // カードからデータロード完了? + vu16 isValidCardBanner :1; + vu16 is1stCardChecked :1; + vu16 reqChangeHotSW :1; // 削除予定 + vu16 nextHotSWStatus :1; // 削除予定 + vu16 :8; + vu8 isCardStateChanged; // カード状態更新フラグ + }hotsw; + }flags; // 7B + u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側) u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側) - OSLockWord lockCardRsc; // カードリソース排他制御用 + + OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用 OSLockWord lockHotSW; // カードリソース排他制御用 u32 nCardID; // カードID u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする)