mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
8f82386277
commit
94a16dfc96
@ -46,7 +46,7 @@ void ChangeModeSecure_DSType1(CardBootData *cbd);
|
|||||||
void ReadIDGame_DSType1(CardBootData *cbd);
|
void ReadIDGame_DSType1(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードType1のゲームモードの指定ページ読み込み
|
// 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
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
|||||||
@ -48,7 +48,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd);
|
|||||||
#define ReadIDGame_DSType2 ReadIDGame_DSType1
|
#define ReadIDGame_DSType2 ReadIDGame_DSType1
|
||||||
|
|
||||||
// DSカードType2のゲームモードの指定ページ読み込み
|
// 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
|
//#define ReadPageGame_DSType2 ReadPageGame_DSType1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -84,40 +84,12 @@ extern "C" {
|
|||||||
#define START_SHIFT 31
|
#define START_SHIFT 31
|
||||||
#define START_MASK 0x80000000
|
#define START_MASK 0x80000000
|
||||||
|
|
||||||
#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \
|
#define AddLatency2ToLatency1(param)\
|
||||||
(u32)( \
|
( (((param) & LATENCY2_MASK) \
|
||||||
((u32)(start)<< START_SHIFT) | \
|
>> LATENCY2_SHIFT) \
|
||||||
((u32)(wr) << WR_SHIFT) | \
|
+ ((param) & LATENCY1_MASK) \
|
||||||
((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
|
//#define USE_SLOT_A
|
||||||
|
|
||||||
#ifdef USE_SLOT_A
|
#ifdef USE_SLOT_A
|
||||||
@ -170,7 +142,6 @@ extern "C" {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Enum ---------------------------------------------------------------------
|
// Enum ---------------------------------------------------------------------
|
||||||
typedef enum CardTypeEx{
|
typedef enum CardTypeEx{
|
||||||
DS_CARD_TYPE_1 = 0,
|
DS_CARD_TYPE_1 = 0,
|
||||||
@ -247,6 +218,8 @@ typedef struct CardBootData{
|
|||||||
u32 arm9Ltd;
|
u32 arm9Ltd;
|
||||||
u32 arm7Ltd;
|
u32 arm7Ltd;
|
||||||
|
|
||||||
|
u32 secureLatency;
|
||||||
|
|
||||||
BOOL twlFlg;
|
BOOL twlFlg;
|
||||||
|
|
||||||
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
|
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
|
||||||
@ -274,7 +247,7 @@ typedef struct CardBootFunction {
|
|||||||
void (*ChangeMode_S)(CardBootData *cbd);
|
void (*ChangeMode_S)(CardBootData *cbd);
|
||||||
|
|
||||||
void (*ReadID_G)(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;
|
CardBootFunction;
|
||||||
|
|
||||||
|
|||||||
@ -42,11 +42,10 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に)
|
// MCCNT1 レジスタ設定 (START = 1 PC = 100(8ページリード)に latency1 = 0x14)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x4 << PC_SHIFT) | (0x14 & LATENCY1_MASK);
|
||||||
CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -84,9 +83,8 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に)
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -165,9 +163,9 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
|
|||||||
SetSecureCommand(S_RD_ID, cbd);
|
SetSecureCommand(S_RD_ID, cbd);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
// (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に)
|
// (START = 1 TRM = 1 PC = 111(ステータスリード) 後はRomヘッダ情報にお任せ)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
|
||||||
CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320));
|
| START_MASK | TRM_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK ;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -217,9 +215,9 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
// (START = 1 W/R = 0 TRM = 1 PC = 100(8ページリード) CS = 1 Latency2 = 24(0x18) SE = 1 DS = 1 Latency1 = 2296(0x8f8)に)
|
// (START = 1 TRM = 1 PC = 100(8ページリード) 後はRomヘッダ情報にお任せ)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
|
||||||
CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296));
|
| START_MASK | TRM_MASK | PC_MASK & (0x4 << PC_SHIFT) | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -242,9 +240,9 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_PNG_ON, cbd);
|
SetSecureCommand(S_PNG_ON, cbd);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -263,9 +261,9 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_PNG_OFF, cbd);
|
SetSecureCommand(S_PNG_OFF, cbd);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -284,9 +282,9 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_CHG_MODE, cbd);
|
SetSecureCommand(S_CHG_MODE, cbd);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -313,9 +311,9 @@ void ReadIDGame_DSType1(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x000000B8;
|
reg_HOTSW_MCCMD0 = 0x000000B8;
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
|
||||||
CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 1));
|
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -326,7 +324,7 @@ void ReadIDGame_DSType1(CardBootData *cbd)
|
|||||||
|
|
||||||
Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
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;
|
u32 loop, counter=0;
|
||||||
u64 i, page;
|
u64 i, page;
|
||||||
@ -361,9 +359,9 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
|
|||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
|
||||||
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20));
|
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
#define ROM_EMULATION_START_OFS 0x160
|
#define ROM_EMULATION_START_OFS 0x160
|
||||||
#define ROM_EMULATION_END_OFS 0x180
|
#define ROM_EMULATION_END_OFS 0x180
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
|
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
|
||||||
static void SetMCSCR(void);
|
static void SetMCSCR(void);
|
||||||
@ -42,9 +44,8 @@ void ReadRomEmulationData_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x3e000000;
|
reg_HOTSW_MCCMD0 = 0x3e000000;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に)
|
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
|
||||||
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540));
|
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
@ -103,9 +104,8 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に)
|
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
|
||||||
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -193,9 +193,9 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_RD_ID, cbd);
|
SetSecureCommand(S_RD_ID, cbd);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 0 PC = 0 SE = 1 DS = 1 Latency1 = 0 に)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
||||||
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// 25ms待ち
|
// 25ms待ち
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
@ -204,9 +204,9 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 1 PC = 111 Latency1 = 0 に)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
||||||
CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0));
|
START_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -256,13 +256,9 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT1 レジスタ設定
|
||||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
||||||
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
// 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));
|
|
||||||
|
|
||||||
// 25ms待ち
|
// 25ms待ち
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
@ -275,10 +271,9 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 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に)
|
// MCCNT1 レジスタ設定
|
||||||
// latency1 : 1540 --> Output Latency = 230us 転送クロックタイプ = 0で周期が150ns だから 230000 / 150 = 1533.33
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
START_MASK | PC_MASK & (0x1 << PC_SHIFT) | SE_MASK | DS_MASK;
|
||||||
CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -305,12 +300,9 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_PNG_ON, cbd);
|
SetSecureCommand(S_PNG_ON, cbd);
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
||||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
// 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));
|
|
||||||
|
|
||||||
// 25ms待ち
|
// 25ms待ち
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
@ -319,9 +311,9 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
// MCCNT1 レジスタ設定 (START = 1 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)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -340,12 +332,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_PNG_OFF, cbd);
|
SetSecureCommand(S_PNG_OFF, cbd);
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
||||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
// 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));
|
|
||||||
|
|
||||||
// 25ms待ち
|
// 25ms待ち
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
@ -354,9 +343,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
// MCCNT1 レジスタ設定 (START = 1 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)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -375,12 +364,9 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
|
|||||||
// コマンド作成・設定
|
// コマンド作成・設定
|
||||||
SetSecureCommand(S_CHG_MODE, cbd);
|
SetSecureCommand(S_CHG_MODE, cbd);
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
||||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
// 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));
|
|
||||||
|
|
||||||
// 25ms待ち
|
// 25ms待ち
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
@ -389,9 +375,9 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
// MCCNT1 レジスタ設定 (START = 1 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)) |
|
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
||||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
START_MASK | SE_MASK | DS_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -417,7 +403,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
|
|||||||
|
|
||||||
Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
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;
|
u32 loop, counter=0;
|
||||||
u64 i, page;
|
u64 i, page;
|
||||||
@ -455,9 +441,9 @@ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size)
|
|||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 1540 に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
|
||||||
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 1540));
|
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
|
|||||||
@ -276,6 +276,9 @@ BOOL HOTSW_Boot(void)
|
|||||||
s_cbData.twlFlg = TRUE;
|
s_cbData.twlFlg = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SecureコマンドのPNG_ONコマンドetc用のレイテンシを求める(Latency1とLatency2を足す)
|
||||||
|
s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
|
||||||
|
|
||||||
// Key Table初期化
|
// Key Table初期化
|
||||||
GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8);
|
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 ) {
|
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
|
||||||
OS_TPrintf(" - Banner Loading...\n");
|
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,
|
(u32 *)SYSM_CARD_BANNER_BUF,
|
||||||
sizeof(TWLBannerFile) );
|
sizeof(TWLBannerFile) );
|
||||||
SYSMi_GetWork()->isValidCardBanner = TRUE;
|
SYSMi_GetWork()->isValidCardBanner = TRUE;
|
||||||
@ -378,19 +382,11 @@ 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);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
||||||
|
|
||||||
// Arm9の常駐モジュール残りを指定先に転送
|
// 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),
|
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
|
||||||
s_cbData.pBootSegBuf->rh.s.main_size - 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");
|
OS_TPrintf(" - Arm7 Static Module Loading...\n");
|
||||||
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
||||||
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
||||||
@ -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);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
||||||
|
|
||||||
// Arm7の常駐モジュールを指定先に転送
|
// 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,
|
(u32 *)s_cbData.arm7Stc,
|
||||||
s_cbData.pBootSegBuf->rh.s.sub_size);
|
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でのみロード
|
// TWLでのみロード
|
||||||
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_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 ) ?
|
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);
|
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カード対応していないので、注意!!)
|
// 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,
|
(u32 *)SYSM_CARD_TWL_SECURE_BUF,
|
||||||
size);
|
size);
|
||||||
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_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),
|
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size - 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");
|
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
|
||||||
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
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);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
||||||
|
|
||||||
// Arm7の常駐モジュールを指定先に転送
|
// 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,
|
(u32 *)s_cbData.arm7Ltd,
|
||||||
s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
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()){
|
if(CheckExtArm7HashValue()){
|
||||||
OS_PutString("◎Arm7 Ltd Static Module Hash Check OK!\n");
|
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に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
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)) |
|
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になるまでループ。
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
@ -578,9 +589,9 @@ void ReadIDNormal(void)
|
|||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 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)) |
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
||||||
CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 0));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
@ -709,7 +720,7 @@ static BOOL CheckArm9HashValue(void)
|
|||||||
// Hash値取得
|
// Hash値取得
|
||||||
SVC_HMACSHA1GetHash( &hash, sha1data );
|
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)
|
static BOOL CheckExtArm9HashValue(void)
|
||||||
{
|
{
|
||||||
u8 sha1data[DIGEST_SIZE_SHA1];
|
u8 sha1data[DIGEST_SIZE_SHA1];
|
||||||
|
u32 size;
|
||||||
BOOL retval = TRUE;
|
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));
|
MI_CpuClear8(sha1data, sizeof(sha1data));
|
||||||
|
|
||||||
// ARM7常駐モジュールのHash値照合
|
// ハッシュ初期化
|
||||||
SVC_CalcHMACSHA1( sha1data,
|
SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) );
|
||||||
(u32 *)s_cbData.arm9Ltd,
|
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size,
|
// セキュア領域分UpDate
|
||||||
s_digestDefaultKey,
|
SVC_HMACSHA1Update( &hash, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size );
|
||||||
sizeof(s_digestDefaultKey) );
|
|
||||||
|
// ゲーム領域分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 );
|
return SVC_CompareSHA1( sha1data, s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest );
|
||||||
}
|
}
|
||||||
@ -811,9 +835,9 @@ static void McPowerOn(void)
|
|||||||
// 10ms待ち
|
// 10ms待ち
|
||||||
OS_Sleep(10);
|
OS_Sleep(10);
|
||||||
|
|
||||||
// リセットをhighに (RESB = 1にする)
|
// リセットを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)) |
|
reg_HOTSW_MCCNT1 = RESB_MASK;
|
||||||
CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0));
|
|
||||||
// 10ms待ち
|
// 10ms待ち
|
||||||
OS_Sleep(10);
|
OS_Sleep(10);
|
||||||
|
|
||||||
@ -844,8 +868,7 @@ static void SetMCSCR(void)
|
|||||||
reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
|
reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (SCR = 1に)
|
// 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)) |
|
reg_HOTSW_MCCNT1 = SCR_MASK;
|
||||||
CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user