diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/command.h b/build/libraries_sysmenu/hotsw/ARM7/include/command.h new file mode 100644 index 00000000..b21f9126 --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/include/command.h @@ -0,0 +1,118 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL - HOTSW - include + File: command.h + + Copyright 2008 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. + + $Date:: $ + $Rev: $ + $Author: $ + *---------------------------------------------------------------------------*/ +#ifndef __HOTSW_COMMAND_H__ +#define __HOTSW_COMMAND_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// NORMAL command + +#define HSWOP_N_OP_MASK 0xff00000000000000ULL +#define HSWOP_N_OP_SIZE 8 + +#define HSWOP_N_OP_RD_ID 0x9000000000000000ULL +#define HSWOP_N_OP_RD_PAGE 0x0000000000000000ULL +#define HSWOP_N_OP_WR_PAGE 0x8000000000000000ULL +#define HSWOP_N_OP_LD_TABLE 0x9f00000000000000ULL +#define HSWOP_N_OP_CHG_MODE 0x3c00000000000000ULL +#define HSWOP_N_OP_CHG2_MODE 0x3d00000000000000ULL + +#define HSWOP_N_RD_ID_PAD 0x00ffffffffffffffULL +#define HSWOP_N_RD_PAGE_PAD 0x00fffffeff00ffffULL +#define HSWOP_N_CHG_MODE_PAD 0x00000000f00000ffULL +#define HSWOP_N_CHG2_MODE_PAD HSWOP_N_CHG_MODE_PAD + +#define HSWOP_N_RD_PAGE_ADDR_SHIFT 33 +#define HSWOP_N_RD_PAGE_ADDR_SIZE 23 +#define HSWOP_N_RD_PAGE_ADDR_MASK 0x00fffffe00000000ULL + +#define HSWOP_N_VAE_SHIFT 32 +#define HSWOP_N_VAE_SIZE 24 +#define HSWOP_N_VAE_MASK 0x00ffffff00000000ULL + +#define HSWOP_N_VBI_SHIFT 8 +#define HSWOP_N_VBI_SIZE 20 +#define HSWOP_N_VBI_MASK 0x000000000fffff00ULL + + +// SECURE command + +#define HSWOP_S_OP_MASK 0xf000000000000000ULL +#define HSWOP_S_OP_SIZE 4 + +#define HSWOP_S_OP_RD_ID 0x1000000000000000ULL +#define HSWOP_S_OP_RD_SEG 0x2000000000000000ULL +#define HSWOP_S_OP_PNG_ON 0x4000000000000000ULL +#define HSWOP_S_OP_PNG_OFF 0x6000000000000000ULL +#define HSWOP_S_OP_CHG_MODE 0xa000000000000000ULL + +#define HSWOP_S_VA_SHIFT HSWOP_S_VB_SIZE +#define HSWOP_S_VA_SIZE 24 +#define HSWOP_S_VA_MASK 0x00000ffffff00000ULL + +#define HSWOP_S_VB_SHIFT 0 +#define HSWOP_S_VB_SIZE 20 +#define HSWOP_S_VB_MASK 0x00000000000fffffULL + +#define HSWOP_S_VC_SHIFT (HSWOP_S_VA_SIZE + HSWOP_S_VB_SIZE) +#define HSWOP_S_VC_SIZE 16 +#define HSWOP_S_VC_MASK 0x0ffff00000000000ULL + +#define HSWOP_S_VD_SHIFT HSWOP_S_VA_SHIFT +#define HSWOP_S_VD_SIZE HSWOP_S_VA_SIZE +#define HSWOP_S_VD_MASK HSWOP_S_VA_MASK + + +// GAME command + +#define HSWOP_G_OP_MASK 0xff00000000000000ULL +#define HSWOP_G_OP_SIZE 8 + +#define HSWOP_G_OP_RD_ID 0xb800000000000000ULL +#define HSWOP_G_OP_RD_UID 0xb900000000000000ULL +#define HSWOP_G_OP_RD_PAGE 0xb700000000000000ULL +#define HSWOP_G_OP_RD_CACHE_START 0x5800000000000000ULL +#define HSWOP_G_OP_RD_CACHE 0x6000000000000000ULL +#define HSWOP_G_OP_RD_CACHE_LAST 0x6800000000000000ULL +#define HSWOP_G_OP_WR_PAGE 0x8000000000000000ULL + +#define HSWOP_G_RD_ID_PAD 0x00ffffffffffffffULL +#define HSWOP_G_RD_UID_PAD 0x00ffffffffffffffULL +#define HSWOP_G_RD_PAGE_PAD 0x00f0000000ffffffULL + +#define HSWOP_G_RD_PAGE_ADDR_SHIFT 33 +#define HSWOP_G_RD_PAGE_ADDR_SIZE 23 +#define HSWOP_G_RD_PAGE_ADDR_MASK 0x000ffffe00000000ULL + + +// ROM ID + +#define HOTSW_ROMID_1TROM_MASK 0x80000000UL +#define HOTSW_ROMID_TWLROM_MASK 0x40000000UL +#define HOTSW_ROMID_BADBLK_MASK 0x20000000UL +#define HOTSW_ROMID_SIZE_MASK 0x0000ff00UL + + +#ifdef __cplusplus +} /* extern "C" */ + +#endif + +/* __HOTSW_COMMAND_H__ */ +#endif diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 100a2c70..0011b595 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 "command.h" #ifdef __cplusplus extern "C" { diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 668a8f9c..96046226 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -33,12 +33,27 @@ * ----------------------------------------------------------------- */ HotSwState ReadIDNormal(CardBootData *cbd) { + GCDCmd64 cndLE, cndBE; + // カード割り込みによるDMAコピー HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) ); - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x00000090; - reg_HOTSW_MCCMD1 = 0x00000000; + // リトルエンディアンで作って + cndLE.dw = HSWOP_N_OP_RD_ID; + + // ビックエンディアンにする + cndBE.b[0] = cndLE.b[7]; + cndBE.b[1] = cndLE.b[6]; + cndBE.b[2] = cndLE.b[5]; + cndBE.b[3] = cndLE.b[4]; + cndBE.b[4] = cndLE.b[3]; + cndBE.b[5] = cndLE.b[2]; + cndBE.b[6] = cndLE.b[1]; + cndBE.b[7] = cndLE.b[0]; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4]; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); @@ -91,12 +106,9 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) return HOTSW_PULLED_OUT_ERROR; } - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - // リトルエンディアンで作って - cndLE.dw = 0x0 << 24; - cndLE.dw |= page << 33; + cndLE.dw = HSWOP_N_OP_RD_PAGE; + cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; // ビックエンディアンにする cndBE.b[0] = cndLE.b[7]; @@ -152,14 +164,11 @@ HotSwState ChangeModeNormal(CardBootData *cbd) if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } - - // ゼロクリア - MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); - + // リトルエンディアンで作って - tempCnd.dw = cbd->vbi << 8; - tempCnd.dw |= vae64 << 32; - tempCnd.dw |= 0x3c00000000000000; + tempCnd.dw = HSWOP_N_OP_CHG_MODE; + tempCnd.dw |= cbd->vbi << HSWOP_N_VBI_SHIFT; + tempCnd.dw |= vae64 << HSWOP_N_VAE_SHIFT; // ビックエンディアンにする cnd.b[0] = tempCnd.b[7]; @@ -170,7 +179,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd) cnd.b[5] = tempCnd.b[2]; cnd.b[6] = tempCnd.b[1]; cnd.b[7] = tempCnd.b[0]; - + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; @@ -195,11 +204,25 @@ HotSwState ChangeModeNormal(CardBootData *cbd) * ----------------------------------------------------------------- */ HotSwState LoadTable(void) { + GCDCmd64 tempCnd, cnd; u32 temp; + // リトルエンディアンで作って + tempCnd.dw = HSWOP_N_OP_LD_TABLE; + + // ビックエンディアンにする + cnd.b[0] = tempCnd.b[7]; + cnd.b[1] = tempCnd.b[6]; + cnd.b[2] = tempCnd.b[5]; + cnd.b[3] = tempCnd.b[4]; + cnd.b[4] = tempCnd.b[3]; + cnd.b[5] = tempCnd.b[2]; + cnd.b[6] = tempCnd.b[1]; + cnd.b[7] = tempCnd.b[0]; + // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x0000009f; - reg_HOTSW_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); @@ -271,32 +294,30 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) GCDCmd64 cndLE, cndBE; u64 data; - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; - - cndLE.dw = cbd->vbi; - cndLE.dw |= data << 20; - // comannd0部分 switch(type){ case S_RD_ID: - cndLE.dw |= 0x1000000000000000; + cndLE.dw = HSWOP_S_OP_RD_ID; break; case S_PNG_ON: - cndLE.dw |= 0x4000000000000000; + cndLE.dw = HSWOP_S_OP_PNG_ON; break; case S_PNG_OFF: - cndLE.dw |= 0x6000000000000000; + cndLE.dw = HSWOP_S_OP_PNG_OFF; break; case S_CHG_MODE: - cndLE.dw |= 0xa000000000000000; + cndLE.dw = HSWOP_S_OP_CHG_MODE; break; } + data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; + + cndLE.dw |= cbd->vbi; + cndLE.dw |= data << HSWOP_S_VA_SHIFT; + if(!cbd->debuggerFlg){ // コマンドの暗号化 EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); @@ -398,13 +419,11 @@ HotSwState ReadSegSecure(CardBootData *cbd) if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } - - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - - cndLE.dw = cbd->vbi; - cndLE.dw |= vae << 20; - cndLE.dw |= segNum << 44; - cndLE.dw |= 0x2000000000000000; + + cndLE.dw = HSWOP_S_OP_RD_SEG; + cndLE.dw |= cbd->vbi; + cndLE.dw |= vae << HSWOP_S_VA_SHIFT; + cndLE.dw |= segNum << HSWOP_S_VC_SHIFT; // コマンドの暗号化 EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); @@ -604,6 +623,8 @@ HotSwState ChangeModeSecure(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState ReadIDGame(CardBootData *cbd) { + GCDCmd64 cndLE, cndBE; + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } @@ -611,9 +632,22 @@ HotSwState ReadIDGame(CardBootData *cbd) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); + // リトルエンディアンで作って + cndLE.dw = HSWOP_G_OP_RD_ID; + + // ビックエンディアンにする + cndBE.b[0] = cndLE.b[7]; + cndBE.b[1] = cndLE.b[6]; + cndBE.b[2] = cndLE.b[5]; + cndBE.b[3] = cndLE.b[4]; + cndBE.b[4] = cndLE.b[3]; + cndBE.b[5] = cndLE.b[2]; + cndBE.b[6] = cndLE.b[1]; + cndBE.b[7] = cndLE.b[0]; + // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x000000B8; - reg_HOTSW_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4]; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) reg_HOTSW_MCCNT1 = cbd->gameCommondParam | @@ -653,13 +687,10 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); - // ゼロクリア - MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); - // コマンド作成 - cndLE.dw = (page + i) << 33; - cndLE.dw |= 0xB700000000000000; - + cndLE.dw = HSWOP_G_OP_RD_PAGE; + cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT; + // ビッグエンディアンに直す(暗号化後) cndBE.b[7] = cndLE.b[0]; cndBE.b[6] = cndLE.b[1]; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 3a3dc8c6..23d6c56f 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -316,7 +316,7 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM - s_cbData.cardType = (s_cbData.id_nml & 0x80000000) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; + s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; { u8 i; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index 88b52462..7a164c71 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -53,16 +53,31 @@ *---------------------------------------------------------------------------*/ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) { + GCDCmd64 tempCnd, cnd; + if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } // カード割り込みによるDMAコピー HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); - - // MCCMD レジスタ設定 - reg_HOTSW_MCCMD0 = 0x00000090; - reg_HOTSW_MCCMD1 = 0x00000000; + + // リトルエンディアンで作って + tempCnd.dw = HSWOP_N_OP_RD_ID; + + // ビックエンディアンにする + cnd.b[0] = tempCnd.b[7]; + cnd.b[1] = tempCnd.b[6]; + cnd.b[2] = tempCnd.b[5]; + cnd.b[3] = tempCnd.b[4]; + cnd.b[4] = tempCnd.b[3]; + cnd.b[5] = tempCnd.b[2]; + cnd.b[6] = tempCnd.b[1]; + cnd.b[7] = tempCnd.b[0]; + + // MCCMD レジスタ設定 + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); @@ -92,12 +107,10 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } - - // ゼロクリア - MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); // リトルエンディアンで作って - tempCnd.dw = page << 33; + tempCnd.dw = HSWOP_N_OP_RD_PAGE; + tempCnd.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; // ビックエンディアンにする cnd.b[0] = tempCnd.b[7]; @@ -108,7 +121,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) cnd.b[5] = tempCnd.b[2]; cnd.b[6] = tempCnd.b[1]; cnd.b[7] = tempCnd.b[0]; - + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; @@ -173,7 +186,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd) MI_CpuClear8(&tempCnd, sizeof(GCDCmd64)); // リトルエンディアンで作って - tempCnd.dw = 0xa000000000000000; + tempCnd.dw = HSWOP_S_OP_CHG_MODE; // ビックエンディアンにする cnd.b[0] = tempCnd.b[7];