From c3361bc1ac0a09990ea019364d7e66eeb2139a03 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Mon, 17 Dec 2007 13:23:11 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0:akabane=5Fjumpei=20=E3=82=A8?= =?UTF-8?q?=E3=83=9F=E3=83=A5=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=82=92=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=80?= =?UTF-8?q?=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0=E3=80=82(=E4=BB=8A?= =?UTF-8?q?=E3=81=AE=E6=89=80=E3=80=81=E8=87=AA=E5=88=86=E3=81=A7=E3=82=A8?= =?UTF-8?q?=E3=83=9F=E3=83=A5=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=83=A1=E3=83=A2=E3=83=AA=E3=82=92=E3=81=84=E3=81=98=E3=82=89?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=81=A8=20All=200=20=E3=81=8C=E8=BF=94?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=8F=E3=82=8B=E3=80=82)=20=E3=82=A8?= =?UTF-8?q?=E3=83=9F=E3=83=A5=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=82=92=E6=A0=BC=E7=B4=8D=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=83=90=E3=83=83=E3=83=95=E3=82=A1=E3=81=B8=E3=81=AE=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=BF=E3=82=92=E8=BF=94=E3=81=99=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=82=82=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@369 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/dsCardType2.h | 2 + .../hotsw/ARM7/include/hotswTypes.h | 26 +++- .../hotsw/ARM7/src/dsCardType1.c | 3 - .../hotsw/ARM7/src/dsCardType2.c | 36 ++++- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 126 ++++++++++-------- include/sysmenu/hotsw/common/hotsw.h | 3 + 6 files changed, 127 insertions(+), 69 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h index 511f18e1..9d3cbc07 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h @@ -16,6 +16,8 @@ extern "C" { // Function Describe // =========================================================================== +void ReadRomEmulationData_DSType2(CardBootData *cbd); + // ■ ノーマルモードのコマンド ■ // DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み void ReadBootSegNormal_DSType2(CardBootData *cbd); diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 422e830e..f1c512e6 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -23,13 +23,18 @@ extern "C" { // Define ------------------------------------------------------------------- #define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ -#define DMA_NO 2 // +#define HOTSW_DMA_NO 2 // #define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ + +#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位) +#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位) + +#define ONE_SEGMENT_SIZE 0x1000 // 1 Segmentのサイズ(バイト単位) +#define ONE_SEGMENT_WORD_SIZE 0x400 // 1 Segmentのサイズ(ワード単位) + #define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ -#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値)) -#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値) -#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値) +#define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ #define PNA_BASE_VALUE 0x60e8 // #define PNB_L_VALUE 0x879b9b05 // @@ -117,6 +122,7 @@ extern "C" { #ifdef USE_SLOT_A // Slot A #define SLOT_STATUS_MODE_SELECT_MSK 0x0c +#define SLOT_STATUS_CDET_MSK 0x01 #define SLOT_STATUS_MODE_00 0x00 #define SLOT_STATUS_MODE_01 0x04 #define SLOT_STATUS_MODE_10 0x08 @@ -128,15 +134,19 @@ extern "C" { #define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_A #define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_A +#define HOTSW_MCD1 REG_MCD1_A_ADDR #define reg_HOTSW_MCD1 reg_MI_MCD1_A #define reg_HOTSW_MCSCR0 reg_MI_MCSCR0_A #define reg_HOTSW_MCSCR1 reg_MI_MCSCR1_A #define reg_HOTSW_MCSCR2 reg_MI_MCSCR2_A +#define HOTSW_IF_CARD_DET OS_IE_CARD_A_DET + #else // Slot B #define SLOT_STATUS_MODE_SELECT_MSK 0xc0 +#define SLOT_STATUS_CDET_MSK 0x10 #define SLOT_STATUS_MODE_00 0x00 #define SLOT_STATUS_MODE_01 0x40 #define SLOT_STATUS_MODE_10 0x80 @@ -148,12 +158,15 @@ extern "C" { #define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_B #define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_B +#define HOTSW_MCD1 REG_MCD1_B_ADDR #define reg_HOTSW_MCD1 reg_MI_MCD1_B #define reg_HOTSW_MCSCR0 reg_MI_MCSCR0_B #define reg_HOTSW_MCSCR1 reg_MI_MCSCR1_B #define reg_HOTSW_MCSCR2 reg_MI_MCSCR2_B +#define HOTSW_IF_CARD_DET OS_IE_CARD_B_DET + #endif @@ -229,9 +242,10 @@ typedef struct CardBootData{ u32 arm7LtdSize; BOOL twlFlg; - - u32 keyBuf[KEY_BUF_SIZE]; + u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)]; + u32 keyBuf[KEY_BUF_SIZE]; + u64 secureSegNum; CardTypeEx cardType; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 5643f117..eef06742 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -7,9 +7,6 @@ #include #include -// Define data -------------------------------------------------------------- -#define PAGE_SIZE 512 - // Function prototype ------------------------------------------------------- static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); static void SetMCSCR(void); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c index e3a88b67..8c8033b9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c @@ -10,7 +10,9 @@ // Define Data -------------------------------------------------------------- #define SECURE_SEGMENT_NUM 4 #define ONE_SEGMENT_PAGE_NUM 8 -#define COMMAND_DECRYPTION_WAIT 25 // 25ms +#define COMMAND_DECRYPTION_WAIT 25 // 25ms +#define ROM_EMULATION_START_OFS 0x160 +#define ROM_EMULATION_END_OFS 0x180 // Function prototype ------------------------------------------------------- @@ -25,6 +27,38 @@ static void SetMCSCR(void); // ■--------------------------------------■ // ■ ノーマルモードのコマンド ■ // ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadRomEmulationData_DSType2 + + Description: DSカードType2のRomエミュレーションデータの読み込み + *---------------------------------------------------------------------------*/ +void ReadRomEmulationData_DSType2(CardBootData *cbd) +{ + u32 count=0; + u32 temp; + u32 *buf = cbd->romEmuBuf; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = 0x3e000000; + reg_HOTSW_MCCMD1 = 0x0; + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に) + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + if(count >= ROM_EMULATION_START_OFS && count < ROM_EMULATION_END_OFS){ + *buf++ = reg_HOTSW_MCD1; + } + else{ + temp = reg_HOTSW_MCD1; + } + count+=4; + } +} + /*---------------------------------------------------------------------------* Name: ReadIDNormal_DSType2 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 2251d3fd..f4de2ba4 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -53,6 +53,7 @@ static void GenVA_VB_VD(void); static void LoadTable(void); static void ReadIDNormal(void); static void DecryptObjectFile(void); +static void ReadPageNormalFromDebugger(u32 page, void* buf); static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest); @@ -182,6 +183,8 @@ BOOL HOTSW_Boot(void) // カードID読み込み ReadIDNormal(); + ShowRomHeaderData(); + // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM if(s_cbData.id_nml & 0x80000000){ s_cbData.cardType = DS_CARD_TYPE_2; @@ -200,6 +203,16 @@ BOOL HOTSW_Boot(void) // Boot Segment読み込み s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData); + // Romエミュレーションデータを取得 + if(s_cbData.cardType == DS_CARD_TYPE_1){ + // Type1の場合 + MI_CpuCopy8(s_cbData.pBootSegBuf->rh.s.reserved_C, s_cbData.romEmuBuf, ROM_EMULATION_DATA_SIZE); + } + else if(s_cbData.cardType == DS_CARD_TYPE_2){ + // Type2の場合 + ReadRomEmulationData_DSType2(&s_cbData); + } + // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", @@ -290,6 +303,16 @@ BOOL HOTSW_Boot(void) return retval; } +/* ----------------------------------------------------------------- + * HOTSW_GetRomEmulationBuffer関数 + * + * Romエミュレーション情報を格納しているバッファへのポインタを返す + * ----------------------------------------------------------------- */ +void* HOTSW_GetRomEmulationBuffer(void) +{ + return s_cbData.romEmuBuf; +} + /* ----------------------------------------------------------------- * HOTSW_LoadStaticModule関数 * @@ -475,6 +498,50 @@ static void ReadIDNormal(void) } + +/* ----------------------------------------------------------------- + * ReadPageNormalFromDebugger関数 + * + * Romエミュレーション情報を読む + * ----------------------------------------------------------------- */ +void ReadPageNormalFromDebugger(u32 page, void* buf) +{ + GCDCmd64 le , be; + u64 page_data = page; +// u32 i=0; + + // ゼロクリア + MI_CpuClear8(&le, sizeof(GCDCmd64)); + + // コマンド作成 + le.dw = (page_data << 33); + + // ビッグエンディアンに直す + be.b[7] = le.b[0]; + be.b[6] = le.b[1]; + be.b[5] = le.b[2]; + be.b[4] = le.b[3]; + be.b[3] = le.b[4]; + be.b[2] = le.b[5]; + be.b[1] = le.b[6]; + be.b[0] = le.b[7]; + + // MCCMD レジスタ設定 + reg_MI_MCCMD0_B = *(u32*)be.b; + reg_MI_MCCMD1_B = *(u32*)&be.b[4]; + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に) + reg_MI_MCCNT1_B = (u32)((reg_MI_MCCNT1_B & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 20)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MI_MCCNT1_B & START_FLG_MASK){ + while(!(reg_MI_MCCNT1_B & READY_FLG_MASK)){} + *( ((u32 *)buf)++ ) = reg_MI_MCD1_B; + } +} + + /* ----------------------------------------------------------------- * DecryptObjectFile関数 * @@ -675,65 +742,6 @@ static void SetMCSCR(void) CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0)); } - -//-------------------------------------------------------------------- -// 改造DMA用 -//-------------------------------------------------------------------- -/* ---------------------------------------------------------------------------------------------------------------------------------------- */ -// DMAイネーブル・DSカード起動モード・転送ビット幅 32ビット・繰り返しモード・ソースアドレス固定・デスティネーションアドレス固定・ワードカウント=1 -#define MI_CNT_CARDWRITE32 ( MI_DMA_ENABLE | MI_DMA_TIMING_CARD | MI_DMA_32BIT_BUS | MI_DMA_CONTINUOUS_ON | MI_DMA_SRC_FIX | MI_DMA_DEST_FIX | 1 ) - -/* ---------------------------------------------------------------------------------------------------------------------------------------- */ -// NitroSDK/build/libraries/mi/common/include/mi_dma.hより抜粋 -#define MIi_Wait_BeforeDMA( dmaCntp, dmaNo ) \ - do { \ - dmaCntp = &((vu32*)REG_DMA0SAD_ADDR)[dmaNo * 3 + 2]; \ - while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \ - }while(0) - -#define MIi_Wait_AfterDMA( dmaCntp ) \ - do { \ - while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \ - }while(0) - -inline void MIi_DmaSetParams_wait(u32 dmaNo, u32 src, u32 dest, u32 ctrl) -{ - OSIntrMode enabled = OS_DisableInterrupts(); - vu32 *p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); - *p = (vu32)src; - *(p + 1) = (vu32)dest; - *(p + 2) = (vu32)ctrl; - - // ARM7 must wait 2 cycle (load is 3 cycle) - { - u32 dummy = reg_MI_DMA0SAD; - } - - (void)OS_RestoreInterrupts(enabled); -} - -//------------------------------------------------------------------------------ -// -// NitroSDK DMA転送関数 改造版 -// -//------------------------------------------------------------------------------ -// NitroSDK/build/libraries/mi/common/src/mi_dma_card.cより抜粋 -static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest) -{ - vu32 *dmaCntp; - - MIi_Wait_BeforeDMA(dmaCntp, dmaNo); - MIi_DmaSetParams_wait(dmaNo, (u32)src, (u32)dest,(u32)MI_CNT_CARDWRITE32); - /* - * ここでは自動起動が ON になっただけ. - * CARD レジスタへコマンドを設定して初めて起動する. - */ -} - - - - - /*---------------------------------------------------------------------------* Name: InterruptCallbackCard InterruptCallbackCardDet diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index c8e0cabe..48c3d28c 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -27,6 +27,9 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size); // Secure Segment バッファの指定 void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size); +// Romエミュレーション情報を格納しているバッファのポインタを返す +void* HOTSW_GetRomEmulationBuffer(void); + #ifdef __cplusplus } /* extern "C" */ #endif