From 143a61fbd7ffec1a21d3537cf76e137c410ab9a5 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 28 Nov 2007 00:33:31 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0=E8=80=85=EF=BC=9Aakabane=5F?= =?UTF-8?q?jumpei)=E6=B4=BB=E7=B7=9A=E6=8C=BF=E6=8A=9C=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=AA=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/trunk@277 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/blowfish.h | 2 +- .../hotsw/ARM7/include/dsCardType1.h | 10 +- .../hotsw/ARM7/include/dsCardType2.h | 18 +- .../hotsw/ARM7/include/hotswTypes.h | 267 ++++++++++++++++++ .../hotsw/ARM7/src/dsCardType1.c | 108 +++---- .../hotsw/ARM7/src/dsCardType2.c | 108 +++---- .../hotsw/ARM7/src/ds_blowfish_table.c | 2 +- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 57 ++-- include/sysmenu/hotsw/common/hotsw.h | 248 +--------------- 9 files changed, 424 insertions(+), 396 deletions(-) create mode 100644 build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h index a3dd6f2f..9f7040e3 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h @@ -15,7 +15,7 @@ #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h index 843b0991..658a496e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType1.h @@ -5,22 +5,18 @@ #ifndef __DSCARD_TYPE1_H__ #define __DSCARD_TYPE1_H__ +#include +#include + #ifdef __cplusplus extern "C" { #endif - -#include -#include - // =========================================================================== // Function Describe // =========================================================================== // ■ ノーマルモードのコマンド ■ -// DSカードType1のノーマルモードのID読み込み -void ReadIDNormal_DSType1(CardBootData *cbd); - // DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み void ReadBootSegNormal_DSType1(CardBootData *cbd); diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h index 1874e2de..511f18e1 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h @@ -5,14 +5,13 @@ #ifndef __DSCARD_TYPE2_H__ #define __DSCARD_TYPE2_H__ +#include +#include + #ifdef __cplusplus extern "C" { #endif - -#include -#include - // =========================================================================== // Function Describe // =========================================================================== @@ -21,6 +20,10 @@ extern "C" { // DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み void ReadBootSegNormal_DSType2(CardBootData *cbd); +// DSカードType2のノーマルモードのモード変更 (Type1と同じ処理) +#define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1 + + // ■ セキュアモードのコマンド ■ // DSカードType2のセキュアモードのID読み込み void ReadIDSecure_DSType2(CardBootData *cbd); @@ -37,8 +40,13 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd); // DSカードType2のセキュアモードのモード変更 void ChangeModeSecure_DSType2(CardBootData *cbd); + // ■ ゲームモードのコマンド ■ -// Type1と同じコマンドを使う +// DSカードType2のゲームモードのID読み込み (Type1と同じ処理) +#define ReadIDGame_DSType2 ReadIDGame_DSType1 + +// DSカードType2のゲームモードの指定ページ読み込み (Type1と同じ処理) +#define ReadPageGame_DSType2 ReadPageGame_DSType1 #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h new file mode 100644 index 00000000..422e830e --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -0,0 +1,267 @@ +/*---------------------------------------------------------------------------* + Project: TwlFirm - GCD - include + File: type.h + + 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. + *---------------------------------------------------------------------------*/ +#ifndef __HOTSW_TYPES_H__ +#define __HOTSW_TYPES_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +// Define ------------------------------------------------------------------- +#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ +#define DMA_NO 2 // +#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ +#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ + +#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値)) +#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値) +#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値) + +#define PNA_BASE_VALUE 0x60e8 // +#define PNB_L_VALUE 0x879b9b05 // +#define PNB_H_VALUE 0x5c // + +// コントロールレジスタ1 bit関連 +#define START_FLG_MASK 0x80000000 +#define READY_FLG_MASK 0x00800000 + +#define LATENCY1_SHIFT 0 +#define LATENCY1_MASK 0x00001fff + +#define DS_SHIFT 13 +#define DS_MASK 0x00002000 + +#define SE_SHIFT 14 +#define SE_MASK 0x00004000 + +#define SCR_SHIFT 15 +#define SCR_MASK 0x00008000 + +#define LATENCY2_SHIFT 16 +#define LATENCY2_MASK 0x003f0000 + +#define CS_SHIFT 22 +#define CS_MASK 0x00400000 + +#define RDY_SHIFT 23 +#define RDY_MASK 0x00800000 + +#define PC_SHIFT 24 +#define PC_MASK 0x07000000 + +#define CT_SHIFT 27 +#define CT_MASK 0x08000000 + +#define TRM_SHIFT 28 +#define TRM_MASK 0x10000000 + +#define RESB_SHIFT 29 +#define RESB_MASK 0x20000000 + +#define WR_SHIFT 30 +#define WR_MASK 0x40000000 + +#define START_SHIFT 31 +#define START_MASK 0x80000000 + +#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ + (u32)( \ + ((u32)(start)<< START_SHIFT) | \ + ((u32)(wr) << WR_SHIFT) | \ + ((u32)(resb) << RESB_SHIFT) | \ + ((u32)(rtm) << TRM_SHIFT) | \ + ((u32)(ct) << CT_SHIFT) | \ + ((u32)(pc) << PC_SHIFT) | \ + ((u32)(rdy) << RDY_SHIFT) | \ + ((u32)(cs) << CS_SHIFT) | \ + ((u32)(l2) << LATENCY2_SHIFT) | \ + ((u32)(scr) << SCR_SHIFT) | \ + ((u32)(se) << SE_SHIFT) | \ + ((u32)(ds) << DS_SHIFT) | \ + ((u32)(l1) << LATENCY1_SHIFT) \ + ) + +#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ + (u32)( ((start) ? START_MASK : 0) | \ + ((wr) ? WR_MASK : 0) | \ + ((resb) ? RESB_MASK : 0) | \ + ((rtm) ? TRM_MASK : 0) | \ + ((ct) ? CT_MASK : 0) | \ + ((pc) ? PC_MASK : 0) | \ + ((rdy) ? RDY_MASK : 0) | \ + ((cs) ? CS_MASK : 0) | \ + ((l2) ? LATENCY2_MASK : 0)| \ + ((scr) ? SCR_MASK : 0) | \ + ((se) ? SE_MASK : 0) | \ + ((ds) ? DS_MASK : 0) | \ + ((l1) ? LATENCY1_MASK : 0)) + + + +//#define USE_SLOT_A + +#ifdef USE_SLOT_A +// Slot A +#define SLOT_STATUS_MODE_SELECT_MSK 0x0c +#define SLOT_STATUS_MODE_00 0x00 +#define SLOT_STATUS_MODE_01 0x04 +#define SLOT_STATUS_MODE_10 0x08 +#define SLOT_STATUS_MODE_11 0x0c + +#define reg_HOTSW_MCCMD0 reg_MI_MCCMD0_A +#define reg_HOTSW_MCCMD1 reg_MI_MCCMD1_A + +#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_A +#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_A + +#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 + +#else +// Slot B +#define SLOT_STATUS_MODE_SELECT_MSK 0xc0 +#define SLOT_STATUS_MODE_00 0x00 +#define SLOT_STATUS_MODE_01 0x40 +#define SLOT_STATUS_MODE_10 0x80 +#define SLOT_STATUS_MODE_11 0xc0 + +#define reg_HOTSW_MCCMD0 reg_MI_MCCMD0_B +#define reg_HOTSW_MCCMD1 reg_MI_MCCMD1_B + +#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_B +#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_B + +#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 + +#endif + + +// Enum --------------------------------------------------------------------- +typedef enum CardTypeEx{ + DS_CARD_TYPE_1 = 0, + DS_CARD_TYPE_2, + TWL_CARD +}CardTypeEx; + +typedef enum NormalCommandType{ + RD_ID = 0, + RD_BSEG, + CHG_MODE +}NormalCommandType; + +typedef enum SecureCommandType{ + S_RD_ID = 0, + S_RD_SEG, + S_PNG_ON, + S_PNG_OFF, + S_CHG_MODE +}SecureCommandType; + +typedef enum GameCommandType{ + G_RD_ID = 0, + G_RD_PAGE +}GameCommandType; + +typedef enum CardType{ + CARD_DS_TYPE1 = 0, + CARD_DS_TYPE2, + CARD_TWL +}CardType; + +// union --------------------------------------------------------------------- +typedef union +{ + u64 dw; + u8 b[8]; +} +GCDCmd64; + +// ブートセグメントデータ +typedef union BootSegmentData +{ + ROM_Header rh; + u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)]; +} +BootSegmentData; + +// struct ------------------------------------------------------------------- +typedef struct BLOWFISH_CTX{ + u32 P[16 + 2]; + u32 S[4][256]; +} BLOWFISH_CTX; + +// カードブート時に必要な変数一式をまとめた構造体 +typedef struct CardBootData{ + u16 lockID; + + u32 vae; + u32 vbi; + u32 vd; + + u32 id_nml; + u32 id_scr; + u32 id_gam; + + u32 arm9StaticSize; + u32 arm7StaticSize; + u32 arm9LtdSize; + u32 arm7LtdSize; + + BOOL twlFlg; + + u32 keyBuf[KEY_BUF_SIZE]; + + u64 secureSegNum; + + CardTypeEx cardType; + + BootSegmentData *pBootSegBuf; + u32 *pSecureSegBuf; + + BLOWFISH_CTX keyTable; +} +CardBootData; + +// カード起動用関数 +typedef struct CardBootFunction { + void (*ReadBootSegment_N)(CardBootData *cbd); + void (*ChangeMode_N)(CardBootData *cbd); + + void (*ReadID_S)(CardBootData *cbd); + void (*ReadSegment_S)(CardBootData *cbd); + void (*SetPNG_S)(CardBootData *cbd); + void (*ChangeMode_S)(CardBootData *cbd); + + void (*ReadID_G)(CardBootData *cbd); + void (*ReadPage_G)(u32 addr, void* buf, u32 size); +} +CardBootFunction; + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // __HOTSW_TYPES_H__ \ No newline at end of file diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index 1f3657e0..5643f117 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -41,20 +41,20 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd) u32 i = 0; // MCCMD レジスタ設定 - reg_MCCMD0 = 0x00000000; - reg_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = 0x00000000; + reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20)); + 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,4, 0,0, 0, 0,0,0, 20)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pBootSegBuf->word + i++) = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pBootSegBuf->word + i++) = reg_HOTSW_MCD1; } } @@ -87,16 +87,16 @@ void ChangeModeNormal_DSType1(CardBootData *cbd) cnd.b[7] = tempCnd.b[0]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32 *)cnd.b; - reg_MCCMD1 = *(u32 *)&cnd.b[4]; + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; // MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + 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,1,0,0, 0,0, 0,0, 0, 0,0,0, 0)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} } } @@ -154,8 +154,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) cndBE.b[0] = cndLE.b[7]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32*)cndBE.b; - reg_MCCMD1 = *(u32*)&cndBE.b[4]; + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; } @@ -171,13 +171,13 @@ void ReadIDSecure_DSType1(CardBootData *cbd) // MCCNT1 レジスタ設定 // (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | + CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - cbd->id_scr = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + cbd->id_scr = reg_HOTSW_MCD1; } // コマンドカウンタインクリメント @@ -218,18 +218,18 @@ void ReadSegSecure_DSType1(CardBootData *cbd) cndBE.b[0] = cndLE.b[7]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32*)cndBE.b; - reg_MCCMD1 = *(u32*)&cndBE.b[4]; + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; // MCCNT1 レジスタ設定 // (START = 1 W/R = 0 TRM = 1 PC = 100(8ページリード) CS = 1 Latency2 = 24(0x18) SE = 1 DS = 1 Latency1 = 2296(0x8f8)に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pSecureSegBuf + j++) = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1; } // 読み込みセグメント番号インクリメント @@ -251,11 +251,11 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd) SetSecureCommand(S_PNG_ON, cbd); // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} } // コマンドカウンタインクリメント @@ -273,11 +273,11 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) SetSecureCommand(S_PNG_OFF, cbd); // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} } // コマンドカウンタインクリメント @@ -295,11 +295,11 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) SetSecureCommand(S_CHG_MODE, cbd); // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} } // コマンドカウンタインクリメント @@ -318,17 +318,17 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) void ReadIDGame_DSType1(CardBootData *cbd) { // MCCMD レジスタ設定 - reg_MCCMD0 = 0x000000B8; - reg_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = 0x000000B8; + reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 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,7, 0,1, 0, 0,1,1, 1)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - cbd->id_gam = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + cbd->id_gam = reg_HOTSW_MCD1; } } @@ -369,17 +369,17 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size) cndBE.b[0] = cndLE.b[7]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32*)cndBE.b; - reg_MCCMD1 = *(u32*)&cndBE.b[4]; + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - *((u32 *)buf + counter++) = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *((u32 *)buf + counter++) = reg_HOTSW_MCD1; } } } \ No newline at end of file diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c index 66bb4d0e..e3a88b67 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType2.c @@ -65,17 +65,17 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd) cnd.b[7] = tempCnd.b[0]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32 *)cnd.b; - reg_MCCMD1 = *(u32 *)&cnd.b[4]; + reg_HOTSW_MCCMD0 = *(u32 *)cnd.b; + reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4]; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に) - reg_MCCNT1 = (u32)((reg_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)); + 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_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pBootSegBuf->word + j++) = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pBootSegBuf->word + j++) = reg_HOTSW_MCD1; } page++; @@ -143,8 +143,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) cndBE.b[0] = cndLE.b[7]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32*)cndBE.b; - reg_MCCMD1 = *(u32*)&cndBE.b[4]; + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; } @@ -161,24 +161,24 @@ void ReadIDSecure_DSType2(CardBootData *cbd) SetSecureCommand(S_RD_ID, cbd); // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 0 PC = 0 SE = 1 DS = 1 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち start = OS_GetTick(); while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} // MCCMD レジスタ設定 - reg_MCCMD0 = 0x0; - reg_MCCMD1 = 0x0; + reg_HOTSW_MCCMD0 = 0x0; + reg_HOTSW_MCCMD1 = 0x0; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 1 PC = 111 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0)); - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - cbd->id_scr = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + cbd->id_scr = reg_HOTSW_MCD1; } // コマンドカウンタインクリメント @@ -224,16 +224,16 @@ void ReadSegSecure_DSType2(CardBootData *cbd) cndBE.b[0] = cndLE.b[7]; // MCCMD レジスタ設定 - reg_MCCMD0 = *(u32*)cndBE.b; - reg_MCCMD1 = *(u32*)&cndBE.b[4]; + reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; + reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 // (START = 1 W/R = 0 TRM = 0 PC = 000(0ページ) CS = 1 Latency2 =0 SE = 1 DS = 1 Latency1 = 0に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち (latencyで設定できる以上のwaitが必要だから) start = OS_GetTick(); @@ -241,18 +241,18 @@ void ReadSegSecure_DSType2(CardBootData *cbd) for(k=0; k Output Latency = 230us 転送クロックタイプ = 0で周期が150ns だから 230000 / 150 = 1533.33 - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pSecureSegBuf + j++) = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1; } } @@ -277,25 +277,25 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) SetSecureCommand(S_PNG_ON, cbd); // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち start = OS_GetTick(); while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} // MCCMD レジスタ設定 - reg_MCCMD0 = 0x0; - reg_MCCMD1 = 0x0; + reg_HOTSW_MCCMD0 = 0x0; + reg_HOTSW_MCCMD1 = 0x0; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_MCCNT1 & START_FLG_MASK){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} // コマンドカウンタインクリメント cbd->vbi++; @@ -314,25 +314,25 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) SetSecureCommand(S_PNG_OFF, cbd); // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち start = OS_GetTick(); while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} // MCCMD レジスタ設定 - reg_MCCMD0 = 0x0; - reg_MCCMD1 = 0x0; + reg_HOTSW_MCCMD0 = 0x0; + reg_HOTSW_MCCMD1 = 0x0; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_MCCNT1 & START_FLG_MASK){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} // コマンドカウンタインクリメント cbd->vbi++; @@ -351,25 +351,25 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) SetSecureCommand(S_CHG_MODE, cbd); // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち start = OS_GetTick(); while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} // MCCMD レジスタ設定 - reg_MCCMD0 = 0x0; - reg_MCCMD1 = 0x0; + reg_HOTSW_MCCMD0 = 0x0; + reg_HOTSW_MCCMD1 = 0x0; // MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_MCCNT1 & START_FLG_MASK){} + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} // コマンドカウンタインクリメント cbd->vbi++; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/ds_blowfish_table.c b/build/libraries_sysmenu/hotsw/ARM7/src/ds_blowfish_table.c index bdf8a5f1..0c402ad0 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/ds_blowfish_table.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/ds_blowfish_table.c @@ -10,7 +10,7 @@ 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 +#include const BLOWFISH_CTX GCDi_BlowfishInitTableDS = { diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 44e66cee..4c535f19 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -70,13 +71,13 @@ static CardBootData s_cbData; static CardBootFunction s_funcTable[] = { // DS Card Type 1 - { ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, - ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, - ReadIDGame_DSType1, ReadPageGame_DSType1}, + { ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数 + ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数 + ReadIDGame_DSType1, ReadPageGame_DSType1}, // Game モード関数 // DS Card Type 2 - { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType1, - ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, - ReadIDGame_DSType1, ReadPageGame_DSType1} + { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数 + ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 + ReadIDGame_DSType2, ReadPageGame_DSType2} // Game モード関数 }; @@ -407,20 +408,20 @@ static void LoadTable(void) u32 temp; // MCCMD レジスタ設定 - reg_MCCMD0 = 0x0000009f; - reg_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = 0x0000009f; + reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + 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,5, 0,0, 0, 0,0,0, 0)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - temp = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + temp = reg_HOTSW_MCD1; } OS_TPrintf("Load Table...\n"); @@ -434,20 +435,20 @@ static void LoadTable(void) static void ReadIDNormal(void) { // MCCMD レジスタ設定 - reg_MCCMD0 = 0x00000090; - reg_MCCMD1 = 0x00000000; + reg_HOTSW_MCCMD0 = 0x00000090; + reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + 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,7, 0,0, 0, 0,0,0, 2320)); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MCCNT1 & START_FLG_MASK){ - while(!(reg_MCCNT1 & READY_FLG_MASK)){} - s_cbData.id_nml = reg_MCD1; + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + s_cbData.id_nml = reg_HOTSW_MCD1; } } @@ -547,7 +548,7 @@ static void McPowerOn(void) // リセットをhighに (RESB = 1にする) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) | + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) | CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0)); // 10ms待ち start = OS_GetTick(); @@ -570,17 +571,17 @@ static void SetMCSCR(void) u32 pna_h = (u32)(s_cbData.vd >> 17); // SCR A - reg_MCSCR0 = pna_l; + reg_HOTSW_MCSCR0 = pna_l; // SCR B - reg_MCSCR1 = PNB_L_VALUE; + reg_HOTSW_MCSCR1 = PNB_L_VALUE; // [d0 -d6 ] -> SCR A // [d16-d22] -> SCR B - reg_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16); + reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16); // MCCNT1 レジスタ設定 (SCR = 1に) - reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) | + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) | CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0)); } @@ -664,7 +665,7 @@ static void InterruptCallbackCard(void) MI_CpuClear8(s_pSecureSegBuffer, s_SecureSegBufSize); // MC_CNT1を初期化 - reg_MCCNT1 = 0x0; + reg_HOTSW_MCCNT1 = 0x0; // カードロックIDの開放 OS_ReleaseLockID( s_cbData.lockID ); @@ -781,7 +782,7 @@ static void ShowRegisterData(void) OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT); OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1); OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2); - OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_MCCNT0); - OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_MCCNT1); + OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_HOTSW_MCCNT0); + OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_HOTSW_MCCNT1); OS_TPrintf("----------------------------------------------------------\n"); } diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 070871a1..c8e0cabe 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -5,256 +5,12 @@ #ifndef __MY_CARD_H__ #define __MY_CARD_H__ +#include + #ifdef __cplusplus extern "C" { #endif -#include -#include - -// Define ------------------------------------------------------------------- -#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ -#define DMA_NO 2 // -#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ -#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ - -#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値)) -#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値) -#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値) - -#define PNA_BASE_VALUE 0x60e8 // -#define PNB_L_VALUE 0x879b9b05 // -#define PNB_H_VALUE 0x5c // - -// コントロールレジスタ1 bit関連 -#define START_FLG_MASK 0x80000000 -#define READY_FLG_MASK 0x00800000 - -#define LATENCY1_SHIFT 0 -#define LATENCY1_MASK 0x00001fff - -#define DS_SHIFT 13 -#define DS_MASK 0x00002000 - -#define SE_SHIFT 14 -#define SE_MASK 0x00004000 - -#define SCR_SHIFT 15 -#define SCR_MASK 0x00008000 - -#define LATENCY2_SHIFT 16 -#define LATENCY2_MASK 0x003f0000 - -#define CS_SHIFT 22 -#define CS_MASK 0x00400000 - -#define RDY_SHIFT 23 -#define RDY_MASK 0x00800000 - -#define PC_SHIFT 24 -#define PC_MASK 0x07000000 - -#define CT_SHIFT 27 -#define CT_MASK 0x08000000 - -#define TRM_SHIFT 28 -#define TRM_MASK 0x10000000 - -#define RESB_SHIFT 29 -#define RESB_MASK 0x20000000 - -#define WR_SHIFT 30 -#define WR_MASK 0x40000000 - -#define START_SHIFT 31 -#define START_MASK 0x80000000 - -#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ - (u32)( \ - ((u32)(start)<< START_SHIFT) | \ - ((u32)(wr) << WR_SHIFT) | \ - ((u32)(resb) << RESB_SHIFT) | \ - ((u32)(rtm) << TRM_SHIFT) | \ - ((u32)(ct) << CT_SHIFT) | \ - ((u32)(pc) << PC_SHIFT) | \ - ((u32)(rdy) << RDY_SHIFT) | \ - ((u32)(cs) << CS_SHIFT) | \ - ((u32)(l2) << LATENCY2_SHIFT) | \ - ((u32)(scr) << SCR_SHIFT) | \ - ((u32)(se) << SE_SHIFT) | \ - ((u32)(ds) << DS_SHIFT) | \ - ((u32)(l1) << LATENCY1_SHIFT) \ - ) - -#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ - (u32)( ((start) ? START_MASK : 0) | \ - ((wr) ? WR_MASK : 0) | \ - ((resb) ? RESB_MASK : 0) | \ - ((rtm) ? TRM_MASK : 0) | \ - ((ct) ? CT_MASK : 0) | \ - ((pc) ? PC_MASK : 0) | \ - ((rdy) ? RDY_MASK : 0) | \ - ((cs) ? CS_MASK : 0) | \ - ((l2) ? LATENCY2_MASK : 0)| \ - ((scr) ? SCR_MASK : 0) | \ - ((se) ? SE_MASK : 0) | \ - ((ds) ? DS_MASK : 0) | \ - ((l1) ? LATENCY1_MASK : 0)) - - - -//#define USE_SLOT_A - -#ifdef USE_SLOT_A -// Slot A -#define SLOT_STATUS_MODE_SELECT_MSK 0x0c -#define SLOT_STATUS_MODE_00 0x00 -#define SLOT_STATUS_MODE_01 0x04 -#define SLOT_STATUS_MODE_10 0x08 -#define SLOT_STATUS_MODE_11 0x0c - -#define reg_MCCNT1 reg_MI_MCCNT1_A - -#define reg_MCCMD0 reg_MI_MCCMD0_A -#define reg_MCCMD1 reg_MI_MCCMD1_A - -#define reg_MCCNT0 reg_MI_MCCNT0_A -#define reg_MCCNT1 reg_MI_MCCNT1_A - -#define reg_MCD1 reg_MI_MCD1_A - -#define reg_MCSCR0 reg_MI_MCSCR0_A -#define reg_MCSCR1 reg_MI_MCSCR1_A -#define reg_MCSCR2 reg_MI_MCSCR2_A - -#else -// Slot B -#define SLOT_STATUS_MODE_SELECT_MSK 0xc0 -#define SLOT_STATUS_MODE_00 0x00 -#define SLOT_STATUS_MODE_01 0x40 -#define SLOT_STATUS_MODE_10 0x80 -#define SLOT_STATUS_MODE_11 0xc0 - -#define reg_MCCNT1 reg_MI_MCCNT1_B - -#define reg_MCCMD0 reg_MI_MCCMD0_B -#define reg_MCCMD1 reg_MI_MCCMD1_B - -#define reg_MCCNT0 reg_MI_MCCNT0_B -#define reg_MCCNT1 reg_MI_MCCNT1_B - -#define reg_MCD1 reg_MI_MCD1_B - -#define reg_MCSCR0 reg_MI_MCSCR0_B -#define reg_MCSCR1 reg_MI_MCSCR1_B -#define reg_MCSCR2 reg_MI_MCSCR2_B - -#endif - - -// Enum --------------------------------------------------------------------- -typedef enum CardTypeEx{ - DS_CARD_TYPE_1 = 0, - DS_CARD_TYPE_2, - TWL_CARD -}CardTypeEx; - -typedef enum NormalCommandType{ - RD_ID = 0, - RD_BSEG, - CHG_MODE -}NormalCommandType; - -typedef enum SecureCommandType{ - S_RD_ID = 0, - S_RD_SEG, - S_PNG_ON, - S_PNG_OFF, - S_CHG_MODE -}SecureCommandType; - -typedef enum GameCommandType{ - G_RD_ID = 0, - G_RD_PAGE -}GameCommandType; - -typedef enum CardType{ - CARD_DS_TYPE1 = 0, - CARD_DS_TYPE2, - CARD_TWL -}CardType; - -// union --------------------------------------------------------------------- -typedef union -{ - u64 dw; - u8 b[8]; -} -GCDCmd64; - -// ブートセグメントデータ -typedef union BootSegmentData -{ - ROM_Header rh; - u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)]; -} -BootSegmentData; - -// struct ------------------------------------------------------------------- -typedef struct BLOWFISH_CTX{ - u32 P[16 + 2]; - u32 S[4][256]; -} BLOWFISH_CTX; - -// カードブート時に必要な変数一式をまとめた構造体 -typedef struct CardBootData{ - u16 lockID; - - u32 vae; - u32 vbi; - u32 vd; - - u32 id_nml; - u32 id_scr; - u32 id_gam; - - u32 arm9StaticSize; - u32 arm7StaticSize; - u32 arm9LtdSize; - u32 arm7LtdSize; - - BOOL twlFlg; - - u32 keyBuf[KEY_BUF_SIZE]; - - u64 secureSegNum; - - CardTypeEx cardType; - - BootSegmentData *pBootSegBuf; - u32 *pSecureSegBuf; - - BLOWFISH_CTX keyTable; -} -CardBootData; - -// カード起動用関数 -typedef struct CardBootFunction { -// void (*ReadID_N)(CardBootData *cbd); // ノーマルモードのID読みは全タイプで共通 - void (*ReadBootSegment_N)(CardBootData *cbd); - void (*ChangeMode_N)(CardBootData *cbd); - - void (*ReadID_S)(CardBootData *cbd); - void (*ReadSegment_S)(CardBootData *cbd); - void (*SetPNG_S)(CardBootData *cbd); - void (*ChangeMode_S)(CardBootData *cbd); - - void (*ReadID_G)(CardBootData *cbd); - void (*ReadPage_G)(u32 addr, void* buf, u32 size); -} -CardBootFunction; - - // Function prototype ------------------------------------------------------- // 活栓挿抜処理の初期化 void HOTSW_Init(void);