・起動時にNANDアプリを調べ、特定のGameCode(今のところNTRJ)のNANDアプリがあった場合は、そのアプリをダイレクトブートさせる

・上記のアプリがない場合は、通常通りランチャ起動


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20081031_TwlCard_Tester@2657 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-11-04 10:01:14 +00:00
parent f52700d03f
commit 9f52d8fb4e
4 changed files with 86 additions and 27 deletions

View File

@ -94,10 +94,10 @@ static BOOL isTwlModeLoad(void);
static HotSwState ReadSecureModeCardData(void); static HotSwState ReadSecureModeCardData(void);
static void ClearCardFlgs(void); static void ClearCardFlgs(void);
static void FinalizeHotSw(HotSwCardState state); static void FinalizeHotSw(HotSwCardState state, BOOL forceNtrMode);
static void ForceNitroModeToFinalize(void); static void ForceNitroModeToFinalize(BOOL forceNtrMode);
static void ForceNormalModeToFinalize(void); static void ForceNormalModeToFinalize(void);
static BOOL ChangeCardMode(BOOL isApplicationJump); static BOOL ChangeCardMode(BOOL forceNtrMode);
static void ClearCardIrq(void); static void ClearCardIrq(void);
static void ClearAllCardRegister(void); static void ClearAllCardRegister(void);
@ -1653,7 +1653,7 @@ static void HotSwThread(void *arg)
} }
if( msg->finalize == TRUE && msg->ctrl == FALSE) { if( msg->finalize == TRUE && msg->ctrl == FALSE) {
FinalizeHotSw( msg->state ); FinalizeHotSw( msg->state , msg->forceNtrMode );
} }
#ifdef USE_WRAM_LOAD #ifdef USE_WRAM_LOAD
@ -1792,7 +1792,7 @@ static void ClearCardFlgs(void)
Description: Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void FinalizeHotSw(HotSwCardState state) static void FinalizeHotSw(HotSwCardState state, BOOL forceNtrMode)
{ {
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;
@ -1835,7 +1835,7 @@ static void FinalizeHotSw(HotSwCardState state)
// Gameモードに移行 // Gameモードに移行
case HOTSW_CARD_STATE_GAME_MODE: case HOTSW_CARD_STATE_GAME_MODE:
ForceNitroModeToFinalize(); ForceNitroModeToFinalize( forceNtrMode );
break; break;
// 状態キープ // 状態キープ
@ -1872,11 +1872,11 @@ final:
Description: Game Mode / Game2 Modeに移行させる Description: Game Mode / Game2 Modeに移行させる
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void ForceNitroModeToFinalize(void) static void ForceNitroModeToFinalize(BOOL forceNtrMode)
{ {
s_cbData.id_gam = 0; s_cbData.id_gam = 0;
if(!ChangeCardMode( FALSE )){ if(!ChangeCardMode( forceNtrMode )){
ClearAllCardRegister(); ClearAllCardRegister();
McPowerOff(); McPowerOff();
@ -1919,7 +1919,7 @@ static void ForceNormalModeToFinalize(void)
Description: RomHeader / Secure (Secure2) CRCを計算 Description: RomHeader / Secure (Secure2) CRCを計算
Gameモード / Game2モードに移行させる Gameモード / Game2モードに移行させる
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static BOOL ChangeCardMode(BOOL isApplicationJump) static BOOL ChangeCardMode(BOOL forceNtrMode)
{ {
HotSwState state; HotSwState state;
@ -1971,9 +1971,11 @@ static BOOL ChangeCardMode(BOOL isApplicationJump)
// TWLカード → Game2モード // TWLカード → Game2モード
// NTRカード → Gameモード // NTRカード → Gameモード
// アプリジャンプ → Gameモード // アプリジャンプ → Gameモード
if(!isApplicationJump && s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ if(!forceNtrMode && s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){
s_cbData.modeType = HOTSW_MODE2; s_cbData.modeType = HOTSW_MODE2;
OS_PutString("---------- Game2 Mode...\n");
// ---------------------- Reset ---------------------- // ---------------------- Reset ----------------------
McPowerOff(); McPowerOff();
McPowerOn(); McPowerOn();
@ -1993,6 +1995,9 @@ static BOOL ChangeCardMode(BOOL isApplicationJump)
// Secure SegmentのCRC16の計算と格納 // Secure SegmentのCRC16の計算と格納
SYSMi_GetWork()->flags.hotsw.secure2CRC = SVC_GetCRC16( 65535, s_cbData.pSecure2SegBuf, SECURE_SEGMENT_SIZE ); SYSMi_GetWork()->flags.hotsw.secure2CRC = SVC_GetCRC16( 65535, s_cbData.pSecure2SegBuf, SECURE_SEGMENT_SIZE );
} }
else{
OS_PutString("---------- Game Mode...\n");
}
state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData); state = s_funcTable[s_isRomEmu].ChangeMode_S(&s_cbData);
@ -2297,6 +2302,8 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].state = (HotSwCardState)d.msg.cardState; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].state = (HotSwCardState)d.msg.cardState;
HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].forceNtrMode = (d.msg.forceNtrMode) ? TRUE : FALSE;
// メッセージ送信 // メッセージ送信
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

@ -44,7 +44,7 @@ static BOOL s_ReadBusy;
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM]; static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
static u16 s_CardLockID; static u16 s_CardLockID;
static BOOL s_ForceNtrMode;
// =========================================================================== // ===========================================================================
// Function Describe // Function Describe
@ -71,6 +71,9 @@ void HOTSW_Init()
// Busyフラグを落としておく // Busyフラグを落としておく
s_ReadBusy = FALSE; s_ReadBusy = FALSE;
// 強制NTRモードフラグをOFF
s_ForceNtrMode = FALSE;
// PXI初期化 // PXI初期化
PXI_Init(); PXI_Init();
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi); PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
@ -191,6 +194,9 @@ void HOTSW_FinalizeHotSWAsync( HotSwCardState cardState )
msg.msg.ctrl = FALSE; msg.msg.ctrl = FALSE;
msg.msg.cardState= (u8)cardState; msg.msg.cardState= (u8)cardState;
// 新しく強制NTRモードフラグを追加。ARM7に通知
msg.msg.forceNtrMode = s_ForceNtrMode;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS) while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{ {
// do nothing // do nothing
@ -553,3 +559,14 @@ static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
return CARD_READ_SUCCESS; return CARD_READ_SUCCESS;
} }
/*---------------------------------------------------------------------------*
Name: HOTSW_SetForceNitroMode
Description: NTRモードにカードを移行させるかどうかを設定
*---------------------------------------------------------------------------*/
void HOTSW_SetForceNitroMode(BOOL isNtrMode)
{
s_ForceNtrMode = isNtrMode;
}

View File

@ -33,6 +33,8 @@
#include <twl/na.h> #include <twl/na.h>
#include "getSysMenuVersion.h" #include "getSysMenuVersion.h"
#include <sysmenu/util_menuAppManager.h>
// extern data----------------------------------------------------------------- // extern data-----------------------------------------------------------------
// define data----------------------------------------------------------------- // define data-----------------------------------------------------------------
@ -343,26 +345,54 @@ void TwlMain( void )
// startŽžŠÔŒvª5 // startŽžŠÔŒvª5
MEASURE_START(start); MEASURE_START(start);
// 「ダイレクトブートでない」なら // -------------- TWLカード検査用ランチャ --------------
if( !pBootTitle ) { // ・ロゴデモはスキップ
// NAND & カードアプリリスト取得 SYSM_SetLogoDemoSkip( TRUE );
if( !SYSM_IsLogoDemoSkip() )
{ // ・NANDアプリリスト作成関数は同期版を使う
SYSM_MakeNandTitleListAsync(); // NANDアプリリストの作成取得はしていないので注意 sp_titleList = SYSM_GetNandTitleList();
}else
{ // アプリジャンプでない場合
sp_titleList = SYSM_GetNandTitleList(); if( !pBootTitle ) {
} // 特定のNANDアプリがあるかどうかチェック
}else u32 i;
{ u32 index = 0;
BOOL isCheckProgram = FALSE;
for(i = 0; i < LAUNCHER_TITLE_LIST_NUM; i++){
TitleID_HiLo tempID = *(TitleID_HiLo *)(&sp_titleList[i].titleID);
if(sp_titleList[i].titleID){
// 特定のNANDアプリがあった場合は
if(tempID.Lo[0] == 'J' && tempID.Lo[1] == 'R' && tempID.Lo[2] == 'T' && tempID.Lo[3] == 'N'){
isCheckProgram = TRUE;
index = i;
}
}
}
// ・NANDアプリに検査プログラムがある → NANDアプリをダイレクトブート
// ・NANDアプリに検査プログラムがない → ランチャ起動
if(isCheckProgram){
pBootTitle = &sp_titleList[index];
pBootTitle->flags.isLogoSkip = TRUE;
}
}
// アプリジャンプの場合
else {
// ・検査プログラム起動かつカードをNTRモードに移行
HOTSW_SetForceNitroMode(TRUE);
// アプリに引き渡すタイトルリスト作成用情報の作成
if( !pBootTitle->flags.isLogoSkip ) if( !pBootTitle->flags.isLogoSkip )
{ {
SYSM_MakeNandTitleListMakerInfoAsync(); // アプリに引き渡すタイトルリスト作成用情報の作成 SYSM_MakeNandTitleListMakerInfoAsync();
}else }else
{ {
SYSM_MakeNandTitleListMakerInfo(); SYSM_MakeNandTitleListMakerInfo();
} }
} }
// -----------------------------------------------------
// endŽžŠÔŒvª5 // endŽžŠÔŒvª5
MEASURE_RESULT( start, "GetNandTitleList : %dms\n" ); MEASURE_RESULT( start, "GetNandTitleList : %dms\n" );

View File

@ -72,8 +72,9 @@ typedef union HotSwPxiMessageForArm7{
u32 ctrl :1; u32 ctrl :1;
u32 finalize :1; u32 finalize :1;
u32 read :1; u32 read :1;
u32 forceNtrMode :1;
u32 cardState:8; u32 cardState:8;
u32 :20; u32 :19;
} msg; } msg;
u32 data; u32 data;
} HotSwPxiMessageForArm7; } HotSwPxiMessageForArm7;
@ -97,6 +98,7 @@ typedef struct HotSwMessageForArm7{
BOOL ctrl; BOOL ctrl;
BOOL finalize; BOOL finalize;
BOOL read; BOOL read;
BOOL forceNtrMode;
HotSwMessageType type; HotSwMessageType type;
HotSwCardState state; HotSwCardState state;
} HotSwMessageForArm7; } HotSwMessageForArm7;
@ -140,6 +142,9 @@ BOOL HOTSW_isFinalized(void);
// 活線挿抜処理中かどうかを返す // 活線挿抜処理中かどうかを返す
BOOL HOTSW_isBusyHotSW(void); BOOL HOTSW_isBusyHotSW(void);
// 強制NTRモード移行かどうかを設定(TWLカード検査用ランチャ用関数)
void HOTSW_SetForceNitroMode(BOOL isNtrMode);
#ifdef USE_WRAM_LOAD #ifdef USE_WRAM_LOAD
// 活栓挿抜処理の初期化 // 活栓挿抜処理の初期化
void HOTSW_Init(); void HOTSW_Init();