(更新:Akabane Jumpei)

・RomHeaderのRomコントロールパラメータを利用してコマンドを設定するように修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@400 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2007-12-25 12:52:09 +00:00
parent 8f82386277
commit 94a16dfc96
6 changed files with 167 additions and 187 deletions

View File

@ -46,7 +46,7 @@ void ChangeModeSecure_DSType1(CardBootData *cbd);
void ReadIDGame_DSType1(CardBootData *cbd);
// DSカードType1のゲームモードの指定ページ読み込み
void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size);
void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
#ifdef __cplusplus
} /* extern "C" */

View File

@ -48,7 +48,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd);
#define ReadIDGame_DSType2 ReadIDGame_DSType1
// DSカードType2のゲームモードの指定ページ読み込み
void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size);
void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
//#define ReadPageGame_DSType2 ReadPageGame_DSType1
#ifdef __cplusplus

View File

@ -84,40 +84,12 @@ extern "C" {
#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 AddLatency2ToLatency1(param)\
( (((param) & LATENCY2_MASK) \
>> LATENCY2_SHIFT) \
+ ((param) & LATENCY1_MASK) \
)
#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
@ -170,7 +142,6 @@ extern "C" {
#endif
// Enum ---------------------------------------------------------------------
typedef enum CardTypeEx{
DS_CARD_TYPE_1 = 0,
@ -247,6 +218,8 @@ typedef struct CardBootData{
u32 arm9Ltd;
u32 arm7Ltd;
u32 secureLatency;
BOOL twlFlg;
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
@ -274,7 +247,7 @@ typedef struct CardBootFunction {
void (*ChangeMode_S)(CardBootData *cbd);
void (*ReadID_G)(CardBootData *cbd);
void (*ReadPage_G)(u32 addr, void* buf, u32 size);
void (*ReadPage_G)(CardBootData *cbd, u32 addr, void* buf, u32 size);
}
CardBootFunction;

View File

@ -42,12 +42,11 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に)
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));
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 PC = 100(8ページリード)に latency1 = 0x14)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x4 << PC_SHIFT) | (0x14 & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
@ -84,10 +83,9 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に)
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));
// MCCNT1 レジスタ設定 (START = 1 に)
reg_HOTSW_MCCNT1 = START_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
@ -165,10 +163,10 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
SetSecureCommand(S_RD_ID, cbd);
// MCCNT1 レジスタ設定
// (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に)
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));
// (START = 1 TRM = 1 PC = 111(ステータスリード) 後はRomヘッダ情報にお任せ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
| START_MASK | TRM_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK ;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -217,10 +215,10 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
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_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));
// (START = 1 TRM = 1 PC = 100(8ページリード) 後はRomヘッダ情報にお任せ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
| START_MASK | TRM_MASK | PC_MASK & (0x4 << PC_SHIFT) | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -242,10 +240,10 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd);
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -263,9 +261,9 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd);
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -284,10 +282,10 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd);
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -313,10 +311,10 @@ void ReadIDGame_DSType1(CardBootData *cbd)
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_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));
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
@ -326,7 +324,7 @@ void ReadIDGame_DSType1(CardBootData *cbd)
Description:
*---------------------------------------------------------------------------*/
void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
void ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{
u32 loop, counter=0;
u64 i, page;
@ -361,14 +359,14 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
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_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));
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
}
}
}
}

View File

@ -15,6 +15,8 @@
#define ROM_EMULATION_START_OFS 0x160
#define ROM_EMULATION_END_OFS 0x180
// Function prototype -------------------------------------------------------
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
static void SetMCSCR(void);
@ -42,10 +44,9 @@ void ReadRomEmulationData_DSType2(CardBootData *cbd)
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));
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
@ -103,9 +104,8 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
// 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));
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -193,21 +193,21 @@ 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_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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | SE_MASK | DS_MASK;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 1 PC = 111 Latency1 = 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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -256,14 +256,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
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);
// MCCNT1 レジスタ設定
// (START = 1 W/R = 0 TRM = 0 PC = 000(0ページ) CS = 1 Latency2 =0 SE = 1 DS = 1 Latency1 = 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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | SE_MASK | DS_MASK;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -275,11 +271,10 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// (START = 1 W/R = 0 TRM = 0 PC = 001(1ページリード) CS = 1 Latency2 = 0 SE = 1 DS = 1 Latency1 = 1540に)
// latency1 : 1540 --> Output Latency = 230us 転送クロックタイプ = 0で周期が150ns だから 230000 / 150 = 1533.33
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));
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
START_MASK | PC_MASK & (0x1 << PC_SHIFT) | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -305,24 +300,21 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_PNG_ON, cbd);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
// 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_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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -340,12 +332,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_PNG_OFF, cbd);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
// 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_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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -354,9 +343,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -375,13 +364,10 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
// コマンド作成・設定
SetSecureCommand(S_CHG_MODE, cbd);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
// 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_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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// 25ms待ち
OS_Sleep(COMMAND_DECRYPTION_WAIT);
@ -389,10 +375,10 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x0;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 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));
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
START_MASK | SE_MASK | DS_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -417,7 +403,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
Description:
*---------------------------------------------------------------------------*/
void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size)
void ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{
u32 loop, counter=0;
u64 i, page;
@ -455,10 +441,10 @@ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size)
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 = 1540 に)
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, 1540));
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}

