From 28a0a22b9ae17f39b2828d1f9093d01eb41ea890 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 12 Mar 2008 06:58:03 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E7=AC=A6=E5=8F=B7=E7=94=9F=E6=88=90=E5=9B=9E=E8=B7=AF?= =?UTF-8?q?=E5=88=9D=E6=9C=9F=E5=8C=96=E3=82=92RomHeader=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=83=90=E3=82=A4=E3=82=B9=E3=82=BF=E3=82=A4=E3=83=97=E3=82=92?= =?UTF-8?q?=E8=A6=8B=E3=81=A6=E8=A8=AD=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3=20=E3=83=BBDMA=E3=81=A8?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=83=89=E3=81=AE=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E8=BB=A2=E9=80=81=E7=B5=82=E4=BA=86=E3=82=92=E5=BE=85=E3=81=A4?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=A9=E3=82=A4=E3=83=B3=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20=E3=83=BB=E3=82=BD=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080312_hotsw@868 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/blowfish.h | 2 +- .../hotsw/ARM7/include/customNDma.h | 15 ++ .../hotsw/ARM7/include/hotswTypes.h | 29 ++-- .../hotsw/ARM7/src/blowfish.c | 2 +- .../hotsw/ARM7/src/customNDma.c | 17 +- .../hotsw/ARM7/src/dsCardCommon.c | 148 ++++++++++++------ .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 104 ++++++------ 7 files changed, 191 insertions(+), 126 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h index 8323aeac..c5bf80bc 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h @@ -22,7 +22,7 @@ extern "C" { #endif /*************************************************************************/ -extern BLOWFISH_CTX GCDi_BlowfishInitTableBufDS; +extern BLOWFISH_CTX HotSwBlowfishInitTableBufDS; // Function Prototype ------------------------------------------------------------------------ // Blowfish 初期化 diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h index 65f97412..4120a8d9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h @@ -7,6 +7,21 @@ extern "C" { #endif + +static inline void HOTSW_WaitCardCtrl(void) +{ + while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){ +// OS_PutString("Card is busy..\n"); + } +} + +static inline void HOTSW_WaitDmaCtrl(u32 ndmaNo) +{ + while( MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) & MI_NDMA_ENABLE_MASK ){ +// OS_PutString("Dma is busy..\n"); + } +} + // =========================================================================== // Function Describe // =========================================================================== diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index bac9c796..36cecc20 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "romSpec.h" #ifdef __cplusplus @@ -48,10 +49,6 @@ extern "C" { #define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ -#define PNA_BASE_VALUE 0x60e8 // -#define PNB_L_VALUE 0x879b9b05 // -#define PNB_H_VALUE 0x5c // - #define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ #define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み #define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 @@ -108,6 +105,17 @@ extern "C" { #define SCRAMBLE_MASK 0x1840e000 #define SECURE_COMMAND_SCRAMBLE_MASK 0x00406000 // CS SE DSのマスク +// Page Count +#define HOTSW_PAGE_0 0x0UL << PC_SHIFT +#define HOTSW_PAGE_1 0x1UL << PC_SHIFT +#define HOTSW_PAGE_2 0x2UL << PC_SHIFT +#define HOTSW_PAGE_4 0x3UL << PC_SHIFT +#define HOTSW_PAGE_8 0x4UL << PC_SHIFT +#define HOTSW_PAGE_16 0x5UL << PC_SHIFT +#define HOTSW_PAGE_32 0x6UL << PC_SHIFT +#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT + + #define AddLatency2ToLatency1(param)\ ( (((param) & LATENCY2_MASK) \ >> LATENCY2_SHIFT) \ @@ -235,15 +243,13 @@ typedef union BootSegmentData } BootSegmentData; // struct ------------------------------------------------------------------- -typedef struct BLOWFISH_CTX{ +/*typedef struct BLOWFISH_CTX{ u32 P[16 + 2]; u32 S[4][256]; -} BLOWFISH_CTX; +} BLOWFISH_CTX;*/ // カードブート時に必要な変数一式をまとめた構造体 typedef struct CardBootData{ - u16 lockID; - u32 vae; u32 vbi; u32 vd; @@ -253,11 +259,6 @@ typedef struct CardBootData{ u32 id_scr2; u32 id_gam; - u32 arm9StcSize; - u32 arm7StcSize; - u32 arm9LtdSize; - u32 arm7LtdSize; - u32 arm9Stc; u32 arm7Stc; u32 arm9Ltd; @@ -270,9 +271,11 @@ typedef struct CardBootData{ u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; u32 keyBuf[KEY_BUF_SIZE]; + u32 keyBuf2[KEY_BUF_SIZE]; CardTypeEx cardType; ModeType modeType; + RomMode romMode; u32 secureLatency; u32 gameCommondParam; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c index 609e7fa2..97d287e8 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c @@ -26,7 +26,7 @@ static u32 F(const BLOWFISH_CTX *ctx, u32 x); //***************************************** void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) { - const BLOWFISH_CTX *initTable = &GCDi_BlowfishInitTableBufDS; + const BLOWFISH_CTX *initTable = &HotSwBlowfishInitTableBufDS; u32 blowfishedKey[2]; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index 2d76f28b..d86b6392 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -7,18 +7,13 @@ #include #include - // Define data -------------------------------------------------------------- -#define NDMA_BLOCK_WORD_COUNT_1 0x0 -#define NDMA_NO_INTERVAL_NORMAL_SCALE 0x0 -#define NDMA_TOTAL_WORD_COUNT_1 0x1 #define NDMA_WORD_COUNT_1 0x1 #define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." ); // Function prototype ------------------------------------------------------- static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont); - // =========================================================================== // Function Describe // =========================================================================== @@ -50,23 +45,21 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si ASSERT_DMANO( ndmaNo ); //---- confirm CARD free - while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} + HOTSW_WaitCardCtrl(); //---- confirm DMA free - while( MI_IsNDmaBusy(ndmaNo) == TRUE ){ - OS_TPrintf("Dma is busy..\n"); - } + HOTSW_WaitDmaCtrl(ndmaNo); //---- set up registers MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src; MI_NDMA_REG( ndmaNo, MI_NDMA_REG_DAD_WOFFSET ) = (u32)dest; - MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE; + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = MI_NDMA_INTERVAL_PS_1; MI_NDMA_REG( ndmaNo, MI_NDMA_REG_TCNT_WOFFSET ) = (u32)(size/4); MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1; //---- decide control register - contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE; - contData |= (MI_NDMA_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE); + contData = MI_NDMA_BWORD_1 | MI_NDMA_ENABLE/* | MI_NDMA_CONTINUOUS_ON*/; + contData |= MI_NDMA_SRC_FIX | dcont | MI_NDMA_SRC_RELOAD_DISABLE | MI_NDMA_DEST_RELOAD_DISABLE; #ifndef DEBUG_USED_CARD_SLOT_B_ contData |= MI_NDMA_TIMING_CARD_A; #else diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 21545767..3bdd415a 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -10,7 +10,7 @@ #include // extern ------------------------------------------------------------------- -extern CardThreadData s_ctData; +extern CardThreadData HotSwThreadData; // define ------------------------------------------------------------------- #define SECURE_SEGMENT_NUM 4 @@ -75,17 +75,17 @@ HotSwState ReadIDNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK); // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); return HOTSW_SUCCESS; } @@ -146,14 +146,17 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); page++; } @@ -186,17 +189,17 @@ HotSwState ReadStatusNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); return HOTSW_SUCCESS; } @@ -221,10 +224,14 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0; - while(reg_HOTSW_MCCNT1 & START_MASK){} + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } @@ -271,10 +278,14 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - while(reg_HOTSW_MCCNT1 & START_MASK){} + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0; + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } @@ -302,17 +313,17 @@ HotSwState LoadTable(void) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); return HOTSW_SUCCESS; } @@ -338,8 +349,11 @@ HotSwState ReadRomEmulationData(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x3e000000; reg_HOTSW_MCCMD1 = 0x0; + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK); + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_1 | (0x5fe & LATENCY1_MASK); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ @@ -415,6 +429,9 @@ static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask) if(cbd->cardType == DS_CARD_TYPE_2){ u32 latency = (u32)cbd->pBootSegBuf->rh.s.secure_cmd_latency * 0x100; + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | *scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; @@ -454,15 +471,18 @@ HotSwState ReadIDSecure(CardBootData *cbd) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); // コマンドカウンタインクリメント cbd->vbi++; @@ -519,14 +539,17 @@ HotSwState ReadSegSecure(CardBootData *cbd) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size ); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (pc << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); // 転送済みページ数 j++; @@ -564,10 +587,14 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -597,10 +624,14 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -632,10 +663,14 @@ HotSwState ChangeModeSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -669,14 +704,17 @@ HotSwState ReadIDGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); return HOTSW_SUCCESS; } @@ -713,14 +751,17 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); } return HOTSW_SUCCESS; @@ -748,14 +789,17 @@ HotSwState ReadStatusGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); return HOTSW_SUCCESS; } @@ -779,10 +823,14 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_0; - while(reg_HOTSW_MCCNT1 & START_MASK){} + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index b1bba2e2..7f6af521 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -149,8 +149,8 @@ static CardBootFunction s_funcTable[] = { }; // Global Values ------------------------------------------------------------ -BLOWFISH_CTX GCDi_BlowfishInitTableBufDS; -CardThreadData s_ctData; +BLOWFISH_CTX HotSwBlowfishInitTableBufDS; +CardThreadData HotSwThreadData; #include @@ -169,7 +169,7 @@ void HOTSW_Init(u32 threadPrio) #ifndef USE_LOCAL_KEYTABLE // 初期化後に他の用途でWRAM_0を使用できるようにローカルバッファへコピーしておく - MI_CpuCopyFast((void *)HW_WRAM_0_LTD, &GCDi_BlowfishInitTableBufDS, sizeof(BLOWFISH_CTX)); + MI_CpuCopyFast((void *)HW_WRAM_0_LTD, &HotSwBlowfishInitTableBufDS, sizeof(BLOWFISH_CTX)); #endif // PXI初期化 PXI_Init(); @@ -198,7 +198,7 @@ void HOTSW_Init(u32 threadPrio) MI_CpuClear8(&s_cbData, sizeof(CardBootData)); // カードスレッド用構造体の初期化 - MI_CpuClear8(&s_ctData, sizeof(CardThreadData)); + MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData)); // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) { @@ -217,22 +217,22 @@ void HOTSW_Init(u32 threadPrio) } // カードブート用スレッドの生成 - OS_CreateThread(&s_ctData.thread, + OS_CreateThread(&HotSwThreadData.thread, McThread, NULL, - s_ctData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), + HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HOTSW_THREAD_STACK_SIZE, threadPrio ); // メッセージキューの初期化 - OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); // メッセージキューの初期化 - OS_InitMessageQueue( &s_ctData.hotswDmaQueue, &s_ctData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); // スレッド起動 - OS_WakeupThreadDirect(&s_ctData.thread); + OS_WakeupThreadDirect(&HotSwThreadData.thread); // Boot Segment バッファの設定 HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); @@ -246,10 +246,10 @@ void HOTSW_Init(u32 threadPrio) // カードが挿さってあったらスレッドを起動する if(HOTSW_IsCardExist()){ // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; } else{ SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; @@ -295,6 +295,8 @@ static HotSwState LoadCardData(void) // ロード処理開始 if(HOTSW_IsCardAccessible()){ + s_cbData.modeType = HOTSW_MODE1; + // カード側でKey Tableをロードする state = LoadTable(); retval = (retval == HOTSW_SUCCESS) ? state : retval; @@ -302,13 +304,6 @@ static HotSwState LoadCardData(void) // ---------------------- Normal Mode ---------------------- romMode = HOTSW_ROM_MODE_NORMAL; - // カードID読み込み - state = ReadIDNormal(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM - s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; - { u8 i; u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf; @@ -317,8 +312,15 @@ static HotSwState LoadCardData(void) LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); // Boot Segment読み込み - state = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); + state = ReadBootSegNormal(&s_cbData); retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // カードID読み込み + state = ReadIDNormal(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM + s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; // Romエミュレーション情報を取得 state = ReadRomEmulationData(&s_cbData); @@ -357,7 +359,7 @@ static HotSwState LoadCardData(void) if( retval == HOTSW_SUCCESS ) { // NTRカードかTWLカードか #ifdef DEBUG_MODE - if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset) + if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset && (s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK)) #else if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02) #endif @@ -464,10 +466,10 @@ end: } // カードDMA終了確認 - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); // カードアクセス終了確認 - while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} + HOTSW_WaitCardCtrl(); // カードのロック開放(※ロックIDは開放せずに持ち続ける) #ifndef DEBUG_USED_CARD_SLOT_B_ @@ -1084,24 +1086,28 @@ static void McPowerOff(void) Description: 符号生成回路初期値設定レジスタを設定する - ※注:この関数はセキュアモードで、 - sPNG_ONコマンドを実行してから呼び出してください。 + ※注:この関数はセキュアモードで、sPNG_ONコマンドを実行してから呼び出してください。 *---------------------------------------------------------------------------*/ static void SetMCSCR(void) { - u32 pna_l = (u32)(PNA_BASE_VALUE | (s_cbData.vd << 15)); - u32 pna_h = (u32)(s_cbData.vd >> 17); - + static u32 pnbL = 0x879b9b05; + static u8 pnbH = 0x5c; + static u8 pnaL1 = 0x60; + static u8 pnaL0Table[8] = { 0xe8, 0x4d, 0x5a, 0xb1, 0x17, 0x8f, 0x99, 0xd5 }; + + u32 pnaL = s_cbData.vd << 15 | pnaL1 << 8 | pnaL0Table[(s_cbData.pBootSegBuf->rh.s.rom_type & 0x7)]; + u8 pnaH = (u8)((s_cbData.vd >> 17) & 0x7f); + // SCR A - reg_HOTSW_MCSCR0 = pna_l; + reg_HOTSW_MCSCR0 = pnaL; // SCR B - reg_HOTSW_MCSCR1 = PNB_L_VALUE; + reg_HOTSW_MCSCR1 = pnbL; // [d0 -d6 ] -> SCR A // [d16-d22] -> SCR B - reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16); - + reg_HOTSW_MCSCR2 = (u32)(pnaH | pnbH << 16); + // MCCNT1 レジスタ設定 (SCR = 1に) reg_HOTSW_MCCNT1 = SCR_MASK; } @@ -1122,7 +1128,7 @@ static void McThread(void *arg) HotSwMessage *msg; while(1){ - OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); + OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); if( msg->ctrl == TRUE ) { // [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。 @@ -1231,15 +1237,15 @@ static void McThread(void *arg) *---------------------------------------------------------------------------*/ static void InterruptCallbackCard(void) { - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].ctrl = FALSE; - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].value = 0; - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLOUT; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; + HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; OS_PutString("○\n"); } @@ -1251,15 +1257,15 @@ static void InterruptCallbackCard(void) *---------------------------------------------------------------------------*/ static void InterruptCallbackCardDet(void) { - s_ctData.hotswInsertMsg[s_ctData.idx_insert].ctrl = FALSE; - s_ctData.hotswInsertMsg[s_ctData.idx_insert].value = 0; - s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; OS_PutString("●\n"); } @@ -1272,10 +1278,10 @@ static void InterruptCallbackCardDet(void) static void InterruptCallbackNDma(void) { // メッセージ送信 -// OS_SendMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_ctData.hotswDmaMsg[s_ctData.idx_dma], OS_MESSAGE_NOBLOCK); +// OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント -// s_ctData.idx_dma = (s_ctData.idx_dma+1) % HOTSW_DMA_MSG_NUM; +// HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM; OS_PutString("▽\n"); } @@ -1293,15 +1299,15 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) d.data = data; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].value = d.msg.value; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].type = HOTSW_CONTROL; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].type = HOTSW_CONTROL; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPxiMsg[s_ctData.idx_ctrl], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_ctrl = (s_ctData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; + HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; } /*---------------------------------------------------------------------------*