・起動時に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 void ClearCardFlgs(void);
static void FinalizeHotSw(HotSwCardState state);
static void ForceNitroModeToFinalize(void);
static void FinalizeHotSw(HotSwCardState state, BOOL forceNtrMode);
static void ForceNitroModeToFinalize(BOOL forceNtrMode);
static void ForceNormalModeToFinalize(void);
static BOOL ChangeCardMode(BOOL isApplicationJump);
static BOOL ChangeCardMode(BOOL forceNtrMode);
static void ClearCardIrq(void);
static void ClearAllCardRegister(void);
@ -1653,7 +1653,7 @@ static void HotSwThread(void *arg)
}
if( msg->finalize == TRUE && msg->ctrl == FALSE) {
FinalizeHotSw( msg->state );
FinalizeHotSw( msg->state , msg->forceNtrMode );
}
#ifdef USE_WRAM_LOAD
@ -1792,7 +1792,7 @@ static void ClearCardFlgs(void)
Description:
*---------------------------------------------------------------------------*/
static void FinalizeHotSw(HotSwCardState state)
static void FinalizeHotSw(HotSwCardState state, BOOL forceNtrMode)
{
ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF;
static BOOL finalized = FALSE;
@ -1835,7 +1835,7 @@ static void FinalizeHotSw(HotSwCardState state)
// Gameモードに移行
case HOTSW_CARD_STATE_GAME_MODE:
ForceNitroModeToFinalize();
ForceNitroModeToFinalize( forceNtrMode );
break;
// 状態キープ
@ -1872,11 +1872,11 @@ final:
Description: Game Mode / Game2 Modeに移行させる
*---------------------------------------------------------------------------*/
static void ForceNitroModeToFinalize(void)
static void ForceNitroModeToFinalize(BOOL forceNtrMode)
{
s_cbData.id_gam = 0;
if(!ChangeCardMode( FALSE )){
if(!ChangeCardMode( forceNtrMode )){
ClearAllCardRegister();
McPowerOff();
@ -1919,7 +1919,7 @@ static void ForceNormalModeToFinalize(void)
Description: RomHeader / Secure (Secure2) CRCを計算
Gameモード / Game2モードに移行させる
*---------------------------------------------------------------------------*/
static BOOL ChangeCardMode(BOOL isApplicationJump)
static BOOL ChangeCardMode(BOOL forceNtrMode)
{
HotSwState state;
@ -1971,8 +1971,10 @@ static BOOL ChangeCardMode(BOOL isApplicationJump)
// TWLカード → Game2モード
// NTRカード → 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;
OS_PutString("---------- Game2 Mode...\n");
// ---------------------- Reset ----------------------
McPowerOff();
@ -1993,6 +1995,9 @@ static BOOL ChangeCardMode(BOOL isApplicationJump)
// Secure SegmentのCRC16の計算と格納
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);
@ -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].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);

View File

@ -44,7 +44,7 @@ static BOOL s_ReadBusy;
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
static u16 s_CardLockID;
static BOOL s_ForceNtrMode;
// ===========================================================================
// Function Describe
@ -70,6 +70,9 @@ void HOTSW_Init()
// Busyフラグを落としておく
s_ReadBusy = FALSE;
// 強制NTRモードフラグをOFF
s_ForceNtrMode = FALSE;
// PXI初期化
PXI_Init();
@ -190,6 +193,9 @@ void HOTSW_FinalizeHotSWAsync( HotSwCardState cardState )
msg.msg.finalize = TRUE;
msg.msg.ctrl = FALSE;
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)
{
@ -553,3 +559,14 @@ static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
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 "getSysMenuVersion.h"
#include <sysmenu/util_menuAppManager.h>
// extern data-----------------------------------------------------------------
// define data-----------------------------------------------------------------
@ -342,27 +344,55 @@ void TwlMain( void )
// startŽžŠÔŒvª5
MEASURE_START(start);
// 「ダイレクトブートでない」なら
if( !pBootTitle ) {
// NAND & カードアプリリスト取得
if( !SYSM_IsLogoDemoSkip() )
{
SYSM_MakeNandTitleListAsync(); // NANDアプリリストの作成取得はしていないので注意
}else
{
sp_titleList = SYSM_GetNandTitleList();
}
}else
{
// -------------- TWLカード検査用ランチャ --------------
// ・ロゴデモはスキップ
SYSM_SetLogoDemoSkip( TRUE );
// ・NANDアプリリスト作成関数は同期版を使う
sp_titleList = SYSM_GetNandTitleList();
// アプリジャンプでない場合
if( !pBootTitle ) {
// 特定のNANDアプリがあるかどうかチェック
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 )
{
SYSM_MakeNandTitleListMakerInfoAsync(); // アプリに引き渡すタイトルリスト作成用情報の作成
SYSM_MakeNandTitleListMakerInfoAsync();
}else
{
SYSM_MakeNandTitleListMakerInfo();
}
}
}
// -----------------------------------------------------
// endŽžŠÔŒvª5
MEASURE_RESULT( start, "GetNandTitleList : %dms\n" );

View File

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