View File

@ -275,6 +275,9 @@ BOOL HOTSW_Boot(void)
OS_TPrintf("TWL Card.\n");
s_cbData.twlFlg = TRUE;
}
// SecureコマンドのPNG_ONコマンドetc用のレイテンシを求める(Latency1とLatency2を足す)
s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
// Key Table初期化
GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8);
@ -363,7 +366,8 @@ void HOTSW_LoadStaticModule(void)
// バナーリード
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
OS_TPrintf(" - Banner Loading...\n");
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.banner_offset,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.banner_offset,
(u32 *)SYSM_CARD_BANNER_BUF,
sizeof(TWLBannerFile) );
SYSMi_GetWork()->isValidCardBanner = TRUE;
@ -378,18 +382,10 @@ void HOTSW_LoadStaticModule(void)
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
// Arm9の常駐モジュール残りを指定先に転送
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
// Hash値のチェック
if(CheckArm9HashValue()){
OS_PutString("◎Arm9 Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm9 Static Module Hash Check Error...\n");
}
OS_TPrintf(" - Arm7 Static Module Loading...\n");
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
@ -398,18 +394,11 @@ void HOTSW_LoadStaticModule(void)
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
// Arm7の常駐モジュールを指定先に転送
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
(u32 *)s_cbData.arm7Stc,
s_cbData.pBootSegBuf->rh.s.sub_size);
// Hash値のチェック
if(CheckArm7HashValue()){
OS_PutString("◎Arm7 Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm7 Static Module Hash Check Error...\n");
}
// TWLでのみロード
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
@ -421,23 +410,17 @@ void HOTSW_LoadStaticModule(void)
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
// Arm9の常駐モジュールを指定先に転送※TWLカード対応していないので、注意
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
(u32 *)SYSM_CARD_TWL_SECURE_BUF,
size);
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
}
// Hash値のチェック
if(CheckExtArm9HashValue()){
OS_PutString("◎Arm9 Ltd Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n");
}
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
@ -445,11 +428,36 @@ void HOTSW_LoadStaticModule(void)
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
// Arm7の常駐モジュールを指定先に転送
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
(u32 *)s_cbData.arm7Ltd,
s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
// Hash値のチェック
// Arm9常駐モジュール Hash値のチェック
if(CheckArm9HashValue()){
OS_PutString("◎Arm9 Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm9 Static Module Hash Check Error...\n");
}
// Arm7常駐モジュール Hash値のチェック
if(CheckArm7HashValue()){
OS_PutString("◎Arm7 Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm7 Static Module Hash Check Error...\n");
}
// Arm9拡張常駐モジュール Hash値のチェック
if(CheckExtArm9HashValue()){
OS_PutString("◎Arm9 Ltd Static Module Hash Check OK!\n");
}
else{
OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n");
}
// Arm7拡張常駐モジュール Hash値のチェック
if(CheckExtArm7HashValue()){
OS_PutString("◎Arm7 Ltd Static Module Hash Check OK!\n");
}
@ -550,9 +558,12 @@ static void LoadTable(void)
// 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(必要ないけど) に)
/* // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 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));
CNT1_FLD(1,0,0,0, 0,5, 0,0, 0, 0,0,0, 0));*/
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
@ -578,9 +589,9 @@ void ReadIDNormal(void)
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 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,0, 0, 0,0,0, 0));
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
@ -709,7 +720,7 @@ static BOOL CheckArm9HashValue(void)
// Hash値取得
SVC_HMACSHA1GetHash( &hash, sha1data );
return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.sub_static_digest );
return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_static_digest );
}
// ----------------------------------------------------------------------
@ -739,17 +750,30 @@ static BOOL CheckExtArm7HashValue(void)
static BOOL CheckExtArm9HashValue(void)
{
u8 sha1data[DIGEST_SIZE_SHA1];
u32 size;
BOOL retval = TRUE;
SVCHMACSHA1Context hash;
// Arm9拡張常駐モジュールのセキュア領域分のサイズを取得
size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
// クリア
MI_CpuClear8(sha1data, sizeof(sha1data));
// ARM7常駐モジュールのHash値照合
SVC_CalcHMACSHA1( sha1data,
(u32 *)s_cbData.arm9Ltd,
s_cbData.pBootSegBuf->rh.s.main_ltd_size,
s_digestDefaultKey,
sizeof(s_digestDefaultKey) );
// ハッシュ初期化
SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) );
// セキュア領域分UpDate
SVC_HMACSHA1Update( &hash, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size );
// ゲーム領域分UpDate (Arm9拡張常駐モジュールがSecure領域で収まってたらここは飛ばす)
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ){
SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_ltd_size - size );
}
// Hash値取得
SVC_HMACSHA1GetHash( &hash, sha1data );
return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest );
}
@ -811,9 +835,9 @@ static void McPowerOn(void)
// 10ms待ち
OS_Sleep(10);
// リセットをhighに (RESB = 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));
// リセットをhighに (RESB = 1にする)
reg_HOTSW_MCCNT1 = RESB_MASK;
// 10ms待ち
OS_Sleep(10);
@ -844,8 +868,7 @@ static void SetMCSCR(void)
reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
// MCCNT1 レジスタ設定 (SCR = 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));
reg_HOTSW_MCCNT1 = SCR_MASK;
}
/*---------------------------------------------------------------------------*