(更新:Akabane Jumpei)

HotSwのFinalizeを修正。遷移させる状態を引数にもらってFinalizeを行うようにした。


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1815 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-07-08 06:24:33 +00:00
parent edb8590d78
commit f9c6e6d496
4 changed files with 51 additions and 78 deletions

View File

@ -95,7 +95,7 @@ static BOOL isTwlModeLoad(void);
static HotSwState ReadSecureModeCardData(void); static HotSwState ReadSecureModeCardData(void);
static void ClearCardFlgs(void); static void ClearCardFlgs(void);
static void FinalizeHotSw(HotSwApliType type); static void FinalizeHotSw(HotSwCardState type);
static void ForceNitroModeToFinalize(void); static void ForceNitroModeToFinalize(void);
static void ForceNormalModeToFinalize(void); static void ForceNormalModeToFinalize(void);
static BOOL ChangeGameMode(void); static BOOL ChangeGameMode(void);
@ -1685,35 +1685,11 @@ static void ClearCardFlgs(void)
Name: FinalizeHotSw Name: FinalizeHotSw
Description: Description:
TWL NANDアプリ起動なら
NANDアプリヘッダ指定無し
OFF
NANDアプリヘッダのゲームカードONフラグ=1
NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする
NANDアプリヘッダのゲームカードNITROモードフラグ=1
NTR NANDアプリ同様
NTR NANDアプリ起動なら
OFFしてからGAMEモードに遷移させておく
NTR互換のRomHeaderのみ読み込んでおく()
NANDアプリ起動なら
OFFして
NANDアプリ起動時の終了処理が確認できたらBOOTAPIでKillThreadでスレッドを殺せるようにしておく
IREQとDET割り込みを無効にしておく
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void FinalizeHotSw(HotSwApliType type) static void FinalizeHotSw(HotSwCardState state)
{ {
ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF; ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF;
static BOOL finalized = FALSE; static BOOL finalized = FALSE;
BOOL isAccessible;
if(finalized){ if(finalized){
return; return;
@ -1726,58 +1702,42 @@ static void FinalizeHotSw(HotSwApliType type)
// ポーリングスレッドを消去 // ポーリングスレッドを消去
OS_KillThread( &HotSwThreadData.monitorThread, NULL ); OS_KillThread( &HotSwThreadData.monitorThread, NULL );
SYSMi_GetWork()->appCardID = 0; SYSMi_GetWork()->appCardID = 0;
if(type == HOTSW_APLITYPE_CARD){ // カードアクセスできないなら、(一応)スロット電源OFFしてレジスタクリア
SYSMi_GetWork()->appCardID = s_cbData.id_gam; if(!HOTSW_IsCardAccessible()){
goto final; McPowerOff();
}
isAccessible = HOTSW_IsCardAccessible();
McPowerOff();
// カードが無い(アクセスできない)なら、レジスタクリアしてリターン
if(!isAccessible){
ClearAllCardRegister(); ClearAllCardRegister();
goto final; goto final;
} }
switch(state){
// Slot Power Off
case HOTSW_CARD_STATE_POWER_OFF:
McPowerOff();
break;
switch(type){ // Normalモードに移行
// NTR NAND Application Boot case HOTSW_CARD_STATE_NORMAL_MODE:
case HOTSW_APLITYPE_NTR_NAND: ForceNormalModeToFinalize();
OS_PutString("Finalize Type : NTR NAND Application\n"); break;
// Gameモードに移行
case HOTSW_CARD_STATE_GAME_MODE:
ForceNitroModeToFinalize(); ForceNitroModeToFinalize();
break; break;
// TWL NAND Application Boot // 状態キープ
case HOTSW_APLITYPE_TWL_NAND: case HOTSW_CARD_STATE_KEEP:
OS_PutString("Finalize Type : TWL NAND Application\n"); SYSMi_GetWork()->appCardID = s_cbData.id_gam;
while(!SYSMi_GetWork()->flags.common.isHeaderLoadCompleted){
OS_Sleep(1);
}
// NANDアプリヘッダはコピー済み
if(rh->s.access_control.game_card_nitro_mode){
ForceNitroModeToFinalize();
}
else if(rh->s.access_control.game_card_on){
ForceNormalModeToFinalize();
}
break; break;
// else // else
default: default:
ClearAllCardRegister(); ClearAllCardRegister();
McPowerOff(); McPowerOff();
OS_PutString("Finalize Type : Unexpected Type\n");
break;
} }
final: final:
ClearCardIrq(); ClearCardIrq();
@ -1823,6 +1783,8 @@ static void ForceNitroModeToFinalize(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void ForceNormalModeToFinalize(void) static void ForceNormalModeToFinalize(void)
{ {
CARD_LockRom(s_CardLockID);
McPowerOff(); // 既にOFFになっているため実質的には無効 McPowerOff(); // 既にOFFになっているため実質的には無効
McPowerOn(); McPowerOn();
@ -1830,6 +1792,9 @@ static void ForceNormalModeToFinalize(void)
(void)LoadTable(); (void)LoadTable();
(void)ReadIDNormal(&s_cbData); (void)ReadIDNormal(&s_cbData);
(void)ReadBootSegNormal(&s_cbData); (void)ReadBootSegNormal(&s_cbData);
CARD_UnlockRom(s_CardLockID);
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;
SYSMi_GetWork()->appCardID = s_cbData.id_nml; SYSMi_GetWork()->appCardID = s_cbData.id_nml;
@ -1848,6 +1813,7 @@ static BOOL ChangeGameMode(void)
CARD_LockRom(s_CardLockID); CARD_LockRom(s_CardLockID);
McPowerOff();
McPowerOn(); McPowerOn();
s_cbData.pBootSegBuf = s_pBootSegBuffer; s_cbData.pBootSegBuf = s_pBootSegBuffer;
@ -2145,7 +2111,7 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].finalize = (d.msg.finalize) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].finalize = (d.msg.finalize) ? TRUE : FALSE;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].apli = (HotSwApliType)d.msg.bootType; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].apli = (HotSwCardState)d.msg.bootType;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK); OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK);

View File

@ -181,7 +181,7 @@ void HOTSW_InvalidHotSW( void )
Description: PXI通信でARM7に活線挿抜Finalize処理を通知 Description: PXI通信でARM7に活線挿抜Finalize処理を通知
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ) void HOTSW_FinalizeHotSWAsync( HotSwCardState apliType )
{ {
HotSwPxiMessageForArm7 msg; HotSwPxiMessageForArm7 msg;

View File

@ -442,7 +442,8 @@ static void SYSMi_DHTPhase1Callback(const void* addr, const void* orig_addr, u32
static void SYSMi_FinalizeHotSWAsync( TitleProperty *pBootTitle, ROM_Header *head ) static void SYSMi_FinalizeHotSWAsync( TitleProperty *pBootTitle, ROM_Header *head )
{ {
HotSwApliType hotsw_type; HotSwCardState card_state;
ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF;
DC_StoreRange( head, sizeof(ROM_Header) ); DC_StoreRange( head, sizeof(ROM_Header) );
@ -452,20 +453,25 @@ static void SYSMi_FinalizeHotSWAsync( TitleProperty *pBootTitle, ROM_Header *hea
case LAUNCHER_BOOTTYPE_TEMP: case LAUNCHER_BOOTTYPE_TEMP:
if ( head->s.platform_code & PLATFORM_CODE_FLAG_TWL ) if ( head->s.platform_code & PLATFORM_CODE_FLAG_TWL )
{ {
hotsw_type = HOTSW_APLITYPE_TWL_NAND; if(rh->s.access_control.game_card_nitro_mode){
card_state = HOTSW_CARD_STATE_GAME_MODE;
}
else if(rh->s.access_control.game_card_on){
card_state = HOTSW_CARD_STATE_NORMAL_MODE;
}
} }
else else
{ {
hotsw_type = HOTSW_APLITYPE_NTR_NAND; card_state = HOTSW_CARD_STATE_GAME_MODE;
} }
break; break;
case LAUNCHER_BOOTTYPE_ROM: case LAUNCHER_BOOTTYPE_ROM:
default: default:
hotsw_type = HOTSW_APLITYPE_CARD; card_state = HOTSW_CARD_STATE_KEEP;
break; break;
} }
HOTSW_FinalizeHotSWAsync( hotsw_type ); HOTSW_FinalizeHotSWAsync( card_state );
} }
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )

View File

@ -40,11 +40,12 @@ typedef enum ModeType{
HOTSW_MODE2 HOTSW_MODE2
} ModeType; } ModeType;
typedef enum HotSwApliType{ typedef enum HotSwCardState{
HOTSW_APLITYPE_CARD = 0, HOTSW_CARD_STATE_POWER_OFF = 0,
HOTSW_APLITYPE_NTR_NAND, HOTSW_CARD_STATE_NORMAL_MODE,
HOTSW_APLITYPE_TWL_NAND HOTSW_CARD_STATE_GAME_MODE,
} HotSwApliType; HOTSW_CARD_STATE_KEEP
} HotSwCardState; // ‹Ś HotSwApliType
// union ------------------------------------------------------------------- // union -------------------------------------------------------------------
// PXI用メッセージ // PXI用メッセージ
@ -80,7 +81,7 @@ typedef struct HotSwMessageForArm7{
BOOL finalize; BOOL finalize;
BOOL read; BOOL read;
HotSwMessageType type; HotSwMessageType type;
HotSwApliType apli; HotSwCardState apli;
} HotSwMessageForArm7; } HotSwMessageForArm7;
typedef struct HotSwMessageForArm9{ typedef struct HotSwMessageForArm9{
@ -108,7 +109,7 @@ void HOTSW_InvalidHotSWAsync( void );
void HOTSW_InvalidHotSW( void ); void HOTSW_InvalidHotSW( void );
// PXI通信でARM7に活線挿抜Finalize処理を通知 // PXI通信でARM7に活線挿抜Finalize処理を通知
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ); void HOTSW_FinalizeHotSWAsync( HotSwCardState apliType );
// 活線挿抜の許可/抑制の状態を返す // 活線挿抜の許可/抑制の状態を返す
BOOL HOTSW_isEnableHotSW(void); BOOL HOTSW_isEnableHotSW(void);