mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
edb8590d78
commit
f9c6e6d496
@ -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;
|
||||||
@ -1728,54 +1704,38 @@ static void FinalizeHotSw(HotSwApliType type)
|
|||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
isAccessible = HOTSW_IsCardAccessible();
|
|
||||||
|
|
||||||
McPowerOff();
|
McPowerOff();
|
||||||
|
|
||||||
// カードが無い(アクセスできない)なら、レジスタクリアしてリターン
|
|
||||||
if(!isAccessible){
|
|
||||||
ClearAllCardRegister();
|
ClearAllCardRegister();
|
||||||
goto final;
|
goto final;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(type){
|
switch(state){
|
||||||
// NTR NAND Application Boot
|
// Slot Power Off
|
||||||
case HOTSW_APLITYPE_NTR_NAND:
|
case HOTSW_CARD_STATE_POWER_OFF:
|
||||||
OS_PutString("Finalize Type : NTR NAND Application\n");
|
McPowerOff();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Normalモードに移行
|
||||||
|
case HOTSW_CARD_STATE_NORMAL_MODE:
|
||||||
|
ForceNormalModeToFinalize();
|
||||||
|
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:
|
||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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 )
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user