From f52700d03f4d900af811df2a4bda9909214c4d53 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Fri, 31 Oct 2008 05:30:18 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBFinalize=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20=E2=86=92=E3=82=AB=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=97(NTR/TWL)=E3=82=92=E5=88=A4=E5=88=A5?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=80=81Game/Game2=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=AB=E7=A7=BB=E8=A1=8C=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20=E3=83=BBRomHeader/Secur?= =?UTF-8?q?e/Secure2=E9=A0=98=E5=9F=9F=E3=81=AECRC=E3=82=92=E8=A8=88?= =?UTF-8?q?=E7=AE=97=E3=81=97=E3=81=A6=E3=80=81=E5=80=A4=E3=82=92Shared?= =?UTF-8?q?=E9=A0=98=E5=9F=9F=E3=81=AB=E6=A0=BC=E7=B4=8D=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20081031_TwlCard_Tester@2656 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 65 +++++++++++++++---- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 3 + 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 5e6d07ed..01b79d52 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -97,7 +97,7 @@ static void ClearCardFlgs(void); static void FinalizeHotSw(HotSwCardState state); static void ForceNitroModeToFinalize(void); static void ForceNormalModeToFinalize(void); -static BOOL ChangeGameMode(void); +static BOOL ChangeCardMode(BOOL isApplicationJump); static void ClearCardIrq(void); static void ClearAllCardRegister(void); @@ -1870,13 +1870,13 @@ final: /*---------------------------------------------------------------------------* Name: ForceNitroModeToFinalize - Description: Nitro互換のGame Modeに強制移行させる + Description: カードタイプを見てGame Mode / Game2 Modeに移行させる。 *---------------------------------------------------------------------------*/ static void ForceNitroModeToFinalize(void) { s_cbData.id_gam = 0; - if(!ChangeGameMode()){ + if(!ChangeCardMode( FALSE )){ ClearAllCardRegister(); McPowerOff(); @@ -1914,20 +1914,26 @@ static void ForceNormalModeToFinalize(void) /*---------------------------------------------------------------------------* - Name: ChangeGameMode + Name: ChangeCardMode - Description: Nitro互換のRomHeaderを読んで、Game Modeに移行させる + Description: RomHeader / Secure (Secure2) 領域を読んでCRCを計算・格納し、 + カードタイプを判別して Gameモード / Game2モードに移行させる *---------------------------------------------------------------------------*/ -static BOOL ChangeGameMode(void) +static BOOL ChangeCardMode(BOOL isApplicationJump) { HotSwState state; + // カードのロック CARD_LockRom(s_CardLockID); McPowerOff(); McPowerOn(); - s_cbData.pBootSegBuf = s_pBootSegBuffer; + // バッファを設定 + s_cbData.pBootSegBuf = s_pBootSegBuffer; + s_cbData.pSecureSegBuf = s_pSecureSegBuffer; + s_cbData.pSecure2SegBuf = s_pSecure2SegBuffer; + s_cbData.modeType = HOTSW_MODE1; // ---------------------- Normal Mode ---------------------- @@ -1935,6 +1941,9 @@ static BOOL ChangeGameMode(void) state = ReadIDNormal(&s_cbData); state = ReadBootSegNormal(&s_cbData); + // RomHeaderのCRC16の計算 + SYSMi_GetWork()->flags.hotsw.romHeaderCRC = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, BOOT_SEGMENT_SIZE ); + if(s_isRomEmu){ s_cbData.cardType = ROM_EMULATION; s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK; @@ -1953,20 +1962,47 @@ static BOOL ChangeGameMode(void) state = ChangeModeNormal(&s_cbData); // ---------------------- Secure Mode ---------------------- - state = s_funcTable[s_isRomEmu].SetPNG_S(&s_cbData); - SetMCSCR(); - state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData); + state = ReadSecureModeCardData(); - // ---------------------- Game Mode ---------------------- + // Secure SegmentのCRC16の計算と格納 + SYSMi_GetWork()->flags.hotsw.secure1CRC = SVC_GetCRC16( 65535, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE ); + + // カード種別の判定 + // TWLカード → Game2モード + // NTRカード → Gameモード + // アプリジャンプ → Gameモード + if(!isApplicationJump && s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ + s_cbData.modeType = HOTSW_MODE2; + + // ---------------------- Reset ---------------------- + McPowerOff(); + McPowerOn(); + + // ---------------------- Normal Mode ---------------------- + state = ReadSecureModeCardData(); + + MakeBlowfishTableTWL(&s_cbData, 8, s_bondingOp); // s_bondingOpの値はHotSw_Initで格納される + + GenVA_VB_VD(); + + state = ChangeModeNormal2(&s_cbData); + + // ---------------------- Secure2 Mode ---------------------- + state = ReadSecureModeCardData(); + + // Secure SegmentのCRC16の計算と格納 + SYSMi_GetWork()->flags.hotsw.secure2CRC = SVC_GetCRC16( 65535, s_cbData.pSecure2SegBuf, SECURE_SEGMENT_SIZE ); + } + + state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData); + + // ---------------------- Game2 Mode ---------------------- state = ReadIDGame(&s_cbData); if(s_cbData.id_nml != s_cbData.id_gam){ state = HOTSW_ID_CHECK_ERROR; } - HOTSW_TPrintf("Card Normal ID : 0x%08x\n", s_cbData.id_nml); - HOTSW_TPrintf("Card Game ID : 0x%08x\n", s_cbData.id_gam); - #ifdef USE_NEW_DMA HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO); #else @@ -1975,6 +2011,7 @@ static BOOL ChangeGameMode(void) HOTSW_WaitCardCtrl(); + // カードのアンロック CARD_UnlockRom(s_CardLockID); if(state == HOTSW_SUCCESS){ diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index f0f4e01c..551806a7 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -127,6 +127,9 @@ typedef struct SYSM_work { vu8 isCardStateChanged; // カード状態更新フラグ vu8 isBusyHotSW; // 活線挿抜処理中? vu8 isKeyTableLoadReady; // Key Tableのロード準備完了? + vu16 romHeaderCRC; + vu16 secure1CRC; + vu16 secure2CRC; }hotsw; }flags; // 9B