From 4e23ff1ac650734e9e1ca1a9dc8e73d731861a2f Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Thu, 10 Jan 2008 02:16:40 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E3=83=87=E3=83=90=E3=83=83=E3=82=AC=E3=81=8C=E3=82=A8?= =?UTF-8?q?=E3=83=9F=E3=83=A5=E3=83=AC=E3=83=BC=E3=83=88=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8BRom=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=80=E9=96=A2=E6=95=B0=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@453 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries_sysmenu/hotsw/ARM7/Makefile | 2 +- .../hotsw/ARM7/include/hotswTypes.h | 8 +- .../hotsw/ARM7/include/romEmulation.h | 55 +++ .../hotsw/ARM7/src/dsCardType1.c | 8 +- .../hotsw/ARM7/src/dsCardType2.c | 15 +- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 55 ++- .../hotsw/ARM7/src/romEmulation.c | 393 ++++++++++++++++++ 7 files changed, 511 insertions(+), 25 deletions(-) create mode 100644 build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h create mode 100644 build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c diff --git a/build/libraries_sysmenu/hotsw/ARM7/Makefile b/build/libraries_sysmenu/hotsw/ARM7/Makefile index 6b0e2643..2b752477 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/Makefile +++ b/build/libraries_sysmenu/hotsw/ARM7/Makefile @@ -29,7 +29,7 @@ TWL_PROC = ARM7 SRCDIR = ./src INCDIR = ./include -SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c customNDma.c +SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 58e75e0f..55fb3ac5 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -84,6 +84,8 @@ extern "C" { #define START_SHIFT 31 #define START_MASK 0x80000000 +#define SCRAMBLE_MASK 0x00406000 + #define AddLatency2ToLatency1(param)\ ( (((param) & LATENCY2_MASK) \ >> LATENCY2_SHIFT) \ @@ -146,7 +148,8 @@ extern "C" { typedef enum CardTypeEx{ DS_CARD_TYPE_1 = 0, DS_CARD_TYPE_2, - TWL_CARD + TWL_CARD, + ROM_EMULATION }CardTypeEx; typedef enum NormalCommandType{ @@ -221,7 +224,8 @@ typedef struct CardBootData{ u32 secureLatency; BOOL twlFlg; - + BOOL debuggerFlg; + u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; u32 keyBuf[KEY_BUF_SIZE]; diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h b/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h new file mode 100644 index 00000000..f534ccae --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h @@ -0,0 +1,55 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: romEmulation.h + *---------------------------------------------------------------------------*/ +#ifndef __ROM_EMULATION_H__ +#define __ROM_EMULATION_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// =========================================================================== +// Function Describe +// =========================================================================== + +// ■ ノーマルモードのコマンド ■ +// Rom EmulationのノーマルモードのBoot Segment(4Kbyte)読み込み +void ReadBootSegNormal_ROMEMU(CardBootData *cbd); + +// Rom Emulationのノーマルモードのモード変更 +void ChangeModeNormal_ROMEMU(CardBootData *cbd); + + +// ■ セキュアモードのコマンド ■ +// Rom EmulationのセキュアモードのID読み込み +void ReadIDSecure_ROMEMU(CardBootData *cbd); + +// Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み +void ReadSegSecure_ROMEMU(CardBootData *cbd); + +// Rom EmulationのセキュアモードのPNジェネレータON +void SwitchONPNGSecure_ROMEMU(CardBootData *cbd); + +// Rom EmulationのセキュアモードのPNジェネレータOFF +void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd); + +// Rom Emulationのセキュアモードのモード変更 +void ChangeModeSecure_ROMEMU(CardBootData *cbd); + + +// ■ ゲームモードのコマンド ■ +// DSカードType1のゲームモードのID読み込み +void ReadIDGame_ROMEMU(CardBootData *cbd); + +// DSカードType1のゲームモードの指定ページ読み込み +void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // __ROM_EMULATION_H__ diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 1dc02eb6..aea01e6f 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -130,9 +130,11 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) break; } - // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); - + if(!cbd->debuggerFlg){ + // コマンドの暗号化 + EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + } + // ビッグエンディアンに直す(暗号化後) cndBE.b[7] = cndLE.b[0]; cndBE.b[6] = cndLE.b[1]; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c index e80390e7..1e854076 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c @@ -126,8 +126,10 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) break; } - // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + if(!cbd->debuggerFlg){ + // コマンドの暗号化 + EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + } // ビッグエンディアンに直す(暗号化後) cndBE.b[7] = cndLE.b[0]; @@ -148,10 +150,12 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) /*---------------------------------------------------------------------------* Name: ReadIDSecure_DSType2 - Description: + Description: SCRAMBLE_MASK -> CS SE DS をマスクできる *---------------------------------------------------------------------------*/ void ReadIDSecure_DSType2(CardBootData *cbd) { + u32 scrambleMask; + // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); @@ -169,9 +173,12 @@ void ReadIDSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; + // スクランブルの設定 + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param | - START_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK; + START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask; // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index abaccf00..2b1b34dd 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -19,6 +19,7 @@ #include #include #include +#include #include // define ------------------------------------------------------------------- @@ -63,6 +64,7 @@ static void ShowRomHeaderData(void); // Static Values ------------------------------------------------------------ static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj"; +static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD"; static u64 s_MCStack[STACK_SIZE / sizeof(u64)]; static OSThread s_MCThread; @@ -105,7 +107,15 @@ static CardBootFunction s_funcTable[] = { // DS Card Type 2 { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数 ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 - ReadIDGame_DSType2, ReadPageGame_DSType2} // Game モード関数 + ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数 + // TWL Card Type 1 + { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数 + ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 + ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数 + // RomEmulation + { ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数 + ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数 + ReadIDGame_ROMEMU, ReadPageGame_ROMEMU} // Game モード関数 }; @@ -234,6 +244,9 @@ BOOL HOTSW_Boot(void) } { + u8 i; + u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf; + // ※最低限ARM9と排他制御しないといけない範囲はこれだけ u16 id = (u16)OS_GetLockID(); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する @@ -245,10 +258,23 @@ BOOL HOTSW_Boot(void) OS_TPrintf(" | Secure Command Param : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_param); OS_TPrintf(" | Secure Command Latency : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_latency); - // Romエミュレーションデータを取得 + // Romエミュレーション情報を取得 ReadRomEmulationData(); - OS_TPrintf("Rom Emulation Data : 0x%08x\n",s_cbData.romEmuBuf[0]); + // 取得したRomエミュレーション情報を比較 + s_cbData.debuggerFlg = TRUE; + for(i=0; i<4; i++){ + if ( rom_emu_info[i] != romEmuInf[i] ){ + s_cbData.debuggerFlg = FALSE; + OS_PutString("Rom Emulation Info Doesn't Match...\n"); + break; + } + } + OS_TPrintf("Rom Emulation Data : 0x%04x\n",s_cbData.romEmuBuf[0]); + if(s_cbData.debuggerFlg){ + s_cbData.cardType = ROM_EMULATION; + } + // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", @@ -284,7 +310,7 @@ BOOL HOTSW_Boot(void) // セキュアモードに移行 s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData); - + // ---------------------- Secure Mode ---------------------- // PNG設定 s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); @@ -294,17 +320,17 @@ BOOL HOTSW_Boot(void) // ID読み込み s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); - + // Secure領域のSegment読み込み s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - + // ゲームモードに移行 s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); - + // ---------------------- Game Mode ---------------------- // ID読み込み s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); - + // 常駐モジュール残りを指定先に転送 HOTSW_LoadStaticModule(); @@ -377,7 +403,7 @@ void HOTSW_LoadStaticModule(void) OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Stc); // 配置先と再配置情報を取得 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg); - + OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm9Stc); // Arm9の常駐モジュール残りを指定先に転送 s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, @@ -389,7 +415,7 @@ void HOTSW_LoadStaticModule(void) OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc); // 配置先と再配置情報を取得 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg); - + OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm7Stc); // Arm7の常駐モジュールを指定先に転送 s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, @@ -402,10 +428,10 @@ void HOTSW_LoadStaticModule(void) s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; OS_TPrintf(" - Arm9 Ltd. Static Module Loading...\n"); s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address; - + OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Ltd); // 配置先と再配置情報を取得 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE); - + OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm9Ltd); // Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!) s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, @@ -420,10 +446,10 @@ void HOTSW_LoadStaticModule(void) OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n"); s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; - + OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Ltd); // 配置先と再配置情報を取得 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE); - + OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm7Ltd); // Arm7の常駐モジュールを指定先に転送 s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, @@ -625,7 +651,6 @@ void ReadIDNormal(void) // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c new file mode 100644 index 00000000..6b0491bf --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -0,0 +1,393 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: romEmulation.c + *---------------------------------------------------------------------------*/ + +#include +#include +#include +#include + +// Define Data -------------------------------------------------------------- +#define BOOT_PAGE_NUM 8 +#define SECURE_PAGE_NUM 32 + + + +// =========================================================================== +// Function Describe +// =========================================================================== + +// ■--------------------------------------■ +// ■ ノーマルモードのコマンド ■ +// ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadIDNormal_ROMEMU + + Description: DSカードType1のノーマルモードのID読み込み + *---------------------------------------------------------------------------*/ +// 共通 + +/*---------------------------------------------------------------------------* + Name: ReadBootSegNormal_ROMEMU + + Description: DSカードType1のノーマルモードのBoot Segment読み込み + *---------------------------------------------------------------------------*/ +void ReadBootSegNormal_ROMEMU(CardBootData *cbd) +{ + u32 i,j=0; + u64 page = 0; + GCDCmd64 tempCnd, cnd; +// u32 n = 0; + + for(i=0; ipBootSegBuf->word + j++) = reg_HOTSW_MCD1; + } + + page++; + } + +/* + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE ); + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = 0x00000000; + reg_HOTSW_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 100(8ページリード)に latency1 = 0xd) + reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x4 << PC_SHIFT) | (0xd & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +*/ +} + +/*---------------------------------------------------------------------------* + Name: ChangeModeNormal_ROMEMU + + Description: DSカードType1のノーマルモードのモード変更 + *---------------------------------------------------------------------------*/ +void ChangeModeNormal_ROMEMU(CardBootData *cbd) +{ + #pragma unused( cbd ) + + GCDCmd64 tempCnd, cnd; + + // ゼロクリア + MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); + + // リトルエンディアンで作って + tempCnd.dw = 0x3c00000000000000; + + // ビックエンディアンにする + cnd.b[0] = tempCnd.b[7]; + cnd.b[1] = tempCnd.b[6]; + cnd.b[2] = tempCnd.b[5]; + cnd.b[3] = tempCnd.b[4]; + cnd.b[4] = tempCnd.b[3]; + cnd.b[5] = tempCnd.b[2]; + cnd.b[6] = tempCnd.b[1]; + cnd.b[7] = tempCnd.b[0]; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; + + // MCCNT1 レジスタ設定 (START = 1 に) + reg_HOTSW_MCCNT1 = START_MASK; + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +} + + +// ■--------------------------------------■ +// ■ セキュアモードのコマンド ■ +// ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadIDSecure_ROMEMU + + Description: + *---------------------------------------------------------------------------*/ +void ReadIDSecure_ROMEMU(CardBootData *cbd) +{ + // カード割り込みによるDMAコピー + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = 0x00000090; + reg_HOTSW_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +} + +/*---------------------------------------------------------------------------* + Name: ReadSegSecure_ROMEMU + + Description: + *---------------------------------------------------------------------------*/ +void ReadSegSecure_ROMEMU(CardBootData *cbd) +{ + u32 i,j=0; + u64 page = 0x20; + GCDCmd64 tempCnd, cnd; + u32 n = 0; + + for(i=0; ipSecureSegBuf + j++) = reg_HOTSW_MCD1; +// OS_TPrintf("Secure Data Address : %08x\n", (cbd->pSecureSegBuf + j)); +/* OS_TPrintf("%02x ",reg_HOTSW_MCD1); + if(!(n++ % 0xf)){ + OS_PutString("\n"); + }*/ + } + page++; + } + +/* u64 segNum = 4; + u64 vae = cbd->vae; + GCDCmd64 cndLE, cndBE; + + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pSecureSegBuf, SECURE_SEGMENT_SIZE ); + + // コマンド構造体初期化 + MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); + + // コマンド作成 + cndLE.dw = 0x20 << 33; + + // ビッグエンディアンに直す(暗号化後) + cndBE.b[7] = cndLE.b[0]; + cndBE.b[6] = cndLE.b[1]; + cndBE.b[5] = cndLE.b[2]; + cndBE.b[4] = cndLE.b[3]; + cndBE.b[3] = cndLE.b[4]; + cndBE.b[2] = cndLE.b[5]; + cndBE.b[1] = cndLE.b[6]; + cndBE.b[0] = cndLE.b[7]; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 110(32ページリード)に latency1 = 0xd) + reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x6 << PC_SHIFT) | (0xd & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +*/ +} + +/*---------------------------------------------------------------------------* + Name: SwitchONPNGSecure_ROMEMU + + Description: + *---------------------------------------------------------------------------*/ +void SwitchONPNGSecure_ROMEMU(CardBootData *cbd) +{ + #pragma unused( cbd ) +} + +/*---------------------------------------------------------------------------* + Name: SwitchOFFPNGSecure_ROMEMU + + Description: + *---------------------------------------------------------------------------*/ +void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd) +{ + #pragma unused( cbd ) +} + +/*---------------------------------------------------------------------------* + Name: ChangeModeSecure_ROMEMU + + Description: + *---------------------------------------------------------------------------*/ +void ChangeModeSecure_ROMEMU(CardBootData *cbd) +{ + #pragma unused( cbd ) + + GCDCmd64 tempCnd, cnd; + + // ゼロクリア + MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); + + // リトルエンディアンで作って + tempCnd.dw = 0xa000000000000000; + + // ビックエンディアンにする + cnd.b[0] = tempCnd.b[7]; + cnd.b[1] = tempCnd.b[6]; + cnd.b[2] = tempCnd.b[5]; + cnd.b[3] = tempCnd.b[4]; + cnd.b[4] = tempCnd.b[3]; + cnd.b[5] = tempCnd.b[2]; + cnd.b[6] = tempCnd.b[1]; + cnd.b[7] = tempCnd.b[0]; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; + + // MCCNT1 レジスタ設定 (START = 1 に) + reg_HOTSW_MCCNT1 = START_MASK; + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +} + + +// ■------------------------------------■ +// ■ ゲームモードのコマンド ■ +// ■------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadIDGame_ROMEMU + + Description: ゲームモードでIDを読み込む + *---------------------------------------------------------------------------*/ +void ReadIDGame_ROMEMU(CardBootData *cbd) +{ + #pragma unused( cbd ) + + // カード割り込みによるDMAコピー + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = 0x000000B8; + reg_HOTSW_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); +} + +/*---------------------------------------------------------------------------* + Name: ReadPageGame_ROMEMU + + Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む + *---------------------------------------------------------------------------*/ +void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size) +{ + #pragma unused( cbd ) + + u32 loop, counter=0; + u64 i, page; + GCDCmd64 cndLE, cndBE; + + page = (u32)(start_addr / PAGE_SIZE); + loop = (u32)(size / PAGE_SIZE); + loop = (size % PAGE_SIZE) ? loop + 1 : loop; + + OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf); + OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); + + for(i=0; i