(更新: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 void ClearCardFlgs(void);
static void FinalizeHotSw(HotSwApliType type);
static void FinalizeHotSw(HotSwCardState type);
static void ForceNitroModeToFinalize(void);
static void ForceNormalModeToFinalize(void);
static BOOL ChangeGameMode(void);
@ -1685,35 +1685,11 @@ static void ClearCardFlgs(void)
Name: FinalizeHotSw
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;
static BOOL finalized = FALSE;
BOOL isAccessible;
if(finalized){
return;
@ -1726,58 +1702,42 @@ static void FinalizeHotSw(HotSwApliType type)
// ポーリングスレッドを消去
OS_KillThread( &HotSwThreadData.monitorThread, NULL );
SYSMi_GetWork()->appCardID = 0;
if(type == HOTSW_APLITYPE_CARD){
SYSMi_GetWork()->appCardID = s_cbData.id_gam;
goto final;
}
isAccessible = HOTSW_IsCardAccessible();
McPowerOff();
// カードが無い(アクセスできない)なら、レジスタクリアしてリターン
if(!isAccessible){
SYSMi_GetWork()->appCardID = 0;
// カードアクセスできないなら、(一応)スロット電源OFFしてレジスタクリア
if(!HOTSW_IsCardAccessible()){
McPowerOff();
ClearAllCardRegister();
goto final;
}
switch(state){
// Slot Power Off
case HOTSW_CARD_STATE_POWER_OFF:
McPowerOff();
break;
switch(type){
// NTR NAND Application Boot
case HOTSW_APLITYPE_NTR_NAND:
OS_PutString("Finalize Type : NTR NAND Application\n");
// Normalモードに移行
case HOTSW_CARD_STATE_NORMAL_MODE:
ForceNormalModeToFinalize();
break;
// Gameモードに移行
case HOTSW_CARD_STATE_GAME_MODE:
ForceNitroModeToFinalize();
break;
// TWL NAND Application Boot
case HOTSW_APLITYPE_TWL_NAND:
OS_PutString("Finalize Type : TWL NAND Application\n");
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();
}
// 状態キープ
case HOTSW_CARD_STATE_KEEP:
SYSMi_GetWork()->appCardID = s_cbData.id_gam;
break;
// else
// else
default:
ClearAllCardRegister();
McPowerOff();
OS_PutString("Finalize Type : Unexpected Type\n");
break;
}
final:
ClearCardIrq();
@ -1823,6 +1783,8 @@ static void ForceNitroModeToFinalize(void)
*---------------------------------------------------------------------------*/
static void ForceNormalModeToFinalize(void)
{
CARD_LockRom(s_CardLockID);
McPowerOff(); // 既にOFFになっているため実質的には無効
McPowerOn();
@ -1830,6 +1792,9 @@ static void ForceNormalModeToFinalize(void)
(void)LoadTable();
(void)ReadIDNormal(&s_cbData);
(void)ReadBootSegNormal(&s_cbData);
CARD_UnlockRom(s_CardLockID);
s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
SYSMi_GetWork()->appCardID = s_cbData.id_nml;
@ -1848,6 +1813,7 @@ static BOOL ChangeGameMode(void)
CARD_LockRom(s_CardLockID);
McPowerOff();
McPowerOn();
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].finalize = (d.msg.finalize) ? TRUE : FALSE;
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);

View File

@ -181,7 +181,7 @@ void HOTSW_InvalidHotSW( void )
Description: PXI通信でARM7に活線挿抜Finalize処理を通知
*---------------------------------------------------------------------------*/
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
void HOTSW_FinalizeHotSWAsync( HotSwCardState apliType )
{
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 )
{
HotSwApliType hotsw_type;
HotSwCardState card_state;
ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF;
DC_StoreRange( head, sizeof(ROM_Header) );
@ -452,20 +453,25 @@ static void SYSMi_FinalizeHotSWAsync( TitleProperty *pBootTitle, ROM_Header *hea
case LAUNCHER_BOOTTYPE_TEMP:
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
{
hotsw_type = HOTSW_APLITYPE_NTR_NAND;
card_state = HOTSW_CARD_STATE_GAME_MODE;
}
break;
case LAUNCHER_BOOTTYPE_ROM:
default:
hotsw_type = HOTSW_APLITYPE_CARD;
card_state = HOTSW_CARD_STATE_KEEP;
break;
}
HOTSW_FinalizeHotSWAsync( hotsw_type );
HOTSW_FinalizeHotSWAsync( card_state );
}
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )

View File

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