diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h index b3bab430..adafdb6e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h @@ -18,35 +18,35 @@ extern "C" { // ■ ノーマルモードのコマンド ■ // DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み -void ReadBootSegNormal_DSType1(CardBootData *cbd); +HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd); // DSカードType1のノーマルモードのモード変更 -void ChangeModeNormal_DSType1(CardBootData *cbd); +HotSwState ChangeModeNormal_DSType1(CardBootData *cbd); // ■ セキュアモードのコマンド ■ // DSカードType1のセキュアモードのID読み込み -void ReadIDSecure_DSType1(CardBootData *cbd); +HotSwState ReadIDSecure_DSType1(CardBootData *cbd); // DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み -void ReadSegSecure_DSType1(CardBootData *cbd); +HotSwState ReadSegSecure_DSType1(CardBootData *cbd); // DSカードType1のセキュアモードのPNジェネレータON -void SwitchONPNGSecure_DSType1(CardBootData *cbd); +HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd); // DSカードType1のセキュアモードのPNジェネレータOFF -void SwitchOFFPNGSecure_DSType1(CardBootData *cbd); +HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd); // DSカードType1のセキュアモードのモード変更 -void ChangeModeSecure_DSType1(CardBootData *cbd); +HotSwState ChangeModeSecure_DSType1(CardBootData *cbd); // ■ ゲームモードのコマンド ■ // DSカードType1のゲームモードのID読み込み -void ReadIDGame_DSType1(CardBootData *cbd); +HotSwState ReadIDGame_DSType1(CardBootData *cbd); // DSカードType1のゲームモードの指定ページ読み込み -void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size); +HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size); #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h index 89e6bed7..bee08e2b 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h @@ -17,7 +17,7 @@ extern "C" { // =========================================================================== // ■ ノーマルモードのコマンド ■ // DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み -void ReadBootSegNormal_DSType2(CardBootData *cbd); +HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd); // DSカードType2のノーマルモードのモード変更 (Type1と同じ処理) #define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1 @@ -25,19 +25,19 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd); // ■ セキュアモードのコマンド ■ // DSカードType2のセキュアモードのID読み込み -void ReadIDSecure_DSType2(CardBootData *cbd); +HotSwState ReadIDSecure_DSType2(CardBootData *cbd); // DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み -void ReadSegSecure_DSType2(CardBootData *cbd); +HotSwState ReadSegSecure_DSType2(CardBootData *cbd); // DSカードType2のセキュアモードのPNジェネレータON -void SwitchONPNGSecure_DSType2(CardBootData *cbd); +HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd); // DSカードType2のセキュアモードのPNジェネレータOFF -void SwitchOFFPNGSecure_DSType2(CardBootData *cbd); +HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd); // DSカードType2のセキュアモードのモード変更 -void ChangeModeSecure_DSType2(CardBootData *cbd); +HotSwState ChangeModeSecure_DSType2(CardBootData *cbd); // ■ ゲームモードのコマンド ■ @@ -45,7 +45,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd); #define ReadIDGame_DSType2 ReadIDGame_DSType1 // DSカードType2のゲームモードの指定ページ読み込み -void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size); +HotSwState ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size); //#define ReadPageGame_DSType2 ReadPageGame_DSType1 #ifdef __cplusplus diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 5c2e3626..c928aff9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -161,13 +161,13 @@ typedef enum CardTypeEx{ DS_CARD_TYPE_2, TWL_CARD, ROM_EMULATION -}CardTypeEx; +} CardTypeEx; typedef enum NormalCommandType{ RD_ID = 0, RD_BSEG, CHG_MODE -}NormalCommandType; +} NormalCommandType; typedef enum SecureCommandType{ S_RD_ID = 0, @@ -175,34 +175,44 @@ typedef enum SecureCommandType{ S_PNG_ON, S_PNG_OFF, S_CHG_MODE -}SecureCommandType; +} SecureCommandType; typedef enum GameCommandType{ G_RD_ID = 0, G_RD_PAGE -}GameCommandType; +} GameCommandType; typedef enum CardType{ CARD_DS_TYPE1 = 0, CARD_DS_TYPE2, CARD_TWL -}CardType; +} CardType; + +typedef enum HotSwState{ + HOTSW_SUCCESS = 0, + HOTSW_TIME_OUT, + HOTSW_CARD_LOCK_ERROR, + HOTSW_CRC_CHECK_ERROR, + HOTSW_HASH_CHECK_ERROR, + HOTSW_ID_CHECK_ERROR, + HOTSW_PULLED_OUT_ERROR, + HOTSW_INSERT_COUNT_ERROR, + HOTSW_UNEXPECTED_ERROR +} HotSwState; // union --------------------------------------------------------------------- typedef union { u64 dw; u8 b[8]; -} -GCDCmd64; +} GCDCmd64; // ブートセグメントデータ typedef union BootSegmentData { ROM_Header rh; u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)]; -} -BootSegmentData; +} BootSegmentData; // struct ------------------------------------------------------------------- typedef struct BLOWFISH_CTX{ @@ -246,23 +256,21 @@ typedef struct CardBootData{ u32 *pSecureSegBuf; BLOWFISH_CTX keyTable; -} -CardBootData; +} CardBootData; // カード起動用関数 typedef struct CardBootFunction { - void (*ReadBootSegment_N)(CardBootData *cbd); - void (*ChangeMode_N)(CardBootData *cbd); + HotSwState (*ReadBootSegment_N)(CardBootData *cbd); + HotSwState (*ChangeMode_N)(CardBootData *cbd); - void (*ReadID_S)(CardBootData *cbd); - void (*ReadSegment_S)(CardBootData *cbd); - void (*SetPNG_S)(CardBootData *cbd); - void (*ChangeMode_S)(CardBootData *cbd); + HotSwState (*ReadID_S)(CardBootData *cbd); + HotSwState (*ReadSegment_S)(CardBootData *cbd); + HotSwState (*SetPNG_S)(CardBootData *cbd); + HotSwState (*ChangeMode_S)(CardBootData *cbd); - void (*ReadID_G)(CardBootData *cbd); - void (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); -} -CardBootFunction; + HotSwState (*ReadID_G)(CardBootData *cbd); + HotSwState (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size); +} CardBootFunction; diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h b/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h index f534ccae..ab1b30a6 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h @@ -18,35 +18,35 @@ extern "C" { // ■ ノーマルモードのコマンド ■ // Rom EmulationのノーマルモードのBoot Segment(4Kbyte)読み込み -void ReadBootSegNormal_ROMEMU(CardBootData *cbd); +HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd); // Rom Emulationのノーマルモードのモード変更 -void ChangeModeNormal_ROMEMU(CardBootData *cbd); +HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd); // ■ セキュアモードのコマンド ■ // Rom EmulationのセキュアモードのID読み込み -void ReadIDSecure_ROMEMU(CardBootData *cbd); +HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd); // Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み -void ReadSegSecure_ROMEMU(CardBootData *cbd); +HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd); // Rom EmulationのセキュアモードのPNジェネレータON -void SwitchONPNGSecure_ROMEMU(CardBootData *cbd); +HotSwState SwitchONPNGSecure_ROMEMU(CardBootData *cbd); // Rom EmulationのセキュアモードのPNジェネレータOFF -void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd); +HotSwState SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd); // Rom Emulationのセキュアモードのモード変更 -void ChangeModeSecure_ROMEMU(CardBootData *cbd); +HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd); // ■ ゲームモードのコマンド ■ // DSカードType1のゲームモードのID読み込み -void ReadIDGame_ROMEMU(CardBootData *cbd); +HotSwState ReadIDGame_ROMEMU(CardBootData *cbd); // DSカードType1のゲームモードの指定ページ読み込み -void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size); +HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size); #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 60deeec8..2fb45049 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -34,8 +34,12 @@ static void SetMCSCR(void); * * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page *---------------------------------------------------------------------------*/ -void ReadBootSegNormal_DSType1(CardBootData *cbd) +HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE ); @@ -51,6 +55,8 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -60,11 +66,15 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd) * * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ -void ChangeModeNormal_DSType1(CardBootData *cbd) +HotSwState ChangeModeNormal_DSType1(CardBootData *cbd) { GCDCmd64 tempCnd, cnd; u64 vae64 = cbd->vae; + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // ゼロクリア MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); @@ -92,6 +102,8 @@ void ChangeModeNormal_DSType1(CardBootData *cbd) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } @@ -162,8 +174,12 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status *---------------------------------------------------------------------------*/ -void ReadIDSecure_DSType1(CardBootData *cbd) +HotSwState ReadIDSecure_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); @@ -180,6 +196,8 @@ void ReadIDSecure_DSType1(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -187,7 +205,7 @@ void ReadIDSecure_DSType1(CardBootData *cbd) * * Description: *---------------------------------------------------------------------------*/ -void ReadSegSecure_DSType1(CardBootData *cbd) +HotSwState ReadSegSecure_DSType1(CardBootData *cbd) { u32 i,j=0; u64 segNum = 4; @@ -195,6 +213,10 @@ void ReadSegSecure_DSType1(CardBootData *cbd) GCDCmd64 cndLE, cndBE; for(i=0; i<4; i++){ + if(!HOTSW_IsCardExist()){ + 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 ); @@ -236,6 +258,8 @@ void ReadSegSecure_DSType1(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; } + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -243,8 +267,12 @@ void ReadSegSecure_DSType1(CardBootData *cbd) * * Description: *---------------------------------------------------------------------------*/ -void SwitchONPNGSecure_DSType1(CardBootData *cbd) +HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // コマンド作成・設定 SetSecureCommand(S_PNG_ON, cbd); @@ -257,6 +285,8 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -264,8 +294,12 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd) * * Description: *---------------------------------------------------------------------------*/ -void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) +HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // コマンド作成・設定 SetSecureCommand(S_PNG_OFF, cbd); @@ -278,6 +312,8 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -287,8 +323,12 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ -void ChangeModeSecure_DSType1(CardBootData *cbd) +HotSwState ChangeModeSecure_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // コマンド作成・設定 SetSecureCommand(S_CHG_MODE, cbd); @@ -301,6 +341,8 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } @@ -312,8 +354,12 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) * * Description: ゲームモードでIDを読み込む *---------------------------------------------------------------------------*/ -void ReadIDGame_DSType1(CardBootData *cbd) +HotSwState ReadIDGame_DSType1(CardBootData *cbd) { + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); @@ -327,6 +373,8 @@ void ReadIDGame_DSType1(CardBootData *cbd) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -334,7 +382,7 @@ void ReadIDGame_DSType1(CardBootData *cbd) Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む *---------------------------------------------------------------------------*/ -void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size) +HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { u32 loop, counter=0; u64 i, page; @@ -348,6 +396,10 @@ void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; ipBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); @@ -80,6 +84,8 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd) page++; } + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -159,10 +165,16 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status *---------------------------------------------------------------------------*/ -void ReadIDSecure_DSType2(CardBootData *cbd) +HotSwState ReadIDSecure_DSType2(CardBootData *cbd) { + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // スクランブルの設定 - u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + 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) ); @@ -188,6 +200,8 @@ void ReadIDSecure_DSType2(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -197,7 +211,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page *---------------------------------------------------------------------------*/ -void ReadSegSecure_DSType2(CardBootData *cbd) +HotSwState ReadSegSecure_DSType2(CardBootData *cbd) { u32 i,j=0,k; u64 segNum = 4; @@ -208,6 +222,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd) u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); for(i=0; ivbi++; } + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -272,10 +292,16 @@ void ReadSegSecure_DSType2(CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ -void SwitchONPNGSecure_DSType2(CardBootData *cbd) +HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd) { + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // スクランブルの設定 - u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); // コマンド作成・設定 SetSecureCommand(S_PNG_ON, cbd); @@ -298,6 +324,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -307,10 +335,16 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ -void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) +HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd) { + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // スクランブルの設定 - u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); // コマンド作成・設定 SetSecureCommand(S_PNG_OFF, cbd); @@ -333,6 +367,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -342,10 +378,16 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) * * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ -void ChangeModeSecure_DSType2(CardBootData *cbd) +HotSwState ChangeModeSecure_DSType2(CardBootData *cbd) { + u32 scrambleMask; + + if(!HOTSW_IsCardExist()){ + return HOTSW_PULLED_OUT_ERROR; + } + // スクランブルの設定 - u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); // コマンド作成・設定 SetSecureCommand(S_CHG_MODE, cbd); @@ -368,6 +410,8 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; + + return HOTSW_SUCCESS; } @@ -389,7 +433,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) * * CT=150ns Latency1=0x657 Latency2=0x1 Pagecount=1page *---------------------------------------------------------------------------*/ -void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size) +HotSwState ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { u32 loop, counter=0; u64 i, page; @@ -403,6 +447,10 @@ void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; ilockCardRsc, NULL ); // ARM9と排他制御する // Boot Segment読み込み - s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); // Romエミュレーション情報を取得 - ReadRomEmulationData(); + retval = ReadRomEmulationData(); // 取得したRomエミュレーション情報を比較 s_cbData.debuggerFlg = TRUE; @@ -372,14 +348,14 @@ BOOL HOTSW_LoadCardData(void) if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ - retval = FALSE; + retval = HOTSW_CRC_CHECK_ERROR; } (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する OS_ReleaseLockID( id ); } - if( retval ) { + if( retval == HOTSW_SUCCESS ) { // NTRカードかTWLカードか if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ // OS_TPrintf("TWL Card.\n"); @@ -400,41 +376,49 @@ BOOL HOTSW_LoadCardData(void) GenVA_VB_VD(); // セキュアモードに移行 - s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData); + if(retval != HOTSW_SUCCESS){ + return retval; + } + // ---------------------- Secure Mode ---------------------- // PNG設定 - s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); + retval = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); // DS側符号生成回路初期値設定 (レジスタ設定) SetMCSCR(); // ID読み込み - s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_nml != s_cbData.id_scr){ - return FALSE; + return HOTSW_ID_CHECK_ERROR; } // Secure領域のSegment読み込み - s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); // ゲームモードに移行 - s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); + if(retval != HOTSW_SUCCESS){ + return retval; + } + // ---------------------- Game Mode ---------------------- // ID読み込み - s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); + retval = s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); // カードIDの比較をして、一致しなければFALSEを返す if(s_cbData.id_scr != s_cbData.id_gam){ - return FALSE; + return HOTSW_ID_CHECK_ERROR; } // 常駐モジュール残りを指定先に転送 - HOTSW_LoadStaticModule(); - + retval = LoadStaticModule(); + // ARM9常駐モジュールの先頭2KBの暗号化領域を複合化 DecryptObjectFile(); } @@ -445,11 +429,9 @@ BOOL HOTSW_LoadCardData(void) #else OS_UnlockCard(s_cbData.lockID); #endif -// OS_TPrintf("-----------------------------------------------\n"); } else{ -// OS_TPrintf("Card Not Found\n"); - retval = FALSE; + retval = HOTSW_PULLED_OUT_ERROR; } // カードロックIDの開放 @@ -471,25 +453,32 @@ void* HOTSW_GetRomEmulationBuffer(void) } /* ----------------------------------------------------------------- - * HOTSW_LoadStaticModule関数 + * LoadStaticModule関数 * * ARM7,9の常駐モジュールを展開する関数 * * 注:一度カードブートしてゲームモードになってから呼び出してください * ----------------------------------------------------------------- */ -void HOTSW_LoadStaticModule(void) +static HotSwState LoadStaticModule(void) { + HotSwState retval = HOTSW_SUCCESS; + #ifdef DEBUG_USED_CARD_SLOT_B_ // バナーリード if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { // OS_TPrintf(" - Banner Loading...\n"); - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + retval = s_funcTable[s_cbData.cardType].ReadPage_G( + &s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset, (u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile) ); } - - if(IsCardExist()) + + if(retval != HOTSW_SUCCESS){ + return retval; + } + + if(HOTSW_IsCardExist()) { SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE; SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; @@ -501,18 +490,26 @@ void HOTSW_LoadStaticModule(void) s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address; // 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg); - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, - s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, - (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), - s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE); + retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, + (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), + s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE); + + if(retval != HOTSW_SUCCESS){ + return retval; + } s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address; // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg); - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, - s_cbData.pBootSegBuf->rh.s.sub_rom_offset, - (u32 *)s_cbData.arm7Stc, - s_cbData.pBootSegBuf->rh.s.sub_size); + retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.sub_rom_offset, + (u32 *)s_cbData.arm7Stc, + s_cbData.pBootSegBuf->rh.s.sub_size); + + if(retval != HOTSW_SUCCESS){ + return retval; + } // TWLでのみロード if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) { @@ -521,26 +518,33 @@ void HOTSW_LoadStaticModule(void) s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address; // 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!) SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE); - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, - s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, - (u32 *)SYSM_CARD_TWL_SECURE_BUF, - size); + retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, + (u32 *)SYSM_CARD_TWL_SECURE_BUF, + size); if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) { - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, - 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 = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE, + (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), + s_cbData.pBootSegBuf->rh.s.main_ltd_size - size); } + if(retval != HOTSW_SUCCESS){ + return retval; + } + s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address; // 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送 SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE); - s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, - s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, - (u32 *)s_cbData.arm7Ltd, - s_cbData.pBootSegBuf->rh.s.sub_ltd_size); - + retval = s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData, + s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, + (u32 *)s_cbData.arm7Ltd, + s_cbData.pBootSegBuf->rh.s.sub_ltd_size); + if(retval != HOTSW_SUCCESS){ + return retval; + } + // セキュア領域先頭2K分のハッシュ値を求めて、Work領域にコピー { u8 sha1data[DIGEST_SIZE_SHA1]; @@ -561,24 +565,30 @@ void HOTSW_LoadStaticModule(void) // Arm9常駐モジュール Hash値のチェック if(!CheckArm9HashValue()){ + retval = HOTSW_HASH_CHECK_ERROR; OS_PutString("×Arm9 Static Module Hash Check Error...\n"); } // Arm7常駐モジュール Hash値のチェック if(!CheckArm7HashValue()){ + retval = HOTSW_HASH_CHECK_ERROR; OS_PutString("×Arm7 Static Module Hash Check Error...\n"); } // Arm9拡張常駐モジュール Hash値のチェック if(!CheckExtArm9HashValue()){ + retval = HOTSW_HASH_CHECK_ERROR; OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n"); } // Arm7拡張常駐モジュール Hash値のチェック if(!CheckExtArm7HashValue()){ + retval = HOTSW_HASH_CHECK_ERROR; OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n"); } } + + return retval; } @@ -661,7 +671,7 @@ static void GenVA_VB_VD(void) * ※この関数は開発カード用に発行しないといけない。 * 製品版カードの場合、このコマンドは無視される設計 * ----------------------------------------------------------------- */ -static void LoadTable(void) +static HotSwState LoadTable(void) { u32 temp; @@ -680,6 +690,8 @@ static void LoadTable(void) while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} temp = reg_HOTSW_MCD1; } + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -687,7 +699,7 @@ static void LoadTable(void) Description: Romエミュレーションデータの読み込み *---------------------------------------------------------------------------*/ -static void ReadRomEmulationData(void) +static HotSwState ReadRomEmulationData(void) { u32 count=0; u32 temp; @@ -696,7 +708,7 @@ static void ReadRomEmulationData(void) // 量産用CPUでは平文アクセス防止のためリードしない if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) ) { - return; + return HOTSW_SUCCESS; } // MCCMD レジスタ設定 @@ -719,6 +731,8 @@ static void ReadRomEmulationData(void) } MI_CpuCopyFast(s_cbData.romEmuBuf, (void*)HW_ISD_RESERVED, 32); + + return HOTSW_SUCCESS; } /* ----------------------------------------------------------------- @@ -726,7 +740,7 @@ static void ReadRomEmulationData(void) * * ノーマルモード時のカードIDを読み込む関数 * ----------------------------------------------------------------- */ -void ReadIDNormal(void) +HotSwState ReadIDNormal(void) { // カード割り込みによるDMAコピー HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) ); @@ -743,6 +757,8 @@ void ReadIDNormal(void) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } /* ----------------------------------------------------------------- @@ -810,6 +826,25 @@ static void DecryptObjectFile(void) MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); } +/* ----------------------------------------------------------------- + * HOTSW_IsCardExist関数 + * + * カードの存在判定 + * + * ※SCFG_MC1のCDETフラグを見ている + * ----------------------------------------------------------------- */ + BOOL HOTSW_IsCardExist(void) +{ + u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift()); + + if( !(reg_MI_MC1 & mask) ){ + return TRUE; + } + else{ + return FALSE; + } +} + /* ----------------------------------------------------------------- * IsSwap関数 * @@ -827,25 +862,6 @@ static BOOL IsSwap(void) } } -/* ----------------------------------------------------------------- - * IsCardExist関数 - * - * カードの存在判定 - * - * ※SCFG_MC1のCDETフラグを見ている - * ----------------------------------------------------------------- */ -static BOOL IsCardExist(void) -{ - u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift()); - - if( !(reg_MI_MC1 & mask) ){ - return TRUE; - } - else{ - return FALSE; - } -} - /* ----------------------------------------------------------------- * GetMcSlotShift関数 * @@ -853,7 +869,7 @@ static BOOL IsCardExist(void) * ----------------------------------------------------------------- */ static u32 GetMcSlotShift(void) { - return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); + return (u32)(IsSwap() * REG_MI_MC_SL2_CDET_SHIFT); } /* ----------------------------------------------------------------- @@ -968,10 +984,10 @@ static void McThread(void *arg) { #pragma unused( arg ) - u32 currentId_g = UNDEF_CODE; - BOOL isPulledOut = TRUE; - BOOL retval; - HotSwMessage *msg; + u32 hotswCount = UNDEF_CODE; + BOOL isPulledOut = TRUE; + HotSwState retval; + OSMessage *msg; while(1){ OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); @@ -989,12 +1005,11 @@ static void McThread(void *arg) } // カードが挿さってたら - if(IsCardExist()){ + if(HOTSW_IsCardExist()){ // 前の状態が挿し if(!isPulledOut){ - (void)s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData); - if(currentId_g == s_cbData.id_gam){ - + // 抜き差しがなかったか判定 + if(CARDi_IsPulledOutEx(hotswCount)){ u16 id = (u16)OS_GetLockID(); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) { @@ -1026,27 +1041,30 @@ static void McThread(void *arg) // カードデータロード完了フラグ SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE; + OS_PutString("ok!\n"); + break; } } + // 挿し回数を取得 + hotswCount = CARDi_GetSlotResetCount(); + // HotSwをbusy状態にする SetHotSwState(TRUE); - + // カード読み込み開始 - retval = HOTSW_LoadCardData(); + retval = LoadCardData(); // HotSwをfree状態にする SetHotSwState(FALSE); - // GameモードでのIDを登録する - currentId_g = s_cbData.id_gam; - // 状態フラグを更新 - isPulledOut = !retval; - + isPulledOut = (retval == HOTSW_SUCCESS) ? FALSE : TRUE; + // カード読み込み失敗してたら、後処理する - if(!retval){ + if(retval != HOTSW_SUCCESS){ + OS_TPrintf("ng... retval : %d\n", retval); // カードロックの開放 #ifdef DEBUG_USED_CARD_SLOT_B_ UnlockExCard(s_cbData.lockID); @@ -1094,10 +1112,6 @@ static void McThread(void *arg) *---------------------------------------------------------------------------*/ static void InterruptCallbackCard(void) { - // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount(); - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLEDOUT; - // メッセージ送信 OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK); @@ -1122,10 +1136,6 @@ static void InterruptCallbackCardDet(void) { // SDKのカード状態をリセットする CARDi_ResetSlotStatus(); - - // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) - s_ctData.hotswInsertMsg[s_ctData.idx_insert].hotswCount = CARDi_GetSlotResetCount(); - s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT; // メッセージ送信 OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index b40ce962..cae9822d 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -33,7 +33,7 @@ Description: DSカードType1のノーマルモードのBoot Segment読み込み *---------------------------------------------------------------------------*/ -void ReadBootSegNormal_ROMEMU(CardBootData *cbd) +HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd) { u32 i,j=0; u64 page = 0; @@ -41,6 +41,10 @@ void ReadBootSegNormal_ROMEMU(CardBootData *cbd) // u32 n = 0; for(i=0; iid_scr, sizeof(cbd->id_scr) ); @@ -141,6 +157,8 @@ void ReadIDSecure_ROMEMU(CardBootData *cbd) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -148,7 +166,7 @@ void ReadIDSecure_ROMEMU(CardBootData *cbd) Description: *---------------------------------------------------------------------------*/ -void ReadSegSecure_ROMEMU(CardBootData *cbd) +HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) { u32 i,j=0; u64 page = 0x20; @@ -156,6 +174,10 @@ void ReadSegSecure_ROMEMU(CardBootData *cbd) u32 n = 0; for(i=0; iid_gam, sizeof(cbd->id_gam) ); @@ -277,6 +315,8 @@ void ReadIDGame_ROMEMU(CardBootData *cbd) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) OS_SleepThread(NULL); + + return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* @@ -284,7 +324,7 @@ void ReadIDGame_ROMEMU(CardBootData *cbd) Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む *---------------------------------------------------------------------------*/ -void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size) +HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { #pragma unused( cbd ) @@ -300,6 +340,10 @@ void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size) OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; i