mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・起動時に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:
parent
f52700d03f
commit
9f52d8fb4e
@ -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,8 +1971,10 @@ 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();
|
||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
@ -70,6 +70,9 @@ void HOTSW_Init()
|
|||||||
|
|
||||||
// Busyフラグを落としておく
|
// Busyフラグを落としておく
|
||||||
s_ReadBusy = FALSE;
|
s_ReadBusy = FALSE;
|
||||||
|
|
||||||
|
// 強制NTRモードフラグをOFF
|
||||||
|
s_ForceNtrMode = FALSE;
|
||||||
|
|
||||||
// PXI初期化
|
// PXI初期化
|
||||||
PXI_Init();
|
PXI_Init();
|
||||||
@ -190,6 +193,9 @@ void HOTSW_FinalizeHotSWAsync( HotSwCardState cardState )
|
|||||||
msg.msg.finalize = TRUE;
|
msg.msg.finalize = TRUE;
|
||||||
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)
|
||||||
{
|
{
|
||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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-----------------------------------------------------------------
|
||||||
@ -342,27 +344,55 @@ 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" );
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user