diff --git a/build/libraries_sysmenu/hotsw/ARM7/Makefile b/build/libraries_sysmenu/hotsw/ARM7/Makefile index e3a6af27..092ee1f6 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/Makefile +++ b/build/libraries_sysmenu/hotsw/ARM7/Makefile @@ -33,6 +33,7 @@ SRCS = blowfish.c \ hotsw.c \ dsCardCommon.c \ romEmulation.c \ + twl_blowfish_table.c \ customNDma.c TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h index c5bf80bc..b3d5abea 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h @@ -23,6 +23,7 @@ extern "C" { /*************************************************************************/ extern BLOWFISH_CTX HotSwBlowfishInitTableBufDS; +extern BLOWFISH_CTX HotSwBlowfishInitTableTWL; // Function Prototype ------------------------------------------------------------------------ // Blowfish 初期化 diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index d689f28c..1afec397 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -48,6 +48,9 @@ extern "C" { #define SECURE_SEGMENT_SIZE 0x4000 #define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE) +// --- TWL Card +#define TWLCARD_BORDER_OFFSET 0x80000 + // --- Page / Segment (Byte) #define PAGE_SIZE 0x200 #define ONE_SEGMENT_SIZE 0x1000 @@ -281,16 +284,18 @@ typedef struct CardBootData{ u32 arm7Stc; u32 arm9Ltd; u32 arm7Ltd; - + BOOL twlFlg; BOOL debuggerFlg; - - u32 romStatus; + BOOL illegalCardFlg; + BOOL isLoadTypeTwl; u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; u32 keyBuf[KEY_BUF_SIZE]; u32 keyBuf2[KEY_BUF_SIZE]; + u32 romStatus; + CardTypeEx cardType; ModeType modeType; RomMode romMode; @@ -306,8 +311,10 @@ typedef struct CardBootData{ // スレッド・メッセージ関係をまとめた構造体 typedef struct CardThreadData{ - u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; - OSThread thread; + u64 hotswStack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; + u64 monitorStack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; + OSThread hotswThread; + OSThread monitorThread; u32 idx_insert; u32 idx_pulledOut; @@ -327,18 +334,12 @@ typedef struct CardThreadData{ } CardThreadData; // カード起動用関数 -typedef struct CardBootFunction { - HotSwState (*ReadBootSegment_N)(CardBootData *cbd); - HotSwState (*ChangeMode_N)(CardBootData *cbd); - +typedef struct CardLoadFunction { HotSwState (*ReadID_S)(CardBootData *cbd); HotSwState (*ReadSegment_S)(CardBootData *cbd); HotSwState (*SetPNG_S)(CardBootData *cbd); HotSwState (*ChangeMode_S)(CardBootData *cbd); - - HotSwState (*ReadID_G)(CardBootData *cbd); - HotSwState (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); -} CardBootFunction; +} CardLoadFunction; #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c index e8f00b1c..4afeed83 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c @@ -21,11 +21,12 @@ // Function Prototype ------------------------------------------------------- static u32 F(const BLOWFISH_CTX *ctx, u32 x); -//***************************************** -// -// GCDm_MakeBlowfishTableDS関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: GCDm_MakeBlowfishTableDS + + Description: KeyTableの生成 + *---------------------------------------------------------------------------*/ void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) { const BLOWFISH_CTX *initTable = &HotSwBlowfishInitTableBufDS; @@ -42,10 +43,14 @@ void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) } else{ keyBuf = cbd->keyBuf2; - - MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); + + MI_CpuCopyFast(&HotSwBlowfishInitTableTWL, (void *)ctx, sizeof(BLOWFISH_CTX)); +// MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); + + return; } + // [TODO] KeyTable2用の初期化 keyBuf[0] = *RomHeaderGameCode; keyBuf[1] = *RomHeaderGameCode >> 1; keyBuf[2] = *RomHeaderGameCode << 1; @@ -60,11 +65,12 @@ void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) InitBlowfishKeyAndTableDS(ctx, keyBuf, keyLen); } -//***************************************** -// -// InitBlowfishKeyAndTableDS関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: InitBlowfishKeyAndTableDS + + Description: + *---------------------------------------------------------------------------*/ void InitBlowfishKeyAndTableDS(BLOWFISH_CTX *ctx, u32 *keyBufp, s32 keyLen) { EncryptByBlowfish(ctx, &(keyBufp)[2], &(keyBufp)[1]); @@ -72,11 +78,12 @@ void InitBlowfishKeyAndTableDS(BLOWFISH_CTX *ctx, u32 *keyBufp, s32 keyLen) InitBlowfish(ctx, (u8 *)keyBufp, keyLen); } -//***************************************** -// -// InitBlowfish関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: InitBlowfish + + Description: + *---------------------------------------------------------------------------*/ void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen) { int i, j, k; @@ -113,11 +120,12 @@ void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen) } -//***************************************** -// -// EncryptByBlowfish関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: EncryptByBlowfish + + Description: + *---------------------------------------------------------------------------*/ void EncryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) { u32 Xl; @@ -149,11 +157,12 @@ void EncryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) *xr = Xr; } -//***************************************** -// -// DecryptByBlowfish関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: DecryptByBlowfish + + Description: + *---------------------------------------------------------------------------*/ void DecryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) { u32 Xl; @@ -187,11 +196,12 @@ void DecryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) *xr = Xr; } -//***************************************** -// -// F関数 -// -//***************************************** + +/*---------------------------------------------------------------------------* + Name: F + + Description: + *---------------------------------------------------------------------------*/ static u32 F(const BLOWFISH_CTX *ctx, u32 x) { u32 a, b, c, d; u32 y; @@ -214,5 +224,3 @@ static u32 F(const BLOWFISH_CTX *ctx, u32 x) { return y; } - - diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index d86b6392..df572342 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -19,22 +19,32 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si // =========================================================================== /*---------------------------------------------------------------------------* Name: HOTSW_NDmaCopy_Card + + Description: カードから送られてきたデータを指定アドレスにDMA転送する *---------------------------------------------------------------------------*/ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size) { HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_INC); } + /*---------------------------------------------------------------------------* Name: HOTSW_NDmaPipe_Card + + Description: カードから送られてきたデータを指定アドレスにDMA転送で読み捨てる *---------------------------------------------------------------------------*/ void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size) { HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX); } + /*---------------------------------------------------------------------------* Name: HOTSWi_NDmaCopy_Card + + Description: DMA転送の準備 + + 注:先にこの関数でDMA転送の準備をしてから、カードレジスタのstartフラグを上げてください *---------------------------------------------------------------------------*/ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont) { diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 3bdd415a..72658b76 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -31,6 +31,11 @@ static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask); // Function Describe // =========================================================================== +/*---------------------------------------------------------------------------* + Name: HOTSWi_SetCommand + + Description: 引数で与えられたコマンドのエンディアンを変えてレジスタにセットする + *---------------------------------------------------------------------------*/ void HOTSWi_SetCommand(GCDCmd64 *cndLE) { GCDCmd64 cndBE; @@ -57,11 +62,11 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE) // ■------------------------------------■ // ■ ノーマルモードのコマンド ■ // ■------------------------------------■ -/* ----------------------------------------------------------------- - * ReadIDNormal関数 - * - * ノーマルモード時のカードIDを読み込む関数 - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: ReadIDNormal + + Description: ノーマルモード時のカードIDを読み込む関数 + *---------------------------------------------------------------------------*/ HotSwState ReadIDNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -86,6 +91,8 @@ HotSwState ReadIDNormal(CardBootData *cbd) // DMAが終了するまで待つ HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); + +// OS_TPrintf("Normal ID : 0x%08x\n", cbd->id_nml); return HOTSW_SUCCESS; } @@ -165,11 +172,11 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) } -/* ----------------------------------------------------------------- - * ReadStatusNormal関数 - * - * ノーマルモードでステータスを読み込む - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: ReadStatusNormal + + Description: ノーマルモードでステータスを読み込む + *---------------------------------------------------------------------------*/ HotSwState ReadStatusNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -205,11 +212,11 @@ HotSwState ReadStatusNormal(CardBootData *cbd) } -/* ----------------------------------------------------------------- - * RefreshBadBlockNormal関数 - * - * ノーマルモードでバッドブロックを置換 - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: RefreshBadBlockNormal + + Description: ノーマルモードでバッドブロックを置換 + *---------------------------------------------------------------------------*/ HotSwState RefreshBadBlockNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -249,6 +256,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd) return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG_MODE); } + /*---------------------------------------------------------------------------* * Name: ChangeModeNorma2 * @@ -291,14 +299,14 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd) } -/* ----------------------------------------------------------------- - * LoadTable関数 - * - * カード側の Key Table をロードする関数。 - * - * ※この関数は開発カード用に発行しないといけない。 - * 製品版カードの場合、このコマンドは無視される - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: LoadTable + + Description: カード側の Key Table をロードする関数 + + ※この関数は開発カード用に発行しないといけない。 +  製品版カードの場合、このコマンドは無視される + *---------------------------------------------------------------------------*/ HotSwState LoadTable(void) { GCDCmd64 cndLE; @@ -328,6 +336,7 @@ HotSwState LoadTable(void) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: ReadRomEmulationData @@ -377,7 +386,7 @@ HotSwState ReadRomEmulationData(CardBootData *cbd) /*---------------------------------------------------------------------------* Name: SetSecureCommand - Description: + Description: 引数で与えられたコマンドをBlowfishで暗号化してレジスタにセット *---------------------------------------------------------------------------*/ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) { @@ -490,6 +499,7 @@ HotSwState ReadIDSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadSegSecure * @@ -565,6 +575,7 @@ HotSwState ReadSegSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: SwitchONPNGSecure * @@ -602,6 +613,7 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: SwitchOFFPNGSecure * @@ -639,6 +651,7 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ChangeModeSecure * @@ -719,6 +732,7 @@ HotSwState ReadIDGame(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadPageGame * @@ -767,6 +781,7 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadStatusGame * @@ -804,6 +819,7 @@ HotSwState ReadStatusGame(CardBootData *cbd) return HOTSW_SUCCESS; } + /* ----------------------------------------------------------------- * RefreshBadBlockGame関数 * diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index eb293ebb..9a16cb10 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -27,6 +27,8 @@ #define CHATTERING_COUNTER 0x600 #define COUNTER_A 0x100 +#define CARD_EXIST_CHECK_INTERVAL 300 + #define UNDEF_CODE 0xe7ffdeff // 未定義コード #define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB @@ -66,11 +68,15 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err); static void LockHotSwRsc(OSLockWord* word); static void UnlockHotSwRsc(OSLockWord* word); -static void McThread(void *arg); +static void HotSwThread(void *arg); +static void MonitorThread(void *arg); + static void McPowerOn(void); static void McPowerOff(void); static void SetMCSCR(void); +static BOOL isTwlModeLoad(void); + static void GenVA_VB_VD(void); static HotSwState DecryptObjectFile(void); static HotSwState LoadBannerData(void); @@ -78,6 +84,8 @@ static HotSwState LoadStaticModule(void); static HotSwState LoadCardData(void); static HotSwState CheckCardAuthCode(void); +static HotSwState SelectErrorState(HotSwState nowState, HotSwState beforeState); + static s32 LockExCard(u16 lockID); static s32 UnlockExCard(u16 lockID); @@ -100,6 +108,7 @@ static char rom_emu_info[] ATTRIBUTE_ALIGN(4) = "TWLD"; static u16 s_RscLockID; static u16 s_CardLockID; +static u16 s_bondingOp; static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize; @@ -109,6 +118,8 @@ static u32 *s_pSecure2SegBuffer; // static CardBootData s_cbData; +static BOOL s_IsPulledOut = TRUE; + // HMACSHA1の鍵 static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { 0x21, 0x06, 0xc0, 0xde, @@ -132,23 +143,15 @@ static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { 0x87, 0x46, 0x58, 0x24 }; -static CardBootFunction s_funcTable[] = { +static CardLoadFunction s_funcTable[] = { // DS Card Type 1 - { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 - ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, // DS Card Type 2 - { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 - ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, // TWL Card Type 1 - { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 - ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + { ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure}, // RomEmulation - { ReadBootSegNormal, ChangeModeNormal, // Normalモード関数 - ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数 - ReadIDGame, ReadPageGame}, // Game モード関数 + {ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU} }; // Global Values ------------------------------------------------------------ @@ -160,10 +163,11 @@ CardThreadData HotSwThreadData; // =========================================================================== // Function Describe // =========================================================================== + /*---------------------------------------------------------------------------* Name: HOTSW_Init - Arguments: None. - Returns: None. + + Description: *---------------------------------------------------------------------------*/ void HOTSW_Init(u32 threadPrio) { @@ -185,22 +189,18 @@ void HOTSW_Init(u32 threadPrio) (void)OS_EnableIrq(); (void)OS_EnableInterrupts(); -#ifdef SDK_ARM7 // チャッタリングカウンタの値を設定 reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) | (CHATTERING_COUNTER << REG_MI_MC1_CC_SHIFT)); // Counter-Aの値を設定 reg_MI_MC2 = COUNTER_A; -#else - // PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。 -#endif + // Bonding Optionの取得 + s_bondingOp = SCFG_REG_GetBondingOption(); - // カードブート用構造体の初期化 + // 構造体の初期化 MI_CpuClear8(&s_cbData, sizeof(CardBootData)); - - // カードスレッド用構造体の初期化 MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData)); // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) @@ -219,31 +219,37 @@ void HOTSW_Init(u32 threadPrio) s_CardLockID = (u16)tempLockID; } - // カードブート用スレッドの生成 - OS_CreateThread(&HotSwThreadData.thread, - McThread, + // カードデータロード用スレッドの生成 + OS_CreateThread(&HotSwThreadData.hotswThread, + HotSwThread, NULL, - HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), + HotSwThreadData.hotswStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HOTSW_THREAD_STACK_SIZE, threadPrio ); + // カードの状態監視用スレッドの生成 ( DSテレビ対策 ) + OS_CreateThread(&HotSwThreadData.monitorThread, + MonitorThread, + NULL, + HotSwThreadData.monitorStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), + HOTSW_THREAD_STACK_SIZE, + threadPrio + ); + // メッセージキューの初期化 OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); - - // メッセージキューの初期化 OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); // スレッド起動 - OS_WakeupThreadDirect(&HotSwThreadData.thread); - + OS_WakeupThreadDirect(&HotSwThreadData.hotswThread); + OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); + // Boot Segment バッファの設定 SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); - // Secure1 Segment バッファの設定 + // Secure1,2 Segment バッファの設定 SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); - - // Secure2 Segment バッファの設定 SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // カードが挿さってあったらスレッドを起動する @@ -259,19 +265,19 @@ void HOTSW_Init(u32 threadPrio) } } -/* ----------------------------------------------------------------- - * LoadCardData関数 - * - * カードからデータをロードする - * - * ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから - * この関数を呼んでください。 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: LoadCardData + + Description: カードからデータをロードする + + ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから + この関数を呼んでください。 + *---------------------------------------------------------------------------*/ static HotSwState LoadCardData(void) { OSTick start; HotSwState retval = HOTSW_SUCCESS; - HotSwState state = HOTSW_SUCCESS; u32 romMode = HOTSW_ROM_MODE_NULL; start = OS_GetTick(); @@ -284,13 +290,8 @@ static HotSwState LoadCardData(void) #endif // カード電源リセット -#ifdef SDK_ARM7 McPowerOff(); McPowerOn(); -#else // SDK_ARM9 - // ARM7にPXI経由でカード電源ONをお願い。ONになるまで待つ。 - -#endif // バッファを設定 s_cbData.pBootSegBuf = s_pBootSegBuffer; @@ -301,8 +302,7 @@ static HotSwState LoadCardData(void) s_cbData.modeType = HOTSW_MODE1; // カード側でKey Tableをロードする - state = LoadTable(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(LoadTable(), retval); // ---------------------- Normal Mode ---------------------- romMode = HOTSW_ROM_MODE_NORMAL; @@ -313,21 +313,18 @@ static HotSwState LoadCardData(void) // バナーリードが完了して、フラグ処理が終わるまでARM9と排他制御する LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - - // Boot Segment読み込み - state = ReadBootSegNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; // カードID読み込み - state = ReadIDNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM + retval = SelectErrorState(ReadIDNormal(&s_cbData), retval); + + // カードタイプを判別して、使う関数を切替える IDの最上位ビットが1なら3DM s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; + // Boot Segment読み込み + retval = SelectErrorState(ReadBootSegNormal(&s_cbData), retval); + // Romエミュレーション情報を取得 - state = ReadRomEmulationData(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(ReadRomEmulationData(&s_cbData), retval); // 取得したRomエミュレーション情報を比較 s_cbData.debuggerFlg = TRUE; @@ -341,7 +338,6 @@ static HotSwState LoadCardData(void) OS_PutString("Read Debugger\n"); s_cbData.cardType = ROM_EMULATION; s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK; - OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n", s_cbData.gameCommondParam); } else{ s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param; @@ -355,7 +351,7 @@ static HotSwState LoadCardData(void) if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ - retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; + retval = SelectErrorState(HOTSW_CRC_CHECK_ERROR, retval); } } @@ -385,22 +381,19 @@ static HotSwState LoadCardData(void) GenVA_VB_VD(); // セキュアモードに移行 - state = ChangeModeNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(ChangeModeNormal(&s_cbData), 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; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData), retval); // DS側符号生成回路初期値設定 (レジスタ設定) SetMCSCR(); // ID読み込み - state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData), retval); // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_nml != s_cbData.id_scr){ @@ -409,26 +402,24 @@ static HotSwState LoadCardData(void) if(retval == HOTSW_SUCCESS){ // Secure領域のSegment読み込み - state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData), retval); } // ★TWLカード対応 一旦リセット後Secure2モードに移行 - if(s_cbData.twlFlg == TRUE){ + // SCFG + if((s_cbData.isLoadTypeTwl = isTwlModeLoad()) == TRUE){ // Mode2に移行する準備 s_cbData.modeType = HOTSW_MODE2; - // Secure2領域・Game2領域開始アドレス算出 - - // ---------------------- Reset ---------------------- McPowerOff(); McPowerOn(); // ---------------------- Normal Mode ---------------------- + retval = SelectErrorState(ReadIDNormal(&s_cbData), retval); + // 先頭1Page分だけでOK。データは読み捨てバッファに - state = ReadBootSegNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(ReadBootSegNormal(&s_cbData), retval); // Key Table初期化 GCDm_MakeBlowfishTableDS(&s_cbData, 8); @@ -437,40 +428,33 @@ static HotSwState LoadCardData(void) GenVA_VB_VD(); // セキュア2モードに移行 - state = ChangeModeNormal2(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(ChangeModeNormal2(&s_cbData), retval); // ---------------------- Secure2 Mode ---------------------- // PNG設定 - state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData), retval); // DS側符号生成回路初期値設定 (レジスタ設定) SetMCSCR(); // セキュア2カードID読み込み - state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData), retval); // Secure2領域のSegment読み込み - state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData), retval); } // ゲームモードに移行 - state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData), retval); // ---------------------- Game Mode ---------------------- romMode = HOTSW_ROM_MODE_GAME; // ID読み込み - state = ReadIDGame(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(ReadIDGame(&s_cbData), retval); // バナーファイルの読み込み - state = LoadBannerData(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(LoadBannerData(), retval); // 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで) UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); @@ -482,15 +466,13 @@ static HotSwState LoadCardData(void) } // 常駐モジュール残りを指定先に転送 - state = LoadStaticModule(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(LoadStaticModule(), retval); // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 (void)DecryptObjectFile(); // 認証コード読み込み&ワーク領域にコピー - state = CheckCardAuthCode(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(CheckCardAuthCode(), retval); } else{ // 排他制御ここまで(※CRCチェックまでにミスがあったら、ここで開放する) @@ -500,16 +482,14 @@ static HotSwState LoadCardData(void) } } else{ - state = HOTSW_PULLED_OUT_ERROR; - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(HOTSW_PULLED_OUT_ERROR, retval); } end: if( retval == HOTSW_SUCCESS ) { // バッドブロックを置換 - state = HOTSWi_RefreshBadBlock(romMode); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState(HOTSWi_RefreshBadBlock(romMode), retval); } // カードDMA終了確認 @@ -530,15 +510,74 @@ end: return retval; } -/* ----------------------------------------------------------------- - * HOTSWi_RefreshBadBlock関数 - * - * ノーマルモードまたはゲームモードでバッドブロックを置換 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: isTwlModeLoad + + Description: カードのロードをTWLモードで行うかDSモードで行うかを決める + + + ■ Bonding Op = 0 (製品版) + ソフトウェア |     DSカード | TWLカード + ------------------------------------------------------------------------ + DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) + TWL用 | 不正カードフラグ立て | TWLカード読みシーケンス + ハイブリット | 不正カードフラグ立て | TWLカード読みシーケンス + + + + ■ Bonding Op = 0以外 (開発用) + ソフトウェア |     DSカード | TWLカード + ------------------------------------------------------------------------ + DS用 | DSカード読みシーケンス | DSカード読みシーケンス(※1) + TWL用 | DSカード読みシーケンス | TWLカード読みシーケンス + ハイブリット | DSカード読みシーケンス | TWLカード読みシーケンス + + + ※1 [TODO] 動作に関してはカードGと相談して決める + *---------------------------------------------------------------------------*/ +static BOOL isTwlModeLoad(void) +{ + // TWLカード + if(s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ + // PlatformCodeがTwl or Hybridの場合 + if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ + return TRUE; + } + else{ + // [TODO] 仕様確認 + return FALSE; + } + } + // DSカード + else{ + // 製品版の場合 + if(s_bondingOp == SCFG_OP_PRODUCT){ + // PlatformCodeがTwl or Hybridの場合 + if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ + s_cbData.illegalCardFlg = TRUE; + return FALSE; + } + else{ + return FALSE; + } + } + // 開発用の場合 + else{ + return FALSE; + } + } +} + + +/*---------------------------------------------------------------------------* + Name: HOTSWi_RefreshBadBlock + + Description: ノーマルモードまたはゲームモードでバッドブロックを置換 + *---------------------------------------------------------------------------*/ HotSwState HOTSWi_RefreshBadBlock(u32 romMode) { HotSwState retval = HOTSW_SUCCESS; - HotSwState state = HOTSW_SUCCESS; HotSwState (*pReadStatus)(CardBootData *cbd); HotSwState (*pRefreshBadBlock)(CardBootData *cbd); @@ -563,36 +602,37 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode) // ステータス対応ROMのみステータス読み込み if ( s_cbData.id_nml & HOTSW_ROMID_RFSSUP_MASK ) { - state = pReadStatus(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - // 要求レベルに関わらずバッドブロックを置換(製品カードでは滅多に発生しない) + retval = SelectErrorState(pReadStatus(&s_cbData), 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; + retval = SelectErrorState(pRefreshBadBlock(&s_cbData), retval); } } return retval; } -/* ----------------------------------------------------------------- - * HOTSW_GetRomEmulationBuffer関数 - * - * Romエミュレーション情報を格納しているバッファへのポインタを返す - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: HOTSW_GetRomEmulationBuffer + + Description: Romエミュレーション情報を格納しているバッファへのポインタを返す + *---------------------------------------------------------------------------*/ void* HOTSW_GetRomEmulationBuffer(void) { return s_cbData.romEmuBuf; } -/* ----------------------------------------------------------------- - * LoadBannerData関数 - * - * バナーデータを読み込む - * - * 注:一度カードブートしてゲームモードになってから呼び出してください - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: LoadBannerData + + Description: バナーデータを読み込む + + 注:ゲームモードになってから呼び出してください + *---------------------------------------------------------------------------*/ static HotSwState LoadBannerData(void) { BOOL state; @@ -637,29 +677,35 @@ static HotSwState LoadBannerData(void) return retval; } -/* ----------------------------------------------------------------- - * LoadStaticModule関数 - * - * ARM7,9の常駐モジュールを展開する関数 - * - * 注:一度カードブートしてゲームモードになってから呼び出してください - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: LoadStaticModule + + Description: ARM7,9の常駐モジュールを展開する関数 + + 注:ゲームモードになってから呼び出してください + *---------------------------------------------------------------------------*/ static HotSwState LoadStaticModule(void) { HotSwState retval = HOTSW_SUCCESS; HotSwState state = HOTSW_SUCCESS; - u32 arm9StcEnd = s_cbData.pBootSegBuf->rh.s.main_rom_offset + s_cbData.pBootSegBuf->rh.s.main_size; + u32 arm9StcEnd = s_cbData.pBootSegBuf->rh.s.main_rom_offset + s_cbData.pBootSegBuf->rh.s.main_size; + u32 arm9LtdStcEnd = s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + s_cbData.pBootSegBuf->rh.s.main_ltd_size; + u32 secure2SegEnd = (u32)(s_cbData.pBootSegBuf->rh.s.twl_card_keytable_area_rom_offset * TWLCARD_BORDER_OFFSET + SECURE_SEGMENT_SIZE); // 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送 s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg)){ if(arm9StcEnd > SECURE_SEGMENT_END){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), arm9StcEnd - SECURE_SEGMENT_END); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState( + ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, + (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), + arm9StcEnd - SECURE_SEGMENT_END), + retval); } } else{ - retval = HOTSW_BUFFER_OVERRUN_ERROR; + retval = SelectErrorState(HOTSW_BUFFER_OVERRUN_ERROR, retval); } if(retval != HOTSW_SUCCESS){ return retval; @@ -668,8 +714,11 @@ static HotSwState LoadStaticModule(void) // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC], s_cbData.twlFlg)){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState( + ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, + (u32 *)s_cbData.arm7Stc, + s_cbData.pBootSegBuf->rh.s.sub_size), + retval); } else{ retval = HOTSW_BUFFER_OVERRUN_ERROR; @@ -678,21 +727,22 @@ static HotSwState LoadStaticModule(void) return retval; } - - // [TODO] TWLカード対応 (※ 拡張領域の境界はRomHeaderの値で計算する) - if( s_cbData.twlFlg ) { - u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; + // 拡張常駐モジュールがあるかないか + if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset) { + u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE; s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address; - // 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送 + // 配置先と再配置情報を取得 & Arm9拡張常駐モジュールを指定先に転送 if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE)){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - + // DSカード読みシーケンスでここまで来ていたら、Secure2領域をGameモードのページ読み関数で読む + if(!s_cbData.isLoadTypeTwl){ + retval = SelectErrorState(ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size), retval); + } if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { - state = ReadPageGame(&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); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = SelectErrorState( + ReadPageGame(&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), + retval); } } else{ @@ -702,20 +752,22 @@ static HotSwState LoadStaticModule(void) if(retval != HOTSW_SUCCESS){ return retval; } - - // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 + + // 配置先と再配置情報を取得 & Arm7拡張常駐モジュールを指定先に転送 s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE)){ - state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + + retval = SelectErrorState( + ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size), + retval); } else{ - retval = HOTSW_BUFFER_OVERRUN_ERROR; + retval = SelectErrorState(HOTSW_BUFFER_OVERRUN_ERROR, retval); } if(retval != HOTSW_SUCCESS){ return retval; } - + // セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー { SVCHMACSHA1Context hash; @@ -736,45 +788,57 @@ static HotSwState LoadStaticModule(void) UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); } -//#define MY_DEBUG +#define MY_DEBUG #ifdef MY_DEBUG + { + BOOL flg = TRUE; + // Arm9常駐モジュール Hash値のチェック if(!CheckArm9HashValue()){ state = HOTSW_HASH_CHECK_ERROR; + flg = FALSE; OS_PutString("×Arm9 Static Module Hash Check Error...\n"); } // Arm7常駐モジュール Hash値のチェック if(!CheckArm7HashValue()){ state = HOTSW_HASH_CHECK_ERROR; - OS_PutString("×Arm7 Static Module Hash Check Error...\n"); + flg = FALSE; + OS_PutString("×Arm7 Static Module Hash Check Error...\n"); } // Arm9拡張常駐モジュール Hash値のチェック if(!CheckExtArm9HashValue()){ state = HOTSW_HASH_CHECK_ERROR; + flg = FALSE; OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); } // Arm7拡張常駐モジュール Hash値のチェック if(!CheckExtArm7HashValue()){ state = HOTSW_HASH_CHECK_ERROR; + flg = FALSE; OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); } retval = (retval == HOTSW_SUCCESS) ? state : retval; + + if(flg){ + OS_PutString("○ Static Module Load was Completed!!\n"); + } + + } #endif } return retval; } -/* ----------------------------------------------------------------- - * CheckCardAuthCode関数 - * - * Rom Headerの認証コードアドレスを読んで、クローンブート対応か判定する - * - * 注:カードブート処理中は呼び出さないようにする - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: CheckCardAuthCode + + Description: Rom Headerの認証コードアドレスを読んで、クローンブート対応か判定する + *---------------------------------------------------------------------------*/ static HotSwState CheckCardAuthCode(void) { u32 authBuf[PAGE_SIZE/sizeof(u32)]; @@ -802,13 +866,14 @@ static HotSwState CheckCardAuthCode(void) return retval; } -/* ----------------------------------------------------------------- - * HOTSW_SetBootSegmentBuffer関数 - * - * Boot Segment バッファの指定 - * - * 注:カードブート処理中は呼び出さないようにする - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: HOTSW_SetBootSegmentBuffer + + Description: Boot Segment バッファの指定 + + 注:カードデータロード中は呼び出さないようにする + *---------------------------------------------------------------------------*/ static void SetBootSegmentBuffer(void* buf, u32 size) { SDK_ASSERT(size > BOOT_SEGMENT_SIZE); @@ -822,13 +887,14 @@ static void SetBootSegmentBuffer(void* buf, u32 size) MI_CpuClear8(s_pBootSegBuffer, size); } -/* ----------------------------------------------------------------- - * HOTSW_SetSecureSegmentBuffer関数 - * - * Secure Segment バッファの指定 - * - * 注:カードブート処理中は呼び出さないようにする - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: HOTSW_SetSecureSegmentBuffer + + Description: Secure Segment バッファの指定 + + 注:カードデータロード中は呼び出さないようにする + *---------------------------------------------------------------------------*/ static void SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) { SDK_ASSERT(size > SECURE_SEGMENT_SIZE); @@ -853,11 +919,12 @@ static void SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) } } -/* ----------------------------------------------------------------- - * GenVA_VB_VD関数 - * - * コマンド認証値・コマンドカウンタ・PNジェネレータ初期値の生成 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: GenVA_VB_VD + + Description: コマンド認証値・コマンドカウンタ・PNジェネレータ初期値の生成 + *---------------------------------------------------------------------------*/ static void GenVA_VB_VD(void) { u32 dummy = 0; @@ -879,14 +946,14 @@ static void GenVA_VB_VD(void) s_cbData.vd &= 0xffffff; } -/* ----------------------------------------------------------------- - * DecryptObjectFile関数 - * - * セキュア領域先頭2KBの暗号化領域を復号化 - * - * 注:セキュアモード中、またはセキュアモード前にこの関数を呼ぶと、 - *   正常にコマンドの暗号化が行えなくなります。 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: DecryptObjectFile + + Description: セキュア領域先頭2KBの暗号化領域を復号化 + + 注:セキュア領域を読み込んでからこの関数を呼び出してください + *---------------------------------------------------------------------------*/ static u32 encDestBuf[ENCRYPT_DEF_SIZE/sizeof(u32)]; static HotSwState DecryptObjectFile(void) @@ -947,11 +1014,24 @@ static HotSwState DecryptObjectFile(void) return retval; } -/* ----------------------------------------------------------------- - * LockHotSwRsc関数 - * - * 共有ワークのリソースの排他制御用 lockを行う - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: SelectErrorState + + Description: これまでの状態(beforeState)に異常があったら、その状態を返り値とする。 + 異常がなければ新しい状態(nowState)を返り値とする。 + *---------------------------------------------------------------------------*/ +static HotSwState SelectErrorState(HotSwState nowState, HotSwState beforeState) +{ + return (beforeState == HOTSW_SUCCESS) ? nowState : beforeState; +} + + +/*---------------------------------------------------------------------------* + Name: LockHotSwRsc + + Description: 共有ワークのリソースの排他制御用 lockを行う + *---------------------------------------------------------------------------*/ static void LockHotSwRsc(OSLockWord* word) { while(OS_TryLockByWord( s_RscLockID, word, NULL ) != OS_LOCK_SUCCESS){ @@ -959,23 +1039,23 @@ static void LockHotSwRsc(OSLockWord* word) } } -/* ----------------------------------------------------------------- - * UnlockHotSwRsc関数 - * - * 共有ワークのリソースの排他制御用 Unlockを行う - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: UnlockHotSwRsc + + Description: 共有ワークのリソースの排他制御用 Unlockを行う + *---------------------------------------------------------------------------*/ static void UnlockHotSwRsc(OSLockWord* word) { OS_UnlockByWord( s_RscLockID, word, NULL ); } -/* ----------------------------------------------------------------- - * HOTSW_IsCardExist関数 - * - * カードの存在判定 - * - * ※SCFG_MC1のCDETフラグを見ている - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: HOTSW_IsCardExist + + Description: SCFG_MC1のCDETフラグを見て、カードの存在判定を行う + *---------------------------------------------------------------------------*/ BOOL HOTSW_IsCardExist(void) { #ifndef DEBUG_USED_CARD_SLOT_B_ @@ -992,13 +1072,12 @@ static void UnlockHotSwRsc(OSLockWord* word) } } -/* ----------------------------------------------------------------- - * HOTSW_IsCardAccessible関数 - * - * カードスロットにアクセスできる状態か判定する - * - * ※SCFG_MC1のCDETフラグとM(モード)を見ている - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: HOTSW_IsCardAccessible + + Description: SCFG_MC1のCDETフラグとM(モード)を見て、カードスロットにアクセスできる状態か判定する + *---------------------------------------------------------------------------*/ BOOL HOTSW_IsCardAccessible(void) { if( HOTSW_IsCardExist() && CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ @@ -1009,13 +1088,12 @@ BOOL HOTSW_IsCardAccessible(void) } } -/* ----------------------------------------------------------------- - * IsSwap関数 - * - * カードのスワップ判定 - * - * ※SCFG_MC1のSWPフラグを見ている - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: IsSwap + + Description: SCFG_MC1のSWPフラグを見て、スロットがスワップされているか判定する + *---------------------------------------------------------------------------*/ static BOOL IsSwap(void) { if( reg_MI_MC1 & REG_MI_MC1_SWP_MASK ){ @@ -1026,20 +1104,23 @@ static BOOL IsSwap(void) } } -/* ----------------------------------------------------------------- - * GetMcSlotShift関数 - * - * カードスロットのシフトビット数の取得 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: GetMcSlotShift + + Description: カードスロットのシフトビット数の取得 + *---------------------------------------------------------------------------*/ static u32 GetMcSlotShift(void) { return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); } -/* ----------------------------------------------------------------- - * GetMcSlotMask関数 - * - * カードスロットのシフトビット数の取得 - * ----------------------------------------------------------------- */ + + +/*---------------------------------------------------------------------------* + Name: GetMcSlotMask + + Description: カードスロットのシフトビット数の取得 + *---------------------------------------------------------------------------*/ static u32 GetMcSlotMask(void) { #ifndef DEBUG_USED_CARD_SLOT_B_ @@ -1049,11 +1130,12 @@ static u32 GetMcSlotMask(void) #endif } -/* ----------------------------------------------------------------- - * SetMcSlotMode関数 - * - * カードスロットのモード設定 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: SetMcSlotMode + + Description: カードスロットのモード設定 + *---------------------------------------------------------------------------*/ static void SetMcSlotMode(u32 mode) { #ifndef DEBUG_USED_CARD_SLOT_B_ @@ -1063,18 +1145,20 @@ static void SetMcSlotMode(u32 mode) #endif } -/* ----------------------------------------------------------------- - * CmpMcSlotMode関数 - * - * カードスロットのモード比較 - * ----------------------------------------------------------------- */ + +/*---------------------------------------------------------------------------* + Name: CmpMcSlotMode + + Description: 引数で与えられてモードと現在のカードスロットのモードを比較 + *---------------------------------------------------------------------------*/ static BOOL CmpMcSlotMode(u32 mode) { #ifndef DEBUG_USED_CARD_SLOT_B_ - if((reg_MI_MC1 & GetMcSlotMask()) == (mode << GetMcSlotShift())){ + if((reg_MI_MC1 & GetMcSlotMask()) == (mode << GetMcSlotShift())) #else - if((reg_MI_MC1 & GetMcSlotMask()) == (mode >> GetMcSlotShift())){ + if((reg_MI_MC1 & GetMcSlotMask()) == (mode >> GetMcSlotShift())) #endif + { return TRUE; } else{ @@ -1082,10 +1166,11 @@ static BOOL CmpMcSlotMode(u32 mode) } } + /*---------------------------------------------------------------------------* Name: McPowerOn - Description: スロット電源ON関数 + Description: スロット電源ON *---------------------------------------------------------------------------*/ static void McPowerOn(void) { @@ -1120,10 +1205,11 @@ static void McPowerOn(void) } } + /*---------------------------------------------------------------------------* Name: McPowerOff - Description: スロット電源OFF関数 + Description: スロット電源OFF *---------------------------------------------------------------------------*/ static void McPowerOff(void) { @@ -1143,6 +1229,7 @@ static void McPowerOff(void) } } + /*---------------------------------------------------------------------------* Name: SetMCSCR @@ -1174,18 +1261,19 @@ static void SetMCSCR(void) reg_HOTSW_MCCNT1 = SCR_MASK; } + /*---------------------------------------------------------------------------* - Name: McThread + Name: HotSwThread Description: カード抜け・挿し処理スレッド [TODO:]挿抜のフロー・フラグケアetcの確認(今の所、抜き挿ししてもタイトルが更新されない) *---------------------------------------------------------------------------*/ -static void McThread(void *arg) +static void HotSwThread(void *arg) { #pragma unused( arg ) - BOOL isPulledOut = TRUE; +// BOOL isPulledOut = TRUE; HotSwState retval; HotSwMessage *msg; @@ -1213,7 +1301,7 @@ static void McThread(void *arg) // カードが挿さってたら if(HOTSW_IsCardExist()){ // 前の状態が挿し - if(!isPulledOut){ + if(!s_IsPulledOut){ // 抜きがなかったか判定 if(CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ // フラグケア @@ -1229,8 +1317,6 @@ static void McThread(void *arg) SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE; UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - - OS_PutString("ok!\n"); break; } @@ -1258,12 +1344,16 @@ static void McThread(void *arg) MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize); MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); - + + if(retval == HOTSW_PULLED_OUT_ERROR){ + // 今のカードの状態を調べる + } + break; } // 状態フラグを更新 - isPulledOut = FALSE; + s_IsPulledOut = FALSE; } // カードが抜けてたら @@ -1283,7 +1373,7 @@ static void McThread(void *arg) MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); - isPulledOut = TRUE; + s_IsPulledOut = TRUE; break; } @@ -1292,6 +1382,67 @@ static void McThread(void *arg) } // while loop } + +/*---------------------------------------------------------------------------* + Name: MonitorThread + + Description: 実際のカード状態とHotSwThreadで状態を比べて、違いがあった場合は + メッセージを送る + + s_IsPulledOut : True -> カードなし HOTSW_IsCardExist : True -> カードあり + False -> カードあり False -> カードなし + *---------------------------------------------------------------------------*/ +static void MonitorThread(void *arg) +{ + #pragma unused( arg ) + + BOOL isPullOutNow; + + while(1){ + // [TODO] カードデータロード中は待機するようにする + OS_Sleep(CARD_EXIST_CHECK_INTERVAL); + + // 現在カードが抜けているか + isPullOutNow = !HOTSW_IsCardExist(); + + // 状態の比較 + if(s_IsPulledOut != isPullOutNow){ + OSIntrMode enabled = OS_DisableInterrupts(); + + // 本当は抜けてた場合 + if(isPullOutNow){ + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; + + // メッセージをキューの先頭に入れる + OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; + } + + // 本当は挿さっていた場合 + else{ + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; + + // メッセージをキューの先頭に入れる + OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + } + + (void)OS_RestoreInterrupts( enabled ); + + OS_PutString(">>> Card State Error\n"); + } + } +} + + /*---------------------------------------------------------------------------* Name: InterruptCallbackCard @@ -1312,6 +1463,7 @@ static void InterruptCallbackCard(void) OS_PutString("○\n"); } + /*---------------------------------------------------------------------------* Name: InterruptCallbackCardDet @@ -1319,6 +1471,8 @@ static void InterruptCallbackCard(void) *---------------------------------------------------------------------------*/ static void InterruptCallbackCardDet(void) { + CARDi_ResetSlotStatus(); + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; @@ -1332,6 +1486,7 @@ static void InterruptCallbackCardDet(void) OS_PutString("●\n"); } + /*---------------------------------------------------------------------------* Name: InterruptCallbackNDma @@ -1348,6 +1503,7 @@ static void InterruptCallbackNDma(void) OS_PutString("▽\n"); } + /*---------------------------------------------------------------------------* Name: InterruptCallbackPxi @@ -1372,6 +1528,7 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; } + /*---------------------------------------------------------------------------* Name: AllocateExCardBus @@ -1385,6 +1542,7 @@ static inline void SetExCardProcessor(MIProcessor proc) } #endif + /*---------------------------------------------------------------------------* Name: AllocateExCardBus @@ -1402,6 +1560,7 @@ static void AllocateExCardBus(void) #endif } + /*---------------------------------------------------------------------------* Name: FreeExCardBus @@ -1414,6 +1573,7 @@ static void FreeExCardBus(void) #endif } + /*---------------------------------------------------------------------------* Name: LockSlotB @@ -1424,6 +1584,7 @@ static s32 LockExCard(u16 lockID) return OS_LockByWord(lockID, (OSLockWord *)SLOT_B_LOCK_BUF, AllocateExCardBus); } + /*---------------------------------------------------------------------------* Name: UnlockSlotB @@ -1434,6 +1595,7 @@ static s32 UnlockExCard(u16 lockID) return OS_UnlockByWord(lockID, (OSLockWord *)SLOT_B_LOCK_BUF, FreeExCardBus); } + /*---------------------------------------------------------------------------* Name: SetInterruptCallback SetInterruptCallbackEx @@ -1452,6 +1614,7 @@ static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func ) (void)OS_EnableIrqMaskEx(intr_bit); } + /*---------------------------------------------------------------------------* Name: SetInterrupt @@ -1470,17 +1633,13 @@ static void SetInterrupt(void) #endif } -/* ----------------------------------------------------------------- - * CheckHashValue関数 - * - * 常駐モジュール・拡張常駐モジュールのハッシュを計算して、 - * カード内のハッシュ値と比べる。 - * ----------------------------------------------------------------- */ -#include -// ---------------------------------------------------------------------- -// Arm7常駐モジュールのハッシュチェック -// ---------------------------------------------------------------------- +#include +/*---------------------------------------------------------------------------* + Name: CheckArm7HashValue + + Description: Arm7常駐モジュールのハッシュチェック + *---------------------------------------------------------------------------*/ static BOOL CheckArm7HashValue(void) { u8 sha1data[DIGEST_SIZE_SHA1]; @@ -1499,11 +1658,14 @@ static BOOL CheckArm7HashValue(void) return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_static_digest ); } -// ---------------------------------------------------------------------- -// Arm9常駐モジュールのハッシュチェック -// -// ※ 先頭2Kの復号化が行われる前のデータのハッシュを比べる -// ---------------------------------------------------------------------- + +/*---------------------------------------------------------------------------* + Name: CheckArm9HashValue + + Description: Arm9常駐モジュールのハッシュチェック + + ※ 先頭2Kの復号化が行われる前のデータのハッシュを比べる + *---------------------------------------------------------------------------*/ static BOOL CheckArm9HashValue(void) { u8 sha1data[DIGEST_SIZE_SHA1]; @@ -1528,9 +1690,12 @@ static BOOL CheckArm9HashValue(void) return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_static_digest ); } -// ---------------------------------------------------------------------- -// Arm7拡張常駐モジュールのハッシュチェック -// ---------------------------------------------------------------------- + +/*---------------------------------------------------------------------------* + Name: CheckExtArm7HashValue + + Description: Arm7拡張常駐モジュールのハッシュチェック + *---------------------------------------------------------------------------*/ static BOOL CheckExtArm7HashValue(void) { u8 sha1data[DIGEST_SIZE_SHA1]; @@ -1549,9 +1714,12 @@ static BOOL CheckExtArm7HashValue(void) return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_ltd_static_digest ); } -// ---------------------------------------------------------------------- -// Arm9拡張常駐モジュールのハッシュチェック -// ---------------------------------------------------------------------- + +/*---------------------------------------------------------------------------* + Name: CheckExtArm9HashValue + + Description: Arm9拡張常駐モジュールのハッシュチェック + *---------------------------------------------------------------------------*/ static BOOL CheckExtArm9HashValue(void) { u8 sha1data[DIGEST_SIZE_SHA1]; @@ -1583,6 +1751,65 @@ static BOOL CheckExtArm9HashValue(void) return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest ); } + +/*---------------------------------------------------------------------------* + Name: HOTSW_CardIF_Polling + + Description: IFフラグをポーリングして活線挿抜処理を行う + + 活栓挿抜ではポーリングはダメ? + *---------------------------------------------------------------------------*/ +void HOTSW_CardIF_Polling(void) +{ + // 抜け + if(reg_OS_IF & OS_IE_CARD_B_IREQ){ + OSIntrMode enabled = OS_DisableInterrupts(); + + OS_PutString("pulled out\n"); + + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; + + // メッセージ送信 + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; + + reg_OS_IF |= OS_IE_CARD_B_DET; + + (void)OS_RestoreInterrupts( enabled ); + } + + // 挿し + if(reg_OS_IF & OS_IE_CARD_B_DET){ + OSIntrMode enabled = OS_DisableInterrupts(); + + OS_PutString("insert\n"); + + // カードライブラリ:挿抜回数インクリメント + CARDi_IncrementCount(); + + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; + + // メッセージ送信 + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + + reg_OS_IF |= OS_IE_CARD_B_IREQ; + + (void)OS_RestoreInterrupts( enabled ); + } +} + + + + // ************************************************************************** // // Debug用表示関数 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index e191b23d..23f643da 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -81,6 +81,7 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: ReadSegSecure_ROMEMU @@ -123,6 +124,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: SwitchONPNGSecure_ROMEMU @@ -135,6 +137,7 @@ HotSwState SwitchONPNGSecure_ROMEMU(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: SwitchOFFPNGSecure_ROMEMU @@ -147,6 +150,7 @@ HotSwState SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: ChangeModeSecure_ROMEMU @@ -179,6 +183,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd) return HOTSW_SUCCESS; } + // ■------------------------------------■ // ■ ゲームモードのコマンド ■ // ■------------------------------------■ diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/twl_blowfish_table.c b/build/libraries_sysmenu/hotsw/ARM7/src/twl_blowfish_table.c new file mode 100644 index 00000000..63d85e1f --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/src/twl_blowfish_table.c @@ -0,0 +1,282 @@ +/*---------------------------------------------------------------------------* + Project: TwlBrom - libraries - GCD + File: ds_blowfish_table.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + *---------------------------------------------------------------------------*/ +#include + + +const BLOWFISH_CTX HotSwBlowfishInitTableTWL = { + 0x05526369, 0x040B421F, 0x04DAE16B, 0x03222EFA, + 0x05EB3557, 0x0089EBE1, 0x03E13C75, 0x02BD8B6D, + 0x071E6069, 0x0406B0C5, 0x0737814E, 0x04357C20, + 0x06E70543, 0x02D6B325, 0x05F42EDC, 0x075FA408, + 0x058CB61F, 0x0005B115, + + 0x04FB84D7, 0x00835937, 0x074D69B0, 0x03092EF8, + 0x02C477AA, 0x02633C66, 0x021479EB, 0x02BE7290, + 0x04254FE3, 0x041A18DE, 0x0011129E, 0x019209F3, + 0x053751A3, 0x02B46D10, 0x02819FB4, 0x008B2FA5, + 0x0720D1F8, 0x0314C7A2, 0x04B9AE7B, 0x04168028, + 0x01AD742F, 0x02AA9574, 0x05A95800, 0x047A0DA5, + 0x0279F093, 0x06FAA890, 0x06A3A9BD, 0x061142AB, + 0x02D36BB5, 0x07D5B8CB, 0x01D5147F, 0x0185B4F2, + 0x04329CCE, 0x04B1B5D8, 0x06E13A40, 0x04F0898C, + 0x059B5707, 0x072D9FD8, 0x04A6A963, 0x0571C044, + 0x050B1D95, 0x06B8DE98, 0x0253CAFF, 0x040F93D5, + 0x024DE9A5, 0x016159BD, 0x04164C1E, 0x06039C0F, + 0x0162BB3A, 0x037A6F5F, 0x023E1F80, 0x01BEDC47, + 0x02E42CC4, 0x02BA1AD3, 0x009FCD4A, 0x01A09A64, + 0x03D5F72F, 0x002F16F7, 0x061523C2, 0x019EDE98, + 0x02FB4E21, 0x024ABA82, 0x035F324B, 0x043B186D, + 0x046FD0BA, 0x03D84F7D, 0x01519C5F, 0x054FC637, + 0x06443165, 0x00591465, 0x07D4856A, 0x05C847F1, + 0x0749E7A2, 0x017D80EC, 0x0111BF2F, 0x02C920BE, + 0x06D85623, 0x064ADF93, 0x03260CCC, 0x02C0F28D, + 0x005BBE0C, 0x0371F35E, 0x00407119, 0x06075C7B, + 0x06CB6DC2, 0x0031CB12, 0x05220DB5, 0x03D235D9, + 0x0736EB35, 0x0716448C, 0x02B9E4E9, 0x06C408D8, + 0x0282D902, 0x052586A3, 0x0775A47F, 0x056CA10B, + 0x028F164F, 0x03365948, 0x07BBDB4D, 0x034217C7, + 0x00FDF4DB, 0x0278BE82, 0x056B2EE3, 0x003A57F4, + 0x026E44DA, 0x0587D6DF, 0x0699B381, 0x05DD58DD, + 0x0099C34B, 0x07FE334F, 0x061682A1, 0x075F48DC, + 0x05A95910, 0x07C8D2F2, 0x0701F13E, 0x01F92114, + 0x051F55EB, 0x03158B95, 0x06A4CBEB, 0x0688C7D5, + 0x0439631E, 0x006448FE, 0x01AB7B3F, 0x03DCD3B0, + 0x0735B15D, 0x01045A14, 0x047CF4D0, 0x01BFE119, + 0x065976D4, 0x06BF4287, 0x0054D2BF, 0x037E281A, + 0x0474DC3E, 0x01DDF533, 0x07FD249E, 0x0696FF5C, + 0x06FC83EF, 0x00895986, 0x077FAD53, 0x02A0D475, + 0x0589CF47, 0x0463060D, 0x04F58C53, 0x018C0184, + 0x0416EF7F, 0x0148B8E7, 0x00665F46, 0x06B15F0E, + 0x07DD76B3, 0x07592BBE, 0x02C752F9, 0x035B639A, + 0x07B561AB, 0x055A02C1, 0x032C87F4, 0x074DF8C9, + 0x04DE7E08, 0x01779DD0, 0x04B0A183, 0x02CD73F1, + 0x015C106E, 0x070EEBBC, 0x0055BB03, 0x02651FA2, + 0x06CE6DD3, 0x065B3BAC, 0x05B18A61, 0x01843559, + 0x00F1600A, 0x035B2893, 0x0119BA0F, 0x0311E24C, + 0x0076A1DC, 0x075E5486, 0x02651C67, 0x02B0FAB2, + 0x029CED3A, 0x03E9DDAB, 0x03B35437, 0x03D30D6D, + 0x03629908, 0x070B253C, 0x0403FD6E, 0x0631AE1B, + 0x04C6E55B, 0x05CFEA46, 0x00F78239, 0x04C31E56, + 0x02AC48EA, 0x02DA5793, 0x07D7EE80, 0x01A58DD0, + 0x0440BC8E, 0x047FA958, 0x04A120AE, 0x07A48C2F, + 0x0490D631, 0x04205C1B, 0x074491E1, 0x03DC8737, + 0x05AA7B91, 0x028149A0, 0x02D15368, 0x02B857B2, + 0x03352071, 0x013F2B3F, 0x02A32234, 0x00AD5A5F, + 0x02C1BB07, 0x0746B1A8, 0x016F1BC5, 0x008EEC53, + 0x011F6374, 0x0236DEF8, 0x01F5F136, 0x015E1206, + 0x07E815F6, 0x042879C6, 0x033AD57D, 0x0558442A, + 0x0243F9F1, 0x00B50791, 0x04632BED, 0x008CE746, + 0x02BA47B9, 0x04DC953D, 0x0230C520, 0x028B8A44, + 0x034E4AAD, 0x05F4404A, 0x05C02F9A, 0x049C2098, + 0x05738F11, 0x07341FBB, 0x01845FDA, 0x043ED01F, + 0x0497A307, 0x055FF998, 0x04DDD428, 0x05DDFDA4, + 0x07442F72, 0x0607229D, 0x052FD116, 0x00E528D3, + 0x01E3D7AA, 0x02EBBA09, 0x06E3C252, 0x04F17067, + 0x070622BB, 0x0308860B, 0x039D045B, 0x04DD8848, + 0x01D9105D, 0x0389C9AA, 0x00B06AAE, 0x034DCAAC, + + 0x01C5E8E5, 0x02834663, 0x07BC04DB, 0x046C0F43, + 0x05795C2C, 0x00C3A9D0, 0x0698646D, 0x0441E7DA, + 0x0104EC07, 0x04CF09C4, 0x01FA3B1F, 0x07A3A818, + 0x00C3492F, 0x059E41C5, 0x020C91CC, 0x04F45D15, + 0x0462532F, 0x05B0B06B, 0x03B77F77, 0x071208FD, + 0x00BDB01C, 0x068A9386, 0x047F4C10, 0x0028A7F0, + 0x06A27510, 0x056F2B43, 0x0005764C, 0x056E9195, + 0x0267997F, 0x04018898, 0x0535EE95, 0x07027559, + 0x067491B6, 0x02F34209, 0x034E47BB, 0x02E492E6, + 0x013A1C03, 0x0253A5C4, 0x0664E84A, 0x0069A5E6, + 0x000D2E8F, 0x06C4DAA8, 0x06FA8774, 0x04D3A4C8, + 0x02ABC317, 0x05144060, 0x021120E9, 0x072E4B71, + 0x073C25AF, 0x0591407E, 0x00D96350, 0x02DF7B1D, + 0x0025231F, 0x03D6E660, 0x03DC62BF, 0x06F28B61, + 0x02AF873D, 0x077DBF4C, 0x06BC320E, 0x07D9B25B, + 0x079FF100, 0x035304BC, 0x06FB6C25, 0x017E04F0, + 0x04B879DA, 0x02472768, 0x06B05478, 0x07F9296D, + 0x06D3A241, 0x00E9D0EE, 0x06C4FF27, 0x055F65D9, + 0x02551093, 0x04067917, 0x038B524D, 0x07405D23, + 0x053FDCBE, 0x04A6A73D, 0x03529F18, 0x041DCA50, + 0x069A923E, 0x06564436, 0x003CA4E0, 0x07E422B6, + 0x059D37DA, 0x06E48164, 0x0137BA88, 0x038B9355, + 0x008E1D46, 0x005426EA, 0x06B67424, 0x02C58519, + 0x04AF2FE5, 0x0032FC6F, 0x006ED904, 0x0596BDC2, + 0x061A29F2, 0x023A9D03, 0x00439E06, 0x00348DD2, + 0x01DCF8CE, 0x075688E9, 0x04D29E0A, 0x03BD448C, + 0x05AB97F3, 0x050BE3BB, 0x05C07374, 0x01BEB46C, + 0x035D666C, 0x05A7A7FF, 0x0327E38A, 0x05802A3D, + 0x0145D043, 0x0444FF08, 0x03C2E090, 0x042EF1AB, + 0x0620D57B, 0x07F6E013, 0x06FBA530, 0x030C14A8, + 0x01215A38, 0x03BE914A, 0x05FFB3D2, 0x028478DC, + 0x0726564B, 0x00537D65, 0x006161DE, 0x07AEB02B, + 0x020D6D8E, 0x01C4FA66, 0x05F12500, 0x046868EF, + 0x02174F3B, 0x02255533, 0x071AE436, 0x014A54F7, + 0x07DB3334, 0x041BDA53, 0x0283D946, 0x053130DA, + 0x01ABA660, 0x07360D56, 0x0056855C, 0x00CE94BD, + 0x0406CDD9, 0x06E6E008, 0x004D36E0, 0x051C6286, + 0x0270346E, 0x05AD0969, 0x07D0E274, 0x00E5991E, + 0x0286B221, 0x056319CA, 0x0084E10B, 0x050CBD59, + 0x0683D539, 0x034B03AA, 0x069ADBB5, 0x013F16D2, + 0x01EA112A, 0x037C0DB8, 0x070F9266, 0x026BE5C1, + 0x04E4E47C, 0x021DC174, 0x049F4368, 0x030BA52B, + 0x04A7E825, 0x02869122, 0x02986850, 0x02501755, + 0x03B99C06, 0x00960EB8, 0x07DAFE1F, 0x03C1F644, + 0x0423E828, 0x032C4A38, 0x0602F748, 0x06AA625E, + 0x07587950, 0x02964BF0, 0x03A6B633, 0x03627E34, + 0x03BF74E4, 0x03DA2A2F, 0x04AAB440, 0x01028113, + 0x03860A5C, 0x04874576, 0x078C31ED, 0x0048BC9C, + 0x01544842, 0x019922EA, 0x03D13432, 0x072E4602, + 0x05947F38, 0x045059D9, 0x03BCB4B1, 0x04D1196E, + 0x003EA37F, 0x031AB679, 0x049F4941, 0x03B29D99, + 0x048F5356, 0x0776CD4B, 0x0313BA85, 0x0200BBA3, + 0x00B8AB81, 0x005AC364, 0x0454D94F, 0x0097FA8A, + 0x06CF6FF2, 0x02596050, 0x0542E364, 0x00CBF046, + 0x03D9624A, 0x05B68507, 0x04FC61A1, 0x05BE5A73, + 0x023ACFF7, 0x06CFCFE3, 0x02639FBA, 0x057B3C8F, + 0x017CFE6C, 0x01CB94D3, 0x0328D69B, 0x02ECFEE7, + 0x070258F0, 0x021799B6, 0x02FEB4CB, 0x0511A362, + 0x0089C6AB, 0x06A305D4, 0x05B8A852, 0x0231138C, + 0x03C30AB5, 0x043E510D, 0x06565249, 0x0421DCF4, + 0x04D58857, 0x05D10658, 0x05EEA869, 0x04404D1D, + 0x010E0C8F, 0x04B64F11, 0x005E881E, 0x0683A890, + 0x031B0717, 0x02A38461, 0x01EB6C9B, 0x055CE3B8, + 0x0414733D, 0x060C602F, 0x00F033FF, 0x05167B33, + + 0x04A9DC78, 0x0077F324, 0x03791527, 0x062A6309, + 0x03291611, 0x022F9818, 0x07452BDE, 0x06F92768, + 0x010C5DA6, 0x07675065, 0x0332B09A, 0x00856009, + 0x02993788, 0x06F81E49, 0x0036CA92, 0x07AA2EEA, + 0x0458BD2F, 0x004DD8AC, 0x026BEC7E, 0x03278664, + 0x075581CF, 0x01E96321, 0x0113EE6C, 0x04303FCB, + 0x0242F3CA, 0x00B08BDD, 0x050F5CF8, 0x0504A197, + 0x07FE5BFB, 0x07BDF90B, 0x01C65BB1, 0x00921436, + 0x007202F5, 0x04CA4249, 0x034FB69E, 0x0283DB7B, + 0x03C7C61A, 0x06B3EA14, 0x077B885A, 0x07752D31, + 0x037ED1C8, 0x04A5CE3D, 0x06D3F995, 0x00DCC24B, + 0x047072D0, 0x01C166DB, 0x01860647, 0x07489365, + 0x00EE5F88, 0x063F8882, 0x06D77198, 0x0145A590, + 0x0291187A, 0x006E4606, 0x069550A6, 0x06224C8C, + 0x068BB1CE, 0x01519F5D, 0x01F1A883, 0x06309385, + 0x06C653E2, 0x01AB6E47, 0x0541D01E, 0x00A21869, + 0x038F42FA, 0x04F8BCE5, 0x07AC3407, 0x049FC3B5, + 0x07F4902B, 0x03CF9275, 0x05526F3D, 0x05E28B23, + 0x00EEEA3A, 0x03982C33, 0x04124282, 0x0396F250, + 0x0195A14C, 0x072E5EAE, 0x00E6E717, 0x003DC85E, + 0x038B6FF8, 0x04C7B6FE, 0x076F853B, 0x05BAA978, + 0x030EDF53, 0x04F1AEAB, 0x03A3D1B0, 0x0207BA9D, + 0x03928189, 0x006E3DFD, 0x012EDB63, 0x062116C3, + 0x0786305B, 0x065C3FAD, 0x044AE49B, 0x0431138D, + 0x068963C6, 0x07CDC08C, 0x0179CBEE, 0x04E823B2, + 0x03F919C6, 0x04B360F1, 0x06E5AC3C, 0x0540C334, + 0x06A9102C, 0x061CB509, 0x013B8536, 0x00D5B3D6, + 0x04838C80, 0x066308A8, 0x076AE7EA, 0x0613968A, + 0x054EC14E, 0x05BC0854, 0x034602A9, 0x068FB55C, + 0x04D5A55B, 0x02FC18B0, 0x044B9B70, 0x05BF28AF, + 0x07FE89F2, 0x0452207A, 0x03AFAA4F, 0x0288FEA8, + 0x0426C60C, 0x034D6F1D, 0x053EA274, 0x06F5631E, + 0x0349AF3E, 0x048ABC15, 0x026E0937, 0x03C69B8B, + 0x03CA94DE, 0x02F36D84, 0x01ABC96A, 0x01C5C9E1, + 0x05B3C1A6, 0x0025E14B, 0x033E0FD8, 0x07BABDEF, + 0x06FFC780, 0x02ED1E95, 0x04B92564, 0x075B4238, + 0x078FEF49, 0x04A1024B, 0x00AA6C24, 0x01310C32, + 0x067B8D0D, 0x059D38EC, 0x06411603, 0x039D4F50, + 0x0003471B, 0x002F1F45, 0x027AF1F8, 0x061E6850, + 0x055AB734, 0x036E99E3, 0x07014475, 0x069B10C3, + 0x068BE51A, 0x02C006C5, 0x0288E7B8, 0x075B45DB, + 0x016F1C65, 0x03465E48, 0x043C68CA, 0x05E77E8D, + 0x0051F731, 0x012DC2FF, 0x01C11914, 0x02ADA6A1, + 0x02456B10, 0x0365049F, 0x013F80A6, 0x03B4AD28, + 0x01C480E2, 0x06C2F6DB, 0x06512084, 0x00E5DC11, + 0x02DC1915, 0x01840696, 0x034087A0, 0x07C40C20, + 0x03963E03, 0x062BAEE1, 0x07BC9556, 0x02DF2044, + 0x009823EE, 0x027671B0, 0x051C0806, 0x0479E463, + 0x0241414B, 0x0524582B, 0x06077E70, 0x02969905, + 0x01480578, 0x02AF230F, 0x07A9D824, 0x03955F39, + 0x04416164, 0x035E768D, 0x02DBEB41, 0x031AC25E, + 0x01B43DA1, 0x040FF3CC, 0x02B93B42, 0x00D0CD63, + 0x05C34037, 0x05E17F9D, 0x06D4006B, 0x06216274, + 0x00536CF2, 0x003C9402, 0x006B6BCA, 0x02C4975A, + 0x022B10A4, 0x05711925, 0x0155CE98, 0x038C6B67, + 0x02A06A0C, 0x060FAC1C, 0x02AB5B25, 0x038FB9A3, + 0x011261EC, 0x00A391B5, 0x07DB8671, 0x04FA631C, + 0x0739EFBE, 0x06EDC12A, 0x04F4C770, 0x003DD114, + 0x00888C03, 0x00FFF95C, 0x02EFBD4E, 0x029C2CCC, + 0x02D3F3C3, 0x029B853C, 0x02603C10, 0x00F8431D, + 0x03250BE4, 0x0460FEF8, 0x0250E2D5, 0x0439722E, + 0x02513A6E, 0x05D82FCD, 0x064894C2, 0x05492769, + 0x03266680, 0x047E0475, 0x02FA0EB6, 0x06BA3C61, + 0x047FA9A9, 0x02C1A9FE, 0x025ACFB7, 0x02985ED2, + + 0x04441BAC, 0x060D6E18, 0x04D5A4D7, 0x042A7F2E, + 0x06902DAB, 0x00E87B20, 0x017F6ECE, 0x0134312A, + 0x054D7CCE, 0x04C49F48, 0x03E33BA0, 0x00990CF1, + 0x00BD21BD, 0x01466B0D, 0x0702E278, 0x038ED06C, + 0x04BC7EB9, 0x07D59BF7, 0x04572039, 0x02C0EF14, + 0x00B3DEDC, 0x0560B71B, 0x04EE3D97, 0x018816E1, + 0x06185D9B, 0x01D91E3E, 0x0333A02E, 0x0287192F, + 0x02052CC5, 0x06E702F5, 0x044385D7, 0x03C0D8EC, + 0x03EAA772, 0x0495D684, 0x029CBCAD, 0x051DB4F4, + 0x0413BD8A, 0x057B06E4, 0x02650B62, 0x04683194, + 0x07CDCE28, 0x05815B81, 0x02BF630C, 0x0408C8CD, + 0x07F1D99C, 0x04D9DB4D, 0x07E2FCA1, 0x067F15BE, + 0x034C32D2, 0x07A5E06F, 0x0349D642, 0x06475323, + 0x05104EAB, 0x04FD4462, 0x03750461, 0x02B1D943, + 0x061EA9C7, 0x067BC97D, 0x02619A6B, 0x0654F1A7, + 0x0153E670, 0x00E597C0, 0x05F234AB, 0x04F7C459, + 0x026DD557, 0x06A0FC01, 0x0705E313, 0x05056DFE, + 0x018DD524, 0x033F7EBE, 0x02075A2E, 0x05BF99F2, + 0x00AA1078, 0x00C6B82E, 0x0194A559, 0x06AC62BB, + 0x03187480, 0x024316BE, 0x035B674C, 0x069C78DA, + 0x0698BE5B, 0x079353F3, 0x02AE3CD4, 0x00CAC9D4, + 0x006DBF93, 0x061BCE6F, 0x04B74C88, 0x07E0113E, + 0x013EC74C, 0x035AD6BE, 0x0360215D, 0x07F3B0E0, + 0x01B37B6A, 0x05B2A0CC, 0x03D32F5D, 0x016BB94D, + 0x01A374D1, 0x06A8F973, 0x0181AC19, 0x04176B01, + 0x0785C98E, 0x0013DB53, 0x075247CE, 0x0767FF49, + 0x00B29434, 0x061FDEB3, 0x05C57CF0, 0x07D1FDA2, + 0x030968E5, 0x01C01BA4, 0x03BAC374, 0x0744CDE1, + 0x07E9CDBA, 0x0199E71A, 0x012481EA, 0x07D1712E, + 0x01CD4CCB, 0x01377B6D, 0x05605B0E, 0x002FEAD2, + 0x02B2337B, 0x07622D30, 0x00A04AD9, 0x02D3BE46, + 0x07F02949, 0x0424A261, 0x076585B5, 0x078816BE, + 0x07154117, 0x01C11842, 0x050029F9, 0x07928B4E, + 0x04F89976, 0x0458082C, 0x0119CF5D, 0x01B54C8A, + 0x04F5282C, 0x02095F82, 0x01DFDB26, 0x06B7BC89, + 0x0582A656, 0x075A623D, 0x04BDB794, 0x0637A962, + 0x057A662D, 0x046B8EC7, 0x0621680F, 0x025175A7, + 0x0021CB4A, 0x009B3215, 0x015F1CAD, 0x06589BDD, + 0x06C0168B, 0x0362B7F9, 0x07300782, 0x06B22353, + 0x06540788, 0x01160327, 0x023E8711, 0x05014033, + 0x000405D7, 0x028C4AD2, 0x0236D242, 0x05F2E721, + 0x067CF60A, 0x05BB8ACD, 0x0060EF1A, 0x05AC708E, + 0x07E2BC7D, 0x07C99786, 0x00E49260, 0x01E5411A, + 0x047D51FB, 0x05CD01A8, 0x071081EB, 0x04CD0F64, + 0x039818D2, 0x0333096C, 0x04B686D1, 0x0399D633, + 0x0774C73D, 0x07CE7E4A, 0x03E8FB45, 0x07F00496, + 0x07909622, 0x047701B7, 0x0527C8D1, 0x07E9318D, + 0x00629C06, 0x00C79873, 0x024C1C1C, 0x0743B797, + 0x05B1E662, 0x01542F00, 0x02AC058C, 0x0178AE04, + 0x0153DC07, 0x07D617F5, 0x05BC22B3, 0x054658D6, + 0x07E328D1, 0x04769750, 0x041DCC6A, 0x04C55E9F, + 0x025F562F, 0x012AD3D9, 0x07E16C24, 0x079177C2, + 0x04FCA8EF, 0x02D93386, 0x05161E69, 0x06B39D9D, + 0x008699E0, 0x0405519F, 0x029FB6BA, 0x038F33FF, + 0x0443ED1D, 0x04608C08, 0x02426B87, 0x0662A078, + 0x05A748EC, 0x0305A6CE, 0x04E1841B, 0x0171FE26, + 0x057ADCFA, 0x00F46C0A, 0x00052EC8, 0x051F0984, + 0x06E385FF, 0x01173F10, 0x05166DF2, 0x07793AE8, + 0x013C3393, 0x006135F5, 0x06C00900, 0x04D5F763, + 0x02C7993D, 0x07049AEE, 0x0272F2BD, 0x021D5CB5, + 0x05A53EFE, 0x06466AB1, 0x077FDD2B, 0x03976DA3, + 0x05EEBAC3, 0x0315E29B, 0x000D8D97, 0x00E0292F, + 0x01AC4A30, 0x05D468EA, 0x07F92E7A, 0x04790EB8, + 0x00416DE1, 0x01C0269C, 0x06564FC0, 0x064D8FD1 +}; diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 9f90e5bd..995b2ce0 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -63,6 +63,9 @@ BOOL HOTSW_IsCardExist(void); // カードにアクセスできる状態か判定 BOOL HOTSW_IsCardAccessible(void); +// デバッグ用 +void HOTSW_CardIF_Polling(void); + // Romエミュレーション情報を格納しているバッファのポインタを返す #ifdef SDK_ARM7 void* HOTSW_GetRomEmulationBuffer(void);