From 94a16dfc96e15b1b60fc6302503ffcea4e863a5d Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Tue, 25 Dec 2007 12:52:09 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BBRomHeader=E3=81=AERom=E3=82=B3=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=AB=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=82=92=E5=88=A9=E7=94=A8=E3=81=97=E3=81=A6=E3=82=B3?= =?UTF-8?q?=E3=83=9E=E3=83=B3=E3=83=89=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3=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@400 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/dsCardType1.h | 2 +- .../hotsw/ARM7/include/dsCardType2.h | 2 +- .../hotsw/ARM7/include/hotswTypes.h | 41 +----- .../hotsw/ARM7/src/dsCardType1.c | 74 ++++++----- .../hotsw/ARM7/src/dsCardType2.c | 114 ++++++++--------- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 121 +++++++++++------- 6 files changed, 167 insertions(+), 187 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h index 658a496e..b3bab430 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h @@ -46,7 +46,7 @@ void ChangeModeSecure_DSType1(CardBootData *cbd); void ReadIDGame_DSType1(CardBootData *cbd); // DSカードType1のゲームモードの指定ページ読み込み -void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size); +void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size); #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h index 766adb19..3745f5b7 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h @@ -48,7 +48,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd); #define ReadIDGame_DSType2 ReadIDGame_DSType1 // DSカードType2のゲームモードの指定ページ読み込み -void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size); +void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size); //#define ReadPageGame_DSType2 ReadPageGame_DSType1 #ifdef __cplusplus diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index bda505f3..58e75e0f 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -84,40 +84,12 @@ extern "C" { #define START_SHIFT 31 #define START_MASK 0x80000000 -#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ - (u32)( \ - ((u32)(start)<< START_SHIFT) | \ - ((u32)(wr) << WR_SHIFT) | \ - ((u32)(resb) << RESB_SHIFT) | \ - ((u32)(rtm) << TRM_SHIFT) | \ - ((u32)(ct) << CT_SHIFT) | \ - ((u32)(pc) << PC_SHIFT) | \ - ((u32)(rdy) << RDY_SHIFT) | \ - ((u32)(cs) << CS_SHIFT) | \ - ((u32)(l2) << LATENCY2_SHIFT) | \ - ((u32)(scr) << SCR_SHIFT) | \ - ((u32)(se) << SE_SHIFT) | \ - ((u32)(ds) << DS_SHIFT) | \ - ((u32)(l1) << LATENCY1_SHIFT) \ +#define AddLatency2ToLatency1(param)\ + ( (((param) & LATENCY2_MASK) \ + >> LATENCY2_SHIFT) \ + + ((param) & LATENCY1_MASK) \ ) -#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ - (u32)( ((start) ? START_MASK : 0) | \ - ((wr) ? WR_MASK : 0) | \ - ((resb) ? RESB_MASK : 0) | \ - ((rtm) ? TRM_MASK : 0) | \ - ((ct) ? CT_MASK : 0) | \ - ((pc) ? PC_MASK : 0) | \ - ((rdy) ? RDY_MASK : 0) | \ - ((cs) ? CS_MASK : 0) | \ - ((l2) ? LATENCY2_MASK : 0)| \ - ((scr) ? SCR_MASK : 0) | \ - ((se) ? SE_MASK : 0) | \ - ((ds) ? DS_MASK : 0) | \ - ((l1) ? LATENCY1_MASK : 0)) - - - //#define USE_SLOT_A #ifdef USE_SLOT_A @@ -170,7 +142,6 @@ extern "C" { #endif - // Enum --------------------------------------------------------------------- typedef enum CardTypeEx{ DS_CARD_TYPE_1 = 0, @@ -247,6 +218,8 @@ typedef struct CardBootData{ u32 arm9Ltd; u32 arm7Ltd; + u32 secureLatency; + BOOL twlFlg; u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; @@ -274,7 +247,7 @@ typedef struct CardBootFunction { void (*ChangeMode_S)(CardBootData *cbd); void (*ReadID_G)(CardBootData *cbd); - void (*ReadPage_G)(u32 addr, void* buf, u32 size); + void (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); } CardBootFunction; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 7dd5ec7d..1dc02eb6 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -42,12 +42,11 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd) reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) -// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20)); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT1 レジスタ設定 (START = 1 PC = 100(8ページリード)に latency1 = 0x14) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x4 << PC_SHIFT) | (0x14 & LATENCY1_MASK); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); } @@ -84,10 +83,9 @@ void ChangeModeNormal_DSType1(CardBootData *cbd) reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; - // MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - + // MCCNT1 レジスタ設定 (START = 1 に) + reg_HOTSW_MCCNT1 = START_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); } @@ -165,10 +163,10 @@ void ReadIDSecure_DSType1(CardBootData *cbd) SetSecureCommand(S_RD_ID, cbd); // MCCNT1 レジスタ設定 - // (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320)); - + // (START = 1 TRM = 1 PC = 111(ステータスリード) 後はRomヘッダ情報にお任せ) + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param + | START_MASK | TRM_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK ; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -217,10 +215,10 @@ void ReadSegSecure_DSType1(CardBootData *cbd) reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; // MCCNT1 レジスタ設定 - // (START = 1 W/R = 0 TRM = 1 PC = 100(8ページリード) CS = 1 Latency2 = 24(0x18) SE = 1 DS = 1 Latency1 = 2296(0x8f8)に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296)); - + // (START = 1 TRM = 1 PC = 100(8ページリード) 後はRomヘッダ情報にお任せ) + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param + | START_MASK | TRM_MASK | PC_MASK & (0x4 << PC_SHIFT) | SE_MASK | DS_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -242,10 +240,10 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_PNG_ON, cbd); - // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -263,9 +261,9 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_PNG_OFF, cbd); - // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK); // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -284,10 +282,10 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_CHG_MODE, cbd); - // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -313,10 +311,10 @@ void ReadIDGame_DSType1(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x000000B8; reg_HOTSW_MCCMD1 = 0x00000000; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 1)); - + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param | + START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); } @@ -326,7 +324,7 @@ void ReadIDGame_DSType1(CardBootData *cbd) Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む *---------------------------------------------------------------------------*/ -void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size) +void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { u32 loop, counter=0; u64 i, page; @@ -361,14 +359,14 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size) reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20)); - + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param | + START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} *((u32 *)buf + counter++) = reg_HOTSW_MCD1; } } -} \ No newline at end of file +} diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c index 67e2a622..953696a5 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c @@ -15,6 +15,8 @@ #define ROM_EMULATION_START_OFS 0x160 #define ROM_EMULATION_END_OFS 0x180 + + // Function prototype ------------------------------------------------------- static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); static void SetMCSCR(void); @@ -42,10 +44,9 @@ void ReadRomEmulationData_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x3e000000; reg_HOTSW_MCCMD1 = 0x0; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540)); - + // MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK); + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} @@ -103,9 +104,8 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b; reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4]; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540)); + // MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK); // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -193,21 +193,21 @@ void ReadIDSecure_DSType2(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_RD_ID, cbd); - // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 0 PC = 0 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param | + START_MASK | SE_MASK | DS_MASK; + // 25ms待ち OS_Sleep(COMMAND_DECRYPTION_WAIT); // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 1 PC = 111 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0)); + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param | + START_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -256,14 +256,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd) 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 W/R = 0 TRM = 0 PC = 000(0ページ) CS = 1 Latency2 =0 SE = 1 DS = 1 Latency1 = 0に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param | + START_MASK | SE_MASK | DS_MASK; + // 25ms待ち OS_Sleep(COMMAND_DECRYPTION_WAIT); @@ -275,11 +271,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; - // (START = 1 W/R = 0 TRM = 0 PC = 001(1ページリード) CS = 1 Latency2 = 0 SE = 1 DS = 1 Latency1 = 1540に) - // latency1 : 1540 --> Output Latency = 230us 転送クロックタイプ = 0で周期が150ns だから 230000 / 150 = 1533.33 - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540)); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param | + START_MASK | PC_MASK & (0x1 << PC_SHIFT) | SE_MASK | DS_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -305,24 +300,21 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_PNG_ON, cbd); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) -// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); - + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; + // 25ms待ち OS_Sleep(COMMAND_DECRYPTION_WAIT); // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -340,12 +332,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_PNG_OFF, cbd); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) -// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; // 25ms待ち OS_Sleep(COMMAND_DECRYPTION_WAIT); @@ -354,9 +343,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -375,13 +364,10 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) // コマンド作成・設定 SetSecureCommand(S_CHG_MODE, cbd); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) -// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); - + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; + // 25ms待ち OS_Sleep(COMMAND_DECRYPTION_WAIT); @@ -389,10 +375,10 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - + // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) + reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) | + START_MASK | SE_MASK | DS_MASK; + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -417,7 +403,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む *---------------------------------------------------------------------------*/ -void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size) +void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { u32 loop, counter=0; u64 i, page; @@ -455,10 +441,10 @@ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size) reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 1540 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 1540)); - + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param | + START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index b5d03b8b..845f77b5 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -275,6 +275,9 @@ BOOL HOTSW_Boot(void) OS_TPrintf("TWL Card.\n"); s_cbData.twlFlg = TRUE; } + + // SecureコマンドのPNG_ONコマンドetc用のレイテンシを求める(Latency1とLatency2を足す) + s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param); // Key Table初期化 GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8); @@ -363,7 +366,8 @@ void HOTSW_LoadStaticModule(void) // バナーリード if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { OS_TPrintf(" - Banner Loading...\n"); - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.banner_offset, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.banner_offset, (u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile) ); SYSMi_GetWork()->isValidCardBanner = TRUE; @@ -378,18 +382,10 @@ void HOTSW_LoadStaticModule(void) SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg); // Arm9の常駐モジュール残りを指定先に転送 - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE); - - // Hash値のチェック - if(CheckArm9HashValue()){ - OS_PutString("◎Arm9 Static Module Hash Check OK!\n"); - } - else{ - OS_PutString("×Arm9 Static Module Hash Check Error...\n"); - } - OS_TPrintf(" - Arm7 Static Module Loading...\n"); s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; @@ -398,18 +394,11 @@ void HOTSW_LoadStaticModule(void) SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg); // Arm7の常駐モジュールを指定先に転送 - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_rom_offset, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size); - // Hash値のチェック - if(CheckArm7HashValue()){ - OS_PutString("◎Arm7 Static Module Hash Check OK!\n"); - } - else{ - OS_PutString("×Arm7 Static Module Hash Check Error...\n"); - } - // TWLでのみロード if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) { u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? @@ -421,23 +410,17 @@ void HOTSW_LoadStaticModule(void) SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE); // Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!) - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size); if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_ltd_size - size); } - // Hash値のチェック - if(CheckExtArm9HashValue()){ - OS_PutString("◎Arm9 Ltd Static Module Hash Check OK!\n"); - } - else{ - OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); - } - OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n"); s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; @@ -445,11 +428,36 @@ void HOTSW_LoadStaticModule(void) SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE); // Arm7の常駐モジュールを指定先に転送 - s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, + s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size); - // Hash値のチェック + // Arm9常駐モジュール Hash値のチェック + if(CheckArm9HashValue()){ + OS_PutString("◎Arm9 Static Module Hash Check OK!\n"); + } + else{ + OS_PutString("×Arm9 Static Module Hash Check Error...\n"); + } + + // Arm7常駐モジュール Hash値のチェック + if(CheckArm7HashValue()){ + OS_PutString("◎Arm7 Static Module Hash Check OK!\n"); + } + else{ + OS_PutString("×Arm7 Static Module Hash Check Error...\n"); + } + + // Arm9拡張常駐モジュール Hash値のチェック + if(CheckExtArm9HashValue()){ + OS_PutString("◎Arm9 Ltd Static Module Hash Check OK!\n"); + } + else{ + OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); + } + + // Arm7拡張常駐モジュール Hash値のチェック if(CheckExtArm7HashValue()){ OS_PutString("◎Arm7 Ltd Static Module Hash Check OK!\n"); } @@ -550,9 +558,12 @@ static void LoadTable(void) // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) +/* // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,5, 0,0, 0, 0,0,0, 0)); + CNT1_FLD(1,0,0,0, 0,5, 0,0, 0, 0,0,0, 0));*/ + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ @@ -578,9 +589,9 @@ void ReadIDNormal(void) // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 1 に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 0)); + // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); @@ -709,7 +720,7 @@ static BOOL CheckArm9HashValue(void) // Hash値取得 SVC_HMACSHA1GetHash( &hash, sha1data ); - return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_static_digest ); + return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_static_digest ); } // ---------------------------------------------------------------------- @@ -739,17 +750,30 @@ static BOOL CheckExtArm7HashValue(void) static BOOL CheckExtArm9HashValue(void) { u8 sha1data[DIGEST_SIZE_SHA1]; + u32 size; BOOL retval = TRUE; + SVCHMACSHA1Context hash; + // Arm9拡張常駐モジュールのセキュア領域分のサイズを取得 + size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? + s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; + // クリア MI_CpuClear8(sha1data, sizeof(sha1data)); - // ARM7常駐モジュールのHash値照合 - SVC_CalcHMACSHA1( sha1data, - (u32 *)s_cbData.arm9Ltd, - s_cbData.pBootSegBuf->rh.s.main_ltd_size, - s_digestDefaultKey, - sizeof(s_digestDefaultKey) ); + // ハッシュ初期化 + SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) ); + + // セキュア領域分UpDate + SVC_HMACSHA1Update( &hash, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size ); + + // ゲーム領域分UpDate (Arm9拡張常駐モジュールがSecure領域で収まってたらここは飛ばす) + if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ){ + SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_ltd_size - size ); + } + + // Hash値取得 + SVC_HMACSHA1GetHash( &hash, sha1data ); return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest ); } @@ -811,9 +835,9 @@ static void McPowerOn(void) // 10ms待ち OS_Sleep(10); - // リセットをhighに (RESB = 1にする) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) | - CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0)); + // リセットをhighに (RESB = 1にする) + reg_HOTSW_MCCNT1 = RESB_MASK; + // 10ms待ち OS_Sleep(10); @@ -844,8 +868,7 @@ static void SetMCSCR(void) reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16); // MCCNT1 レジスタ設定 (SCR = 1に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) | - CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0)); + reg_HOTSW_MCCNT1 = SCR_MASK; } /*---------------------------------------------------------------------------*