mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・関数名修正 ・HotSwFinalize処理で、カードブートの場合はスロットの電源を落とさないように修正 ・HotSwFinalize処理で、カードをGameモードに移行させるときは、事前に読み込んだRomHeaderを使うように修正 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1292 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
16a895d5df
commit
ba4aa375de
@ -86,7 +86,7 @@ static HotSwState ReadSecureModeCardData(void);
|
|||||||
static void ClearCardFlgs(void);
|
static void ClearCardFlgs(void);
|
||||||
|
|
||||||
static void FinalizeHotSw(HotSwApliType type);
|
static void FinalizeHotSw(HotSwApliType type);
|
||||||
static BOOL ShiftGameMode(void);
|
static BOOL ChangeGameMode(void);
|
||||||
static void ClearUnnecessaryCardRegister(void);
|
static void ClearUnnecessaryCardRegister(void);
|
||||||
static void ClearAllCardRegister(void);
|
static void ClearAllCardRegister(void);
|
||||||
|
|
||||||
@ -408,7 +408,11 @@ static HotSwState LoadCardData(void)
|
|||||||
s_debuggerFlg = FALSE;
|
s_debuggerFlg = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
|
else{
|
||||||
|
s_debuggerFlg = FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// 初回のRomエミュレーション情報を使用
|
// 初回のRomエミュレーション情報を使用
|
||||||
if(HOTSWi_IsRomEmulation()){
|
if(HOTSWi_IsRomEmulation()){
|
||||||
OS_PutString("Read Emulation ROM\n");
|
OS_PutString("Read Emulation ROM\n");
|
||||||
@ -1612,9 +1616,9 @@ static void ClearCardFlgs(void)
|
|||||||
NANDアプリ起動なら
|
NANDアプリ起動なら
|
||||||
スロット電源OFFして、カードスロット関連のレジスタをクリアする
|
スロット電源OFFして、カードスロット関連のレジスタをクリアする
|
||||||
|
|
||||||
|
NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。
|
||||||
|
スレッドを殺す前に、IREQとDET割り込みを無効にしておく。
|
||||||
|
|
||||||
// NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。
|
|
||||||
// スレッドを殺す前に、IREQとDET割り込みを無効にしておく。
|
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static void FinalizeHotSw(HotSwApliType type)
|
static void FinalizeHotSw(HotSwApliType type)
|
||||||
{
|
{
|
||||||
@ -1622,41 +1626,38 @@ static void FinalizeHotSw(HotSwApliType type)
|
|||||||
BOOL isCardExist;
|
BOOL isCardExist;
|
||||||
|
|
||||||
if(finalized){
|
if(finalized){
|
||||||
OS_PutString("HotSw has been already finalized...");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
finalized = TRUE;
|
finalized = TRUE;
|
||||||
|
|
||||||
|
// ポーリングスレッドを消去
|
||||||
|
OS_KillThread( &HotSwThreadData.monitorThread, NULL );
|
||||||
|
|
||||||
|
if(type == HOTSW_APLITYPE_CARD){
|
||||||
|
ClearUnnecessaryCardRegister();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
isCardExist = HOTSW_IsCardExist();
|
isCardExist = HOTSW_IsCardExist();
|
||||||
|
|
||||||
McPowerOff();
|
McPowerOff();
|
||||||
|
|
||||||
// ポーリングスレッドを消去
|
|
||||||
OS_KillThread( &HotSwThreadData.monitorThread, NULL );
|
|
||||||
|
|
||||||
// カードがなかったら、レジスタクリアしてリターン
|
// カードがなかったら、レジスタクリアしてリターン
|
||||||
if(!isCardExist){
|
if(!isCardExist){
|
||||||
ClearAllCardRegister();
|
ClearAllCardRegister();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(type){
|
switch(type){
|
||||||
// Card Application Boot
|
|
||||||
case HOTSW_APLITYPE_CARD:
|
|
||||||
OS_PutString("Finalize Type : Card Application\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
// NTR NAND Application Boot
|
// NTR NAND Application Boot
|
||||||
case HOTSW_APLITYPE_NTR_NAND:
|
case HOTSW_APLITYPE_NTR_NAND:
|
||||||
OS_PutString("Finalize Type : NTR NAND Application\n");
|
OS_PutString("Finalize Type : NTR NAND Application\n");
|
||||||
|
|
||||||
if(!ShiftGameMode()){
|
if(!ChangeGameMode()){
|
||||||
ClearAllCardRegister();
|
ClearAllCardRegister();
|
||||||
|
|
||||||
McPowerOff();
|
McPowerOff();
|
||||||
|
|
||||||
OS_PutString("Failed To Shift Game Mode... Card Slot Power Off\n");
|
OS_PutString("Failed To Change Game Mode... Card Slot Power Off\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1674,6 +1675,7 @@ static void FinalizeHotSw(HotSwApliType type)
|
|||||||
McPowerOn();
|
McPowerOn();
|
||||||
|
|
||||||
s_cbData.modeType = HOTSW_MODE2;
|
s_cbData.modeType = HOTSW_MODE2;
|
||||||
|
(void)LoadTable();
|
||||||
(void)ReadBootSegNormal(&s_cbData);
|
(void)ReadBootSegNormal(&s_cbData);
|
||||||
|
|
||||||
OS_PutString("- game card on flg is TRUE : now Normal Mode\n");
|
OS_PutString("- game card on flg is TRUE : now Normal Mode\n");
|
||||||
@ -1682,12 +1684,11 @@ static void FinalizeHotSw(HotSwApliType type)
|
|||||||
|
|
||||||
// else
|
// else
|
||||||
default:
|
default:
|
||||||
OS_PutString("Finalize Type : Unexpected Type\n");
|
|
||||||
|
|
||||||
ClearAllCardRegister();
|
ClearAllCardRegister();
|
||||||
|
|
||||||
McPowerOff();
|
McPowerOff();
|
||||||
|
|
||||||
|
OS_PutString("Finalize Type : Unexpected Type\n");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1697,16 +1698,14 @@ static void FinalizeHotSw(HotSwApliType type)
|
|||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ShiftGameMode
|
Name: ChangeGameMode
|
||||||
|
|
||||||
Description: Nitro互換のRomHeaderを読んで、Game Modeに移行させる
|
Description: Nitro互換のRomHeaderを読んで、Game Modeに移行させる
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL ShiftGameMode(void)
|
static BOOL ChangeGameMode(void)
|
||||||
{
|
{
|
||||||
HotSwState state;
|
HotSwState state;
|
||||||
|
|
||||||
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
|
||||||
|
|
||||||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||||
CARD_LockRom(s_CardLockID);
|
CARD_LockRom(s_CardLockID);
|
||||||
#else
|
#else
|
||||||
@ -1716,40 +1715,16 @@ BOOL ShiftGameMode(void)
|
|||||||
McPowerOn();
|
McPowerOn();
|
||||||
|
|
||||||
s_cbData.pBootSegBuf = s_pBootSegBuffer;
|
s_cbData.pBootSegBuf = s_pBootSegBuffer;
|
||||||
|
|
||||||
s_cbData.modeType = HOTSW_MODE1;
|
s_cbData.modeType = HOTSW_MODE1;
|
||||||
|
|
||||||
|
// ---------------------- Normal Mode ----------------------
|
||||||
state = LoadTable();
|
state = LoadTable();
|
||||||
|
|
||||||
// ---------------------- Normal Mode ----------------------
|
|
||||||
state = ReadIDNormal(&s_cbData);
|
state = ReadIDNormal(&s_cbData);
|
||||||
|
|
||||||
// ARM9と排他制御
|
|
||||||
LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
|
||||||
|
|
||||||
// Boot Segment読み込み
|
|
||||||
// [TODO] Rom Header読み込む必要あるのか?挿したときに読み込まれた情報を使えばよい?
|
|
||||||
state = ReadBootSegNormal(&s_cbData);
|
state = ReadBootSegNormal(&s_cbData);
|
||||||
|
|
||||||
// CRCのチェック
|
|
||||||
// [TODO] Rom Header読み込まないんだったらCRCのチェックもいらない
|
|
||||||
{
|
|
||||||
u16 crc16;
|
|
||||||
|
|
||||||
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
|
|
||||||
crc16 = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
|
|
||||||
|
|
||||||
if( ( crc16 != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || ( 0xcf56 != crc16 ) ){
|
|
||||||
state = HOTSW_CRC_CHECK_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTR互換 Rom Headerをコピー
|
// NTR互換 Rom Headerをコピー
|
||||||
// [TODO] HW_CARD_ROM_HEADERだとデータが消されるっぽい
|
// MI_NDmaCopy(HOTSW_NDMA_NO, (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE);
|
||||||
MI_NDmaCopy(HOTSW_NDMA_NO, (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE);
|
|
||||||
|
|
||||||
OS_TPrintf("SYSM_CARD_ROM_HEADER_BAK( 0x%08x ) -> HW_CARD_ROM_HEADER( 0x%08x ) size : 0x%08x\n", SYSM_CARD_ROM_HEADER_BAK, HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE);
|
|
||||||
|
|
||||||
// カード読みパラメータ設定
|
|
||||||
if(s_debuggerFlg){
|
if(s_debuggerFlg){
|
||||||
s_cbData.cardType = ROM_EMULATION;
|
s_cbData.cardType = ROM_EMULATION;
|
||||||
s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
|
s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
|
||||||
@ -1760,27 +1735,19 @@ BOOL ShiftGameMode(void)
|
|||||||
}
|
}
|
||||||
s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
|
s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
|
||||||
|
|
||||||
// ARM9と排他制御ここまで
|
MI_CpuClear32(&s_cbData.keyTable, sizeof(BLOWFISH_CTX));
|
||||||
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
MI_CpuClear32(s_cbData.keyBuf, sizeof(s_cbData.keyBuf));
|
||||||
|
|
||||||
// KeyTable初期化
|
|
||||||
MakeBlowfishTableDS(&s_cbData, 8);
|
MakeBlowfishTableDS(&s_cbData, 8);
|
||||||
GenVA_VB_VD();
|
GenVA_VB_VD();
|
||||||
|
|
||||||
// Secure Modeへ
|
|
||||||
state = ChangeModeNormal(&s_cbData);
|
state = ChangeModeNormal(&s_cbData);
|
||||||
|
|
||||||
// ---------------------- Secure Mode ----------------------
|
// ---------------------- Secure Mode ----------------------
|
||||||
// PNG On 設定
|
|
||||||
state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
||||||
|
|
||||||
// 本体側符号化回路初期化
|
|
||||||
SetMCSCR();
|
SetMCSCR();
|
||||||
|
|
||||||
// [TODO] デバッグ用に読み込み。後で消す。
|
// [TODO] デバッグ用に読み込み。後で消す。
|
||||||
state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
||||||
|
|
||||||
// Game Modeへ
|
|
||||||
state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
||||||
|
|
||||||
// ---------------------- Game Mode ----------------------
|
// ---------------------- Game Mode ----------------------
|
||||||
@ -1822,12 +1789,6 @@ BOOL ShiftGameMode(void)
|
|||||||
|
|
||||||
static void ClearUnnecessaryCardRegister(void)
|
static void ClearUnnecessaryCardRegister(void)
|
||||||
{
|
{
|
||||||
// Chattering Coungerをクリア [d31-d16 Chattering Counter]
|
|
||||||
reg_MI_MC1 &= ~REG_MI_MC1_CC_MASK;
|
|
||||||
|
|
||||||
// Counter-Aをクリア
|
|
||||||
reg_MI_MC2 = REGCLEAR_16;
|
|
||||||
|
|
||||||
// HotSwで使っている割り込みを無効にする
|
// HotSwで使っている割り込みを無効にする
|
||||||
(void)OS_DisableIrq();
|
(void)OS_DisableIrq();
|
||||||
(void)OS_SetIrqMask( OS_GetIrqMask() & ~(HOTSW_IF_CARD_DET | HOTSW_IF_CARD_IREQ) );
|
(void)OS_SetIrqMask( OS_GetIrqMask() & ~(HOTSW_IF_CARD_DET | HOTSW_IF_CARD_IREQ) );
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user