From 0d30d436f13c45203f7109fbecdac32ddca99fe2 Mon Sep 17 00:00:00 2001 From: nakasima Date: Thu, 6 Mar 2008 09:33:13 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=90=E3=83=83=E3=83=89=E3=83=96=E3=83=AD?= =?UTF-8?q?=E3=83=83=E3=82=AF=E7=BD=AE=E6=8F=9B=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82?= 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/trunk@837 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/dsCardCommon.h | 12 ++ .../hotsw/ARM7/include/hotswTypes.h | 15 +- .../hotsw/ARM7/include/romSpec.h | 8 +- .../hotsw/ARM7/src/dsCardCommon.c | 133 +++++++++++++++++- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 85 +++++++++-- 5 files changed, 231 insertions(+), 22 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h index 2f8de233..d075b4b0 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h @@ -22,6 +22,12 @@ HotSwState ReadIDNormal(CardBootData *cbd); // ノーマルモードのBoot Segment(4Kbyte)読み込み HotSwState ReadBootSegNormal(CardBootData *cbd); +// ノーマルモードでステータスを読み込む +HotSwState ReadStatusNormal(CardBootData *cbd); + +// ノーマルモードでバッドブロックを置換 +HotSwState RefreshBadBlockNormal(CardBootData *cbd); + // ノーマルモードからセキュアモードへの変更 HotSwState ChangeModeNormal(CardBootData *cbd); @@ -59,6 +65,12 @@ HotSwState ReadIDGame(CardBootData *cbd); // ゲームモードの指定ページ読み込み HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size); +// ゲームモードでステータスを読み込む +HotSwState ReadStatusGame(CardBootData *cbd); + +// ゲームモードでバッドブロックを置換 +HotSwState RefreshBadBlockGame(CardBootData *cbd); + // ■ 内部関数 ■ // LEコマンドをBEへ変換してレジスタへセット diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 44ee5649..e3f14a88 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -1,8 +1,8 @@ /*---------------------------------------------------------------------------* - Project: TwlFirm - GCD - include + Project: TwlIPL - HOTSW - include File: type.h - Copyright 2007 Nintendo. All rights reserved. + Copyright 2007-2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo @@ -164,6 +164,15 @@ typedef enum CardTypeEx{ ROM_EMULATION } CardTypeEx; +typedef enum RomMode{ + HOTSW_ROM_MODE_NULL = 0, + HOTSW_ROM_MODE_NORMAL, + HOTSW_ROM_MODE_SECURE, + HOTSW_ROM_MODE_GAME, + + HOTSW_ROM_MODE_NUM +} RomMode; + typedef enum NormalCommandType{ RD_ID = 0, RD_BSEG, @@ -247,6 +256,8 @@ typedef struct CardBootData{ BOOL twlFlg; BOOL debuggerFlg; + u32 romStatus; + u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; u32 keyBuf[KEY_BUF_SIZE]; diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h b/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h index d5402a47..012615f2 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h @@ -29,13 +29,13 @@ extern "C" { #define HOTSW_LOAD_TABLE_SIZE 0x2000 // 8KB #define HOTSW_SECURE_AREA_SIZE 0x4000 // 16KB #define HOTSW_SECURE2_AREA_SIZE 0x4000 // 16KB -#define HOTSW_EMU_INFO_SIZE 0x20 +#define HOTSW_ROMEMU_INFO_SIZE 0x20 #define HOTSW_SECURE_AREA_OFS 0x4000 // 16KB #define HOTSW_GAME_AREA_OFS 0x8000 // 32KB #define HOTSW_SECURE2_AREA_OFS 0x3000 // 12KB #define HOTSW_GAME2_AREA_OFS 0x7000 // 28KB -#define HOTSW_EMU_INFO_OFS (HOTSW_SECURE_AREA_OFS - HOTSW_PAGE_SIZE + 0x160) +#define HOTSW_ROMEMU_INFO_OFS (HOTSW_SECURE_AREA_OFS - HOTSW_PAGE_SIZE + 0x160) // ROM ID @@ -47,8 +47,8 @@ extern "C" { // ROM STATUS -#define HOTSW_ROMST_RFS_REQ_MASK 0x00000004UL -#define HOTSW_ROMST_RFS_WARN_MASK 0x00000008UL +#define HOTSW_ROMST_RFS_WARN_L1_MASK 0x00000004UL +#define HOTSW_ROMST_RFS_WARN_L2_MASK 0x00000008UL #define HOTSW_ROMST_RFS_READY_MASK 0x00000020UL diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index b791efbd..1e912d4e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -150,6 +150,74 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) } +/* ----------------------------------------------------------------- + * ReadStatusNormal関数 + * + * ノーマルモードでステータスを読み込む + * ----------------------------------------------------------------- */ +HotSwState ReadStatusNormal(CardBootData *cbd) +{ + GCDCmd64 cndLE; + + cbd->romStatus = 0; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // カード割り込みによるDMAコピー + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); + + // リトルエンディアンで作って + cndLE.dw = HSWOP_N_OP_RD_STAT; + + // MCCMD レジスタ設定 + HOTSWi_SetCommand(&cndLE); + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | + START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + return HOTSW_SUCCESS; +} + + +/* ----------------------------------------------------------------- + * RefreshBadBlockNormal関数 + * + * ノーマルモードでバッドブロックを置換 + * ----------------------------------------------------------------- */ +HotSwState RefreshBadBlockNormal(CardBootData *cbd) +{ + GCDCmd64 cndLE; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // リトルエンディアンで作って + cndLE.dw = HSWOP_N_OP_RD_STAT; + + // MCCMD レジスタ設定 + HOTSWi_SetCommand(&cndLE); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | + START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + return HOTSW_SUCCESS; +} + + /*---------------------------------------------------------------------------* * Name: ChangeModeNormal * @@ -641,4 +709,67 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) } return HOTSW_SUCCESS; -} \ No newline at end of file +} + +/*---------------------------------------------------------------------------* + * Name: ReadStatusGame + * + * Description: ゲームモードでステータスを読み込む + *---------------------------------------------------------------------------*/ +HotSwState ReadStatusGame(CardBootData *cbd) +{ + GCDCmd64 cndLE; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); + + // リトルエンディアンで作って + cndLE.dw = HSWOP_G_OP_RD_STAT; + + // MCCMD レジスタ設定 + HOTSWi_SetCommand(&cndLE); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | + START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + return HOTSW_SUCCESS; +} + +/* ----------------------------------------------------------------- + * RefreshBadBlockGame関数 + * + * ゲームモードでバッドブロックを置換 + * ----------------------------------------------------------------- */ +HotSwState RefreshBadBlockGame(CardBootData *cbd) +{ + GCDCmd64 cndLE; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // リトルエンディアンで作って + cndLE.dw = HSWOP_G_OP_RD_STAT; + + // MCCMD レジスタ設定 + HOTSWi_SetCommand(&cndLE); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | + START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + return HOTSW_SUCCESS; +} + + diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index baa47800..e449efa4 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -50,7 +50,6 @@ #define HOTSW_EXMEMCNT_SELB_SHIFT 10 #endif - // スレッド・メッセージ関係をまとめた構造体 typedef struct CardThreadData{ u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; @@ -111,6 +110,8 @@ static void ShowRegisterData(void); static void ShowRomHeaderData(void); static void DebugPrintErrorMessage(HotSwState state); +HotSwState HOTSWi_RefreshBadBlock(u32 romMode); + // Static Values ------------------------------------------------------------ static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj"; static char rom_emu_info[] ATTRIBUTE_ALIGN(4) = "TWLD"; @@ -278,6 +279,7 @@ static HotSwState LoadCardData(void) OSTick start; HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; + u32 romMode = HOTSW_ROM_MODE_NULL; start = OS_GetTick(); @@ -308,6 +310,8 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Normal Mode ---------------------- + romMode = HOTSW_ROM_MODE_NORMAL; + // カードID読み込み state = ReadIDNormal(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; @@ -390,6 +394,8 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Secure Mode ---------------------- + romMode = HOTSW_ROM_MODE_SECURE; + // PNG設定 state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; @@ -417,6 +423,8 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Game Mode ---------------------- + romMode = HOTSW_ROM_MODE_GAME; + // ID読み込み state = ReadIDGame(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; @@ -427,7 +435,7 @@ static HotSwState LoadCardData(void) // 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで) UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - + // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_scr != s_cbData.id_gam){ retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; @@ -457,6 +465,12 @@ static HotSwState LoadCardData(void) } end: + if( retval == HOTSW_SUCCESS ) + { + // バッドブロックを置換 + HOTSWi_RefreshBadBlock(romMode); + } + // カードのロック開放(※ロックIDは開放せずに持ち続ける) #ifndef DEBUG_USED_CARD_SLOT_B_ CARD_UnlockRom(s_CardLockID); @@ -469,6 +483,52 @@ end: return retval; } +/* ----------------------------------------------------------------- + * HOTSWi_RefreshBadBlock関数 + * + * ノーマルモードまたはゲームモードでバッドブロックを置換 + * ----------------------------------------------------------------- */ +HotSwState HOTSWi_RefreshBadBlock(u32 romMode) +{ + HotSwState retval = HOTSW_SUCCESS; + HotSwState state = HOTSW_SUCCESS; + + HotSwState (*pReadStatus)(CardBootData *cbd); + HotSwState (*pRefreshBadBlock)(CardBootData *cbd); + + if ( ! ( romMode == HOTSW_ROM_MODE_NORMAL || romMode == HOTSW_ROM_MODE_GAME ) ) + { + return HOTSW_SUCCESS; + } + + if ( romMode == HOTSW_ROM_MODE_NORMAL ) + { + pReadStatus = ReadStatusNormal; + pRefreshBadBlock = RefreshBadBlockNormal; + } + else + if ( romMode == HOTSW_ROM_MODE_GAME ) + { + pReadStatus = ReadStatusGame; + pRefreshBadBlock = RefreshBadBlockGame; + } + + // ステータス対応ROMのみステータス読み込み + if ( s_cbData.id_nml & HOTSW_ROMID_RFSSUP_MASK ) + { + state = pReadStatus(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + // 要求レベルに関わらずバッドブロックを置換(製品カードでは滅多に発生しない) + if ( s_cbData.romStatus & (HOTSW_ROMST_RFS_WARN_L1_MASK | HOTSW_ROMST_RFS_WARN_L2_MASK) ) + { + state = pRefreshBadBlock(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + } + } + + return retval; +} + /* ----------------------------------------------------------------- * HOTSW_GetRomEmulationBuffer関数 * @@ -488,15 +548,14 @@ void* HOTSW_GetRomEmulationBuffer(void) * ----------------------------------------------------------------- */ static HotSwState LoadBannerData(void) { - static BOOL init = FALSE; BOOL state; HotSwState retval = HOTSW_SUCCESS; // バナーリード if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { - retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset, - (u32 *)SYSM_CARD_BANNER_BUF, - sizeof(TWLBannerFile) ); + retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset, + (u32 *)SYSM_CARD_BANNER_BUF, + sizeof(TWLBannerFile) ); // バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK) state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE; @@ -518,17 +577,13 @@ static HotSwState LoadBannerData(void) SYSMi_GetWork()->flags.hotsw.isInspectCard = FALSE; } - if ( ! init ) + // デバッガ情報 + if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && s_cbData.debuggerFlg ) { - init = TRUE; - - // デバッガ情報 - if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && s_cbData.debuggerFlg ) - { - MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE ); - SYSMi_GetWork()->flags.hotsw.isOnDebugger = s_cbData.debuggerFlg; - } + MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE ); + SYSMi_GetWork()->flags.hotsw.isOnDebugger = s_cbData.debuggerFlg; } + SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;