diff --git a/build/libraries_sysmenu/hotsw/ARM7/Makefile b/build/libraries_sysmenu/hotsw/ARM7/Makefile index 4d0a2704..544cac43 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/Makefile +++ b/build/libraries_sysmenu/hotsw/ARM7/Makefile @@ -33,10 +33,10 @@ SRCS = blowfish.c \ hotsw.c \ ds_blowfish_table.c \ dsCardCommon.c \ - dsCardType1.c \ - dsCardType2.c \ romEmulation.c \ customNDma.c \ +# dsCardType1.c \ +# dsCardType2.c \ TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h index 2bbf2e73..4fcb4bde 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h @@ -19,6 +19,9 @@ extern "C" { // DSカードのノーマルモードのID読み込み HotSwState ReadIDNormal(CardBootData *cbd); +// DSカードのノーマルモードのBoot Segment(4Kbyte)読み込み +HotSwState ReadBootSegNormal(CardBootData *cbd); + // DSカードType1のノーマルモードのモード変更 HotSwState ChangeModeNormal(CardBootData *cbd); @@ -29,6 +32,23 @@ HotSwState LoadTable(void); HotSwState ReadRomEmulationData(CardBootData *cbd); +// ■ セキュアモードのコマンド ■ +// DSカードのセキュアモードのID読み込み +HotSwState ReadIDSecure(CardBootData *cbd); + +// DSカードのセキュアモードのSecure Segment(16Kbyte)読み込み +HotSwState ReadSegSecure(CardBootData *cbd); + +// DSカードのセキュアモードのPNジェネレータON +HotSwState SwitchONPNGSecure(CardBootData *cbd); + +// DSカードのセキュアモードのPNジェネレータOFF +HotSwState SwitchOFFPNGSecure(CardBootData *cbd); + +// DSカードのセキュアモードのモード変更 +HotSwState ChangeModeSecure(CardBootData *cbd); + + // ■ ゲームモードのコマンド ■ // DSカードのゲームモードのID読み込み HotSwState ReadIDGame(CardBootData *cbd); diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h deleted file mode 100644 index 2f33d233..00000000 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h +++ /dev/null @@ -1,45 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlSDK - File: - *---------------------------------------------------------------------------*/ -#ifndef __HOTSW_DSCARD_TYPE1_H__ -#define __HOTSW_DSCARD_TYPE1_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// =========================================================================== -// Function Describe -// =========================================================================== - -// ■ ノーマルモードのコマンド ■ -// DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み -HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd); - - -// ■ セキュアモードのコマンド ■ -// DSカードType1のセキュアモードのID読み込み -HotSwState ReadIDSecure_DSType1(CardBootData *cbd); - -// DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み -HotSwState ReadSegSecure_DSType1(CardBootData *cbd); - -// DSカードType1のセキュアモードのPNジェネレータON -HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd); - -// DSカードType1のセキュアモードのPNジェネレータOFF -HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd); - -// DSカードType1のセキュアモードのモード変更 -HotSwState ChangeModeSecure_DSType1(CardBootData *cbd); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif // __HOTSW_DSCARD_TYPE1_H__ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h deleted file mode 100644 index bba73fcf..00000000 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ /dev/null @@ -1,44 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlSDK - File: - *---------------------------------------------------------------------------*/ -#ifndef __HOTSW_DSCARD_TYPE2_H__ -#define __HOTSW_DSCARD_TYPE2_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// =========================================================================== -// Function Describe -// =========================================================================== -// ■ ノーマルモードのコマンド ■ -// DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み -HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd); - - -// ■ セキュアモードのコマンド ■ -// DSカードType2のセキュアモードのID読み込み -HotSwState ReadIDSecure_DSType2(CardBootData *cbd); - -// DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み -HotSwState ReadSegSecure_DSType2(CardBootData *cbd); - -// DSカードType2のセキュアモードのPNジェネレータON -HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd); - -// DSカードType2のセキュアモードのPNジェネレータOFF -HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd); - -// DSカードType2のセキュアモードのモード変更 -HotSwState ChangeModeSecure_DSType2(CardBootData *cbd); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif // __HOTSW_DSCARD_TYPE2_H__ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 2770a0c9..100a2c70 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -230,6 +230,7 @@ typedef struct CardBootData{ u32 id_nml; u32 id_scr; + u32 id_scr2; u32 id_gam; u32 arm9StcSize; @@ -249,12 +250,14 @@ typedef struct CardBootData{ u32 keyBuf[KEY_BUF_SIZE]; CardTypeEx cardType; + ModeType modeType; u32 secureLatency; u32 gameCommondParam; BootSegmentData *pBootSegBuf; u32 *pSecureSegBuf; - + u32 *pSecure2SegBuf; + BLOWFISH_CTX keyTable; } CardBootData; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index baa5cbf1..668a8f9c 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -9,6 +9,10 @@ #include // define ------------------------------------------------------------------- +#define SECURE_SEGMENT_NUM 4 +#define ONE_SEGMENT_PAGE_NUM 8 +#define COMMAND_DECRYPTION_WAIT 25 // 25ms + #define ROM_EMULATION_START_OFS 0x160 #define ROM_EMULATION_END_OFS 0x180 @@ -48,6 +52,91 @@ HotSwState ReadIDNormal(CardBootData *cbd) return HOTSW_SUCCESS; } + +/*---------------------------------------------------------------------------* + * Name: ReadBootSegNormal + * + * Description: Type1のノーマルモードのBoot Segment読み込み + * + * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page + *---------------------------------------------------------------------------*/ +HotSwState ReadBootSegNormal(CardBootData *cbd) +{ + u32 i, loop, pc, size; + u32 *dst = cbd->pBootSegBuf->word; + u32 temp; + u64 page = 0; + GCDCmd64 cndLE, cndBE; + + if(cbd->cardType == DS_CARD_TYPE_1){ + loop = 0x1UL; + pc = 0x4UL; + size = BOOT_SEGMENT_SIZE; + } + else{ + loop = ONE_SEGMENT_PAGE_NUM; + pc = 0x1UL; + size = PAGE_SIZE; + } + + // secure2モード移行の為、Boot Segmentを1ページ分読み込む。データは捨てバッファに格納 + if(cbd->modeType == HOTSW_MODE2){ + loop = 0x1UL; + pc = 0x1UL; + size = PAGE_SIZE; + } + + for(i=0; imodeType == HOTSW_MODE1){ + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + } + else{ + // Mode2のときは、データを捨てる。 + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + temp = reg_HOTSW_MCD1; + } + } + + page++; + } + + return HOTSW_SUCCESS; +} + + /*---------------------------------------------------------------------------* * Name: ChangeModeNormal * @@ -168,6 +257,343 @@ HotSwState ReadRomEmulationData(CardBootData *cbd) return HOTSW_SUCCESS; } + +// ■--------------------------------------■ +// ■ セキュアモードのコマンド ■ +// ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: SetSecureCommand + + Description: + *---------------------------------------------------------------------------*/ +static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) +{ + GCDCmd64 cndLE, cndBE; + u64 data; + + // ゼロクリア + MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); + data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; + + cndLE.dw = cbd->vbi; + cndLE.dw |= data << 20; + + // comannd0部分 + switch(type){ + case S_RD_ID: + cndLE.dw |= 0x1000000000000000; + break; + + case S_PNG_ON: + cndLE.dw |= 0x4000000000000000; + break; + + case S_PNG_OFF: + cndLE.dw |= 0x6000000000000000; + break; + + case S_CHG_MODE: + cndLE.dw |= 0xa000000000000000; + break; + } + + 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]; + 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]; +} + + +/*---------------------------------------------------------------------------* + * Name: ReadIDSecure + * + * Description: + * + * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status + *---------------------------------------------------------------------------*/ +HotSwState ReadIDSecure(CardBootData *cbd) +{ + u32 scrambleMask; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // スクランブルの設定 + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + + // コマンド作成・設定 + SetSecureCommand(S_RD_ID, cbd); + + // ★ 3DM対応 + if(cbd->cardType == DS_CARD_TYPE_2){ + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + } + // ★ MROM対応 + else{ + scrambleMask |= TRM_MASK; + } + + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // コマンドカウンタインクリメント + cbd->vbi++; + + return HOTSW_SUCCESS; +} + +/*---------------------------------------------------------------------------* + * Name: ReadSegSecure + * + * Description: + *---------------------------------------------------------------------------*/ +HotSwState ReadSegSecure(CardBootData *cbd) +{ + u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf; + u32 loop, pc, size, interval, i, j=0, k; + u64 segNum = 4; + u64 vae = cbd->vae; + GCDCmd64 cndLE, cndBE; + + if(cbd->cardType == DS_CARD_TYPE_1){ + loop = 0x1UL; + pc = 0x4UL; + size = ONE_SEGMENT_SIZE; + interval = ONE_SEGMENT_WORD_SIZE; + } + else{ + loop = ONE_SEGMENT_PAGE_NUM; + pc = 0x1UL; + size = PAGE_SIZE; + interval = PAGE_WORD_SIZE; + } + + for(i=0; ivbi; + cndLE.dw |= vae << 20; + cndLE.dw |= segNum << 44; + cndLE.dw |= 0x2000000000000000; + + // コマンドの暗号化 + EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + + // ビッグエンディアンに直す(暗号化後) + 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]; + + if(cbd->cardType == DS_CARD_TYPE_2){ + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + } + else{ + // MROM対応 + scrambleMask |= TRM_MASK; + } + + for(k=0; kpBootSegBuf->rh.s.secure_cmd_param; + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // 転送済みページ数 + j++; + } + + // 読み込みセグメント番号インクリメント + segNum++; + + // コマンドカウンタインクリメント + cbd->vbi++; + } + + return HOTSW_SUCCESS; +} + +/*---------------------------------------------------------------------------* + * Name: SwitchONPNGSecure + * + * Description: + *---------------------------------------------------------------------------*/ +HotSwState SwitchONPNGSecure(CardBootData *cbd) +{ + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // スクランブルの設定 + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + + // コマンド作成・設定 + SetSecureCommand(S_PNG_ON, cbd); + + // ★ 3DM対応 + if(cbd->cardType == DS_CARD_TYPE_2){ + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + } + // ★ MROM対応 + else{ + scrambleMask |= TRM_MASK; + } + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // コマンドカウンタインクリメント + cbd->vbi++; + + return HOTSW_SUCCESS; +} + +/*---------------------------------------------------------------------------* + * Name: SwitchOFFPNGSecure + * + * Description: + *---------------------------------------------------------------------------*/ +HotSwState SwitchOFFPNGSecure(CardBootData *cbd) +{ + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // スクランブルの設定 + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + + // コマンド作成・設定 + SetSecureCommand(S_PNG_OFF, cbd); + + // ★ 3DM対応 + if(cbd->cardType == DS_CARD_TYPE_2){ + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + } + // ★ MROM対応 + else{ + scrambleMask |= TRM_MASK; + } + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // コマンドカウンタインクリメント + cbd->vbi++; + + return HOTSW_SUCCESS; +} + +/*---------------------------------------------------------------------------* + * Name: ChangeModeSecure + * + * Description: + * + * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page + *---------------------------------------------------------------------------*/ +HotSwState ChangeModeSecure(CardBootData *cbd) +{ + u32 scrambleMask; + + if(!HOTSW_IsCardAccessible()){ + return HOTSW_PULLED_OUT_ERROR; + } + + // スクランブルの設定 + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + + // コマンド作成・設定 + SetSecureCommand(S_CHG_MODE, cbd); + + // ★ 3DM対応 + if(cbd->cardType == DS_CARD_TYPE_2){ + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + } + // ★ MROM対応 + else{ + scrambleMask |= TRM_MASK; + } + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // コマンドカウンタインクリメント + cbd->vbi++; + + return HOTSW_SUCCESS; +} + + // ■------------------------------------■ // ■ ゲームモードのコマンド ■ // ■------------------------------------■ diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c deleted file mode 100644 index c2a09d17..00000000 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ /dev/null @@ -1,319 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlSDK - File: dsCardType1.c - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include - -// Function prototype ------------------------------------------------------- -static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); -static void SetMCSCR(void); - - -// =========================================================================== -// Function Describe -// =========================================================================== - -// ■--------------------------------------■ -// ■ ノーマルモードのコマンド ■ -// ■--------------------------------------■ -/*---------------------------------------------------------------------------* - Name: ReadIDNormal_DSType1 - - Description: Type1のノーマルモードのID読み込み - *---------------------------------------------------------------------------*/ -// 共通 - -/*---------------------------------------------------------------------------* - * Name: ReadBootSegNormal_DSType1 - * - * Description: Type1のノーマルモードのBoot Segment読み込み - * - * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page - *---------------------------------------------------------------------------*/ -HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd) -{ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // 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 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x4 << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - return HOTSW_SUCCESS; -} - -// ■--------------------------------------■ -// ■ セキュアモードのコマンド ■ -// ■--------------------------------------■ -/*---------------------------------------------------------------------------* - Name: SetSecureCommand - - Description: - *---------------------------------------------------------------------------*/ -static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) -{ - GCDCmd64 cndLE, cndBE; - u64 data; - - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; - - cndLE.dw = cbd->vbi; - cndLE.dw |= data << 20; - - // comannd0部分 - switch(type){ - case S_RD_ID: - cndLE.dw |= 0x1000000000000000; - break; - - case S_PNG_ON: - cndLE.dw |= 0x4000000000000000; - break; - - case S_PNG_OFF: - cndLE.dw |= 0x6000000000000000; - break; - - case S_CHG_MODE: - cndLE.dw |= 0xa000000000000000; - break; - } - - 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]; - 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]; -} - - -/*---------------------------------------------------------------------------* - * Name: ReadIDSecure_DSType1 - * - * Description: - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status - *---------------------------------------------------------------------------*/ -HotSwState ReadIDSecure_DSType1(CardBootData *cbd) -{ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); - - // コマンド作成・設定 - SetSecureCommand(S_RD_ID, cbd); - - // MCCNT1 レジスタ設定 - // (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); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: ReadSegSecure_DSType1 - * - * Description: - *---------------------------------------------------------------------------*/ -HotSwState ReadSegSecure_DSType1(CardBootData *cbd) -{ - u32 i,j=0; - u64 segNum = 4; - u64 vae = cbd->vae; - GCDCmd64 cndLE, cndBE; - - for(i=0; i<4; i++){ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE ); - - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - - cndLE.dw = cbd->vbi; - cndLE.dw |= vae << 20; - cndLE.dw |= segNum << 44; - cndLE.dw |= 0x2000000000000000; - - // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); - - // ビッグエンディアンに直す(暗号化後) - 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]; - - // MCCNT1 レジスタ設定 - // (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); - - // 読み込みセグメント番号インクリメント - segNum++; - - // コマンドカウンタインクリメント - cbd->vbi++; - } - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: SwitchONPNGSecure_DSType1 - * - * Description: - *---------------------------------------------------------------------------*/ -HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd) -{ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // コマンド作成・設定 - SetSecureCommand(S_PNG_ON, cbd); - - // 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); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: SwitchOFFPNGSecure_DSType1 - * - * Description: - *---------------------------------------------------------------------------*/ -HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd) -{ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // コマンド作成・設定 - SetSecureCommand(S_PNG_OFF, cbd); - - // 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); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: ChangeModeSecure_DSType1 - * - * Description: - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page - *---------------------------------------------------------------------------*/ -HotSwState ChangeModeSecure_DSType1(CardBootData *cbd) -{ - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // コマンド作成・設定 - SetSecureCommand(S_CHG_MODE, cbd); - - // 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); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - - -// ■------------------------------------■ -// ■ ゲームモードのコマンド ■ -// ■------------------------------------■ -/*---------------------------------------------------------------------------* - * Name: ReadIDGame_DSType1 - * - * Description: ゲームモードでIDを読み込む - *---------------------------------------------------------------------------*/ -// 共通 - -/*---------------------------------------------------------------------------* - * Name: ReadPageGame_DSType1 - * - * Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む - * - * CT=150ns Pagecount=1page Latency=RomHeaderで指定の値 - *---------------------------------------------------------------------------*/ -// 共通 - diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c deleted file mode 100644 index e2ba22a1..00000000 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c +++ /dev/null @@ -1,434 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlSDK - File: dsCardType2.c - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include - -// Define Data -------------------------------------------------------------- -#define SECURE_SEGMENT_NUM 4 -#define ONE_SEGMENT_PAGE_NUM 8 -#define COMMAND_DECRYPTION_WAIT 25 // 25ms - -// Function prototype ------------------------------------------------------- -static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); -static void SetMCSCR(void); - - -// =========================================================================== -// Function Describe -// =========================================================================== - -// ■--------------------------------------■ -// ■ ノーマルモードのコマンド ■ -// ■--------------------------------------■ -/*---------------------------------------------------------------------------* - Name: ReadIDNormal_DSType2 - - Description: Type2のノーマルモードのID読み込み - *---------------------------------------------------------------------------*/ -// 共通 - -/*---------------------------------------------------------------------------* - * Name: ReadBootSegNormal_DSType2 - * - * Description: Type2のノーマルモードのBoot Segment読み込み - * - * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page - *---------------------------------------------------------------------------*/ -HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd) -{ - u32 i = 0; - u32 loop = ONE_SEGMENT_PAGE_NUM; - u32 *dst = cbd->pBootSegBuf->word; - u64 page = 0; - GCDCmd64 cndLE, cndBE; - - for(i=0; ipBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); - - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - - // リトルエンディアンで作って - cndLE.dw = 0x0 << 24; - cndLE.dw |= page << 33; - - // ビックエンディアンにする - cndBE.b[0] = cndLE.b[7]; - cndBE.b[1] = cndLE.b[6]; - cndBE.b[2] = cndLE.b[5]; - cndBE.b[3] = cndLE.b[4]; - cndBE.b[4] = cndLE.b[3]; - cndBE.b[5] = cndLE.b[2]; - cndBE.b[6] = cndLE.b[1]; - cndBE.b[7] = cndLE.b[0]; - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b; - reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4]; - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - page++; - } - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: ChangeModeNormal_DSType2 - * - * Description: Type2のノーマルモードのモード変更 - * - * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page - *---------------------------------------------------------------------------*/ -// 共通 - - -// ■--------------------------------------■ -// ■ セキュアモードのコマンド ■ -// ■--------------------------------------■ -/*---------------------------------------------------------------------------* - Name: SetSecureCommand - - Description: - *---------------------------------------------------------------------------*/ -static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) -{ - GCDCmd64 cndLE, cndBE; - u64 data; - - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; - - cndLE.dw = cbd->vbi; - cndLE.dw |= data << 20; - - // comannd0部分 - switch(type){ - case S_RD_ID: - cndLE.dw |= 0x1000000000000000; - break; - - case S_PNG_ON: - cndLE.dw |= 0x4000000000000000; - break; - - case S_PNG_OFF: - cndLE.dw |= 0x6000000000000000; - break; - - case S_CHG_MODE: - cndLE.dw |= 0xa000000000000000; - break; - } - - 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]; - 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]; -} - - -/*---------------------------------------------------------------------------* - * Name: ReadIDSecure_DSType2 - * - * Description: デバッガを読み込んだ場合はSCRAMBLE_MASK -> CS SE DS をマスク - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status - *---------------------------------------------------------------------------*/ -HotSwState ReadIDSecure_DSType2(CardBootData *cbd) -{ - u32 scrambleMask; - - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // スクランブルの設定 - scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - - // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); - - // コマンド作成・設定 - SetSecureCommand(S_RD_ID, cbd); - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // 25ms待ち - OS_Sleep(COMMAND_DECRYPTION_WAIT); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0; - reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: ReadSegSecure_DSType2 - * - * Description: Secure領域を読み込む関数 - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page - *---------------------------------------------------------------------------*/ -HotSwState ReadSegSecure_DSType2(CardBootData *cbd) -{ - u32 i,j=0,k; - u64 segNum = 4; - u64 vae = cbd->vae; - GCDCmd64 cndLE, cndBE; - - // スクランブルの設定 - u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - - for(i=0; ivbi; - cndLE.dw |= vae << 20; - cndLE.dw |= segNum << 44; - cndLE.dw |= 0x2000000000000000; - - // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); - - // ビッグエンディアンに直す(暗号化後) - 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]; - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // 25ms待ち - OS_Sleep(COMMAND_DECRYPTION_WAIT); - - for(k=0; kpSecureSegBuf + (PAGE_WORD_SIZE * j), PAGE_SIZE ); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0; - reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - // 転送済みページ数 - j++; - } - - // 読み込みセグメント番号インクリメント - segNum++; - - // コマンドカウンタインクリメント - cbd->vbi++; - } - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: SwitchONPNGSecure_DSType2 - * - * Description: PNジェネレータをONにする - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page - *---------------------------------------------------------------------------*/ -HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd) -{ - u32 scrambleMask; - - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // スクランブルの設定 - scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - - // コマンド作成・設定 - SetSecureCommand(S_PNG_ON, cbd); - - // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // 25ms待ち - OS_Sleep(COMMAND_DECRYPTION_WAIT); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0; - reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: SwitchOFFPNGSecure_DSType2 - * - * Description: PNジェネレータをOFFする - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page - *---------------------------------------------------------------------------*/ -HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd) -{ - u32 scrambleMask; - - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // スクランブルの設定 - scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - - // コマンド作成・設定 - SetSecureCommand(S_PNG_OFF, cbd); - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // 25ms待ち - OS_Sleep(COMMAND_DECRYPTION_WAIT); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0; - reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - -/*---------------------------------------------------------------------------* - * Name: ChangeModeSecure_DSType2 - * - * Description: Gameモードに移行する - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page - *---------------------------------------------------------------------------*/ -HotSwState ChangeModeSecure_DSType2(CardBootData *cbd) -{ - u32 scrambleMask; - - if(!HOTSW_IsCardAccessible()){ - return HOTSW_PULLED_OUT_ERROR; - } - - // スクランブルの設定 - scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - - // コマンド作成・設定 - SetSecureCommand(S_CHG_MODE, cbd); - - // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // 25ms待ち - OS_Sleep(COMMAND_DECRYPTION_WAIT); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0; - reg_HOTSW_MCCMD1 = 0x0; - - // MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に) - reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - - // コマンドカウンタインクリメント - cbd->vbi++; - - return HOTSW_SUCCESS; -} - - -// ■------------------------------------■ -// ■ ゲームモードのコマンド ■ -// ■------------------------------------■ -/*---------------------------------------------------------------------------* - Name: ReadIDGame_DSType2 - - Description: ゲームモードでIDを読み込む - *---------------------------------------------------------------------------*/ -// 共通 - - -/*---------------------------------------------------------------------------* - * Name: ReadPageGame_DSType2 - * - * Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む - *---------------------------------------------------------------------------*/ -// 共通 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 5dd98b65..f3b22f9d 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -17,8 +17,6 @@ #include #include #include -#include -#include #include #include #include <../build/libraries/mb/common/include/mb_fileinfo.h> @@ -117,16 +115,17 @@ static void ShowRomHeaderData(void); static void DebugPrintErrorMessage(HotSwState state); // Static Values ------------------------------------------------------------ -static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj"; -static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD"; +static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj"; +static char rom_emu_info[] ATTRIBUTE_ALIGN(4) = "TWLD"; static u16 s_RscLockID; static u16 s_CardLockID; -static u32 s_SecureSegBufSize, s_BootSegBufSize; +static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize; -static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく static BootSegmentData *s_pBootSegBuffer; // カード抜けてもバッファの場所覚えとく +static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく +static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく static CardBootData s_cbData; static CardThreadData s_ctData; @@ -156,19 +155,19 @@ static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { static CardBootFunction s_funcTable[] = { // DS Card Type 1 - { ReadBootSegNormal_DSType1, ChangeModeNormal, // Normalモード関数 - ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 + ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 + ReadIDGame, ReadPageGame}, // Game モード関数 // DS Card Type 2 - { ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数 - ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 + ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 + ReadIDGame, ReadPageGame}, // Game モード関数 // TWL Card Type 1 - { ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数 - ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 + ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 + ReadIDGame, ReadPageGame}, // Game モード関数 // RomEmulation - { ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数 + { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数 ReadIDGame, ReadPageGame}, // Game モード関数 }; @@ -250,9 +249,12 @@ void HOTSW_Init(void) // Boot Segment バッファの設定 HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); - // Secure Segment バッファの設定 - HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); + // Secure1 Segment バッファの設定 + HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); + // Secure2 Segment バッファの設定 + HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); + // カードが挿さってあったらスレッドを起動する if(HOTSW_IsCardExist()){ // メッセージ送信 @@ -273,8 +275,6 @@ void HOTSW_Init(void) * * ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから * この関数を呼んでください。 - * - * [TODO:]カードのロックを見直し。InitでロックIDをがめておいて使うのでもOK * ----------------------------------------------------------------- */ static HotSwState LoadCardData(void) { @@ -305,7 +305,7 @@ static HotSwState LoadCardData(void) s_cbData.pSecureSegBuf = s_pSecureSegBuffer; // ブート処理開始 - if(HOTSW_IsCardAccessible()){ + if(HOTSW_IsCardExist()){ // カード側でKey Tableをロードする state = LoadTable(); retval = (retval == HOTSW_SUCCESS) ? state : retval; @@ -708,17 +708,28 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size) * * 注:カードブート処理中は呼び出さないようにする * ----------------------------------------------------------------- */ -void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size) +void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) { SDK_ASSERT(size > SECURE_SEGMENT_SIZE); - - s_pSecureSegBuffer = (u32 *)buf; - s_SecureSegBufSize = size; - s_cbData.pSecureSegBuf = s_pSecureSegBuffer; + if(type == HOTSW_MODE1){ + s_pSecureSegBuffer = (u32 *)buf; + s_SecureSegBufSize = size; + + s_cbData.pSecureSegBuf = s_pSecureSegBuffer; - // バッファの初期化 - MI_CpuClear8(s_pSecureSegBuffer, size); + // バッファの初期化 + MI_CpuClear8(s_pSecureSegBuffer, size); + } + else{ + s_pSecure2SegBuffer = (u32 *)buf; + s_Secure2SegBufSize = size; + + s_cbData.pSecure2SegBuf = s_pSecure2SegBuffer; + + // バッファの初期化 + MI_CpuClear8(s_pSecure2SegBuffer, size); + } } /* ----------------------------------------------------------------- diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 24ff94ba..0fe41b19 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -33,6 +33,11 @@ typedef enum HotSwMessageType{ HOTSW_CONTROL } HotSwMessageType; +typedef enum ModeType{ + HOTSW_MODE1, + HOTSW_MODE2 +} ModeType; + // union ------------------------------------------------------------------- // PXI用メッセージ typedef union HotSwPxiMessage{ @@ -67,7 +72,7 @@ BOOL HOTSW_IsCardAccessible(void); void HOTSW_SetBootSegmentBuffer(void* buf, u32 size); // Secure Segment バッファの指定 -void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size); +void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size); // Romエミュレーション情報を格納しているバッファのポインタを返す #ifdef SDK_ARM7