mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・カードブート実装中。(ARM9Ltd,ARM7Ltdのイメージがうまく読めていない。)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@248 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
eae31e1a28
commit
6acdecc63d
@ -103,6 +103,7 @@ TwlSpMain(void)
|
|||||||
|
|
||||||
// OS 初期化
|
// OS 初期化
|
||||||
OS_Init();
|
OS_Init();
|
||||||
|
OS_InitTick();
|
||||||
PrintDebugInfo();
|
PrintDebugInfo();
|
||||||
|
|
||||||
// NVRAM からユーザー情報読み出し
|
// NVRAM からユーザー情報読み出し
|
||||||
@ -110,6 +111,9 @@ TwlSpMain(void)
|
|||||||
|
|
||||||
// Cold/Hotスタート判定
|
// Cold/Hotスタート判定
|
||||||
ReadResetParameter();
|
ReadResetParameter();
|
||||||
|
|
||||||
|
// ※カード電源ONして、ROMヘッダのみリード&チェックくらいはやっておきたい
|
||||||
|
|
||||||
SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
|
SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
|
||||||
|
|
||||||
// ヒープ領域設定
|
// ヒープ領域設定
|
||||||
@ -173,10 +177,9 @@ TwlSpMain(void)
|
|||||||
|
|
||||||
// 活栓挿抜機能初期化
|
// 活栓挿抜機能初期化
|
||||||
Cardm_Init();
|
Cardm_Init();
|
||||||
|
|
||||||
// カードがささっていたらブート開始
|
// カードがささっていたらブート開始
|
||||||
Card_Boot();
|
(void)Card_Boot();
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
OS_Halt();
|
OS_Halt();
|
||||||
|
|||||||
@ -16,11 +16,8 @@
|
|||||||
//#include <istdbglib.h>
|
//#include <istdbglib.h>
|
||||||
|
|
||||||
#include <nitro/card/types.h>
|
#include <nitro/card/types.h>
|
||||||
#include <sysmenu/card/common/blowfish.h>
|
#include <sysmenu.h>
|
||||||
#include <sysmenu/card/common/Card.h>
|
|
||||||
#include <sysmenu/card/common/dsCardType1.h>
|
|
||||||
#include <sysmenu/card/common/dsCardType2.h>
|
|
||||||
#include <sysmenu/memorymap.h>
|
|
||||||
// define -------------------------------------------------------------------
|
// define -------------------------------------------------------------------
|
||||||
#define STACK_SIZE 1024 // スタックサイズ
|
#define STACK_SIZE 1024 // スタックサイズ
|
||||||
#define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
#define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
||||||
@ -120,10 +117,10 @@ void Cardm_Init(void)
|
|||||||
OS_WakeupThreadDirect(&s_MCThread);
|
OS_WakeupThreadDirect(&s_MCThread);
|
||||||
|
|
||||||
// Boot Segment バッファの設定
|
// Boot Segment バッファの設定
|
||||||
Card_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BUFFER, 0x1000 );
|
Card_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE );
|
||||||
|
|
||||||
// Secure Segment バッファの設定
|
// Secure Segment バッファの設定
|
||||||
Card_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUFFER, SECURE_AREA_SIZE );
|
Card_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
// モジュールロード用スレッドの生成
|
// モジュールロード用スレッドの生成
|
||||||
/* OS_CreateThread(&s_MLThread,
|
/* OS_CreateThread(&s_MLThread,
|
||||||
@ -155,7 +152,8 @@ BOOL Card_Boot(void)
|
|||||||
{
|
{
|
||||||
s32 tempLockID;
|
s32 tempLockID;
|
||||||
BOOL retval = TRUE;
|
BOOL retval = TRUE;
|
||||||
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
OS_TPrintf("---------------- Card Boot Start ---------------\n");
|
OS_TPrintf("---------------- Card Boot Start ---------------\n");
|
||||||
// カード電源ON
|
// カード電源ON
|
||||||
McPowerOn();
|
McPowerOn();
|
||||||
@ -196,58 +194,92 @@ BOOL Card_Boot(void)
|
|||||||
s_cbData.cardType = DS_CARD_TYPE_1;
|
s_cbData.cardType = DS_CARD_TYPE_1;
|
||||||
OS_TPrintf("Card Type1\n");
|
OS_TPrintf("Card Type1\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// ※最低限ARM9と排他制御しないといけない範囲はこれだけ
|
||||||
|
u16 id = (u16)OS_GetLockID();
|
||||||
|
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
|
||||||
|
|
||||||
|
// Boot Segment読み込み
|
||||||
|
s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
|
||||||
|
|
||||||
|
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
|
||||||
|
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
|
||||||
|
OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n",
|
||||||
|
SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 );
|
||||||
|
|
||||||
|
if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) ||
|
||||||
|
( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){
|
||||||
|
retval = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSMi_GetWork()->isExistCard = retval;
|
||||||
|
SYSMi_GetWork()->isCardStateChanged = TRUE; // 本当は挿抜単位でここを立てる。
|
||||||
|
|
||||||
|
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
|
||||||
|
OS_ReleaseLockID( id );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( retval ) {
|
||||||
|
// NTRカードかTWLカードか
|
||||||
|
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){
|
||||||
|
OS_TPrintf("TWL Card.\n");
|
||||||
|
s_cbData.twlFlg = TRUE;
|
||||||
|
}
|
||||||
|
// Key Table初期化
|
||||||
|
GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8);
|
||||||
|
|
||||||
|
// セキュアモードに移行
|
||||||
|
s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
|
||||||
|
|
||||||
|
// ---------------------- Secure Mode ----------------------
|
||||||
|
// PNG設定
|
||||||
|
s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
||||||
|
|
||||||
|
// DS側符号生成回路初期値設定 (レジスタ設定)
|
||||||
|
SetMCSCR();
|
||||||
|
|
||||||
|
// ID読み込み
|
||||||
|
s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
||||||
|
|
||||||
|
// Secure領域のSegment読み込み
|
||||||
|
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
|
||||||
|
|
||||||
|
// Arm9の常駐モジュールを指定先に転送
|
||||||
|
LoadStaticModule_Secure();
|
||||||
|
// ゲームモードに移行
|
||||||
|
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
||||||
|
|
||||||
|
// ---------------------- Game Mode ----------------------
|
||||||
|
// ID読み込み
|
||||||
|
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
||||||
|
// 常駐モジュール残りを指定先に転送
|
||||||
|
Card_LoadStaticModule();
|
||||||
|
|
||||||
|
// デバッグ出力
|
||||||
|
ShowRomHeaderData();
|
||||||
|
}
|
||||||
|
|
||||||
// Boot Segment読み込み
|
// ※最終的にはカードIDをHW_BOOT_CHECK_INFO_BUFに入れないと、アプリ起動後のカード抜け処理が上手く動作しないので注意。
|
||||||
s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
|
// 今はスロットBを使用しているので、ノーケアでOK.
|
||||||
|
// *(u32 *)HW_BOOT_CHECK_INFO_BUF = s_cbData.id_gam;
|
||||||
// NTRカードかTWLカードか
|
|
||||||
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){
|
|
||||||
OS_TPrintf("TWL Card.\n");
|
|
||||||
s_cbData.twlFlg = TRUE;
|
|
||||||
}
|
|
||||||
// Key Table初期化
|
|
||||||
GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8);
|
|
||||||
|
|
||||||
// セキュアモードに移行
|
|
||||||
s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
|
|
||||||
|
|
||||||
// ---------------------- Secure Mode ----------------------
|
|
||||||
// PNG設定
|
|
||||||
s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
|
||||||
|
|
||||||
// DS側符号生成回路初期値設定 (レジスタ設定)
|
|
||||||
SetMCSCR();
|
|
||||||
|
|
||||||
// ID読み込み
|
|
||||||
s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
|
||||||
|
|
||||||
// Secure領域のSegment読み込み
|
|
||||||
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
|
|
||||||
|
|
||||||
// Arm9の常駐モジュールを指定先に転送
|
|
||||||
LoadStaticModule_Secure();
|
|
||||||
// ゲームモードに移行
|
|
||||||
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
|
||||||
|
|
||||||
// ---------------------- Game Mode ----------------------
|
|
||||||
// ID読み込み
|
|
||||||
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
|
||||||
|
|
||||||
// 常駐モジュール残りを指定先に転送
|
|
||||||
Card_LoadStaticModule();
|
|
||||||
|
|
||||||
// デバッグ出力
|
|
||||||
ShowRomHeaderData();
|
|
||||||
|
|
||||||
OS_TPrintf("-----------------------------------------------\n\n");
|
OS_TPrintf("-----------------------------------------------\n\n");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
OS_TPrintf("Card Not Found\n");
|
OS_TPrintf("Card Not Found\n");
|
||||||
|
retval = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// カードロックIDの開放
|
// カードロックIDの開放
|
||||||
OS_ReleaseLockID( s_cbData.lockID );
|
OS_ReleaseLockID( s_cbData.lockID );
|
||||||
|
|
||||||
|
OS_TPrintf( "Load Card Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
|
|
||||||
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
SYSMi_GetWork()->is1stCardChecked = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,6 +292,18 @@ BOOL Card_Boot(void)
|
|||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
void Card_LoadStaticModule(void)
|
void Card_LoadStaticModule(void)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
// バナーリード
|
||||||
|
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
|
||||||
|
OS_TPrintf(" - Banner Loading...\n");
|
||||||
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.banner_offset,
|
||||||
|
(u32 *)SYSM_CARD_BANNER_BUF,
|
||||||
|
sizeof(TWLBannerFile) );
|
||||||
|
SYSMi_GetWork()->isValidCardBanner = TRUE;
|
||||||
|
SYSMi_GetWork()->is1stCardChecked = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
OS_TPrintf(" - Arm9 Static Module Loading...\n");
|
OS_TPrintf(" - Arm9 Static Module Loading...\n");
|
||||||
// Arm9の常駐モジュール残りを指定先に転送
|
// Arm9の常駐モジュール残りを指定先に転送
|
||||||
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
||||||
@ -271,8 +315,32 @@ void Card_LoadStaticModule(void)
|
|||||||
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
|
||||||
(u32 *)((u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address),
|
(u32 *)((u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address),
|
||||||
s_cbData.pBootSegBuf->rh.s.sub_size);
|
s_cbData.pBootSegBuf->rh.s.sub_size);
|
||||||
|
|
||||||
|
// TWLでのみロード
|
||||||
|
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
||||||
|
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
|
||||||
|
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
|
||||||
|
OS_TPrintf(" - Arm9 Ltd. Static Module Loading...\n");
|
||||||
|
// Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
||||||
|
|
||||||
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
|
||||||
|
(u32 *)SYSM_CARD_TWL_SECURE_BUF,
|
||||||
|
size);
|
||||||
|
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
|
||||||
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
|
||||||
|
(u32 *)((u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address + SECURE_SEGMENT_SIZE),
|
||||||
|
s_cbData.pBootSegBuf->rh.s.main_ltd_size - SECURE_SEGMENT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
|
||||||
|
// Arm7の常駐モジュールを指定先に転送
|
||||||
|
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
|
||||||
|
(u32 *)((u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address),
|
||||||
|
s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
* Card_SetBootSegmentBuffer関数
|
* Card_SetBootSegmentBuffer関数
|
||||||
*
|
*
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
// define data-----------------------------------------------------------------
|
// define data-----------------------------------------------------------------
|
||||||
|
|
||||||
typedef struct BannerCheckParam {
|
typedef struct BannerCheckParam {
|
||||||
u8 *srcp;
|
u8 *pSrc;
|
||||||
u32 size;
|
u32 size;
|
||||||
}BannerCheckParam;
|
}BannerCheckParam;
|
||||||
|
|
||||||
@ -38,13 +38,17 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void );
|
|||||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
||||||
static void SYSMi_WriteAdjustRTC( void );
|
static void SYSMi_WriteAdjustRTC( void );
|
||||||
static int SYSMi_IsValidCard( void );
|
static int SYSMi_IsValidCard( void );
|
||||||
static void SYSMi_ReadCardBannerFile( void );
|
|
||||||
static BOOL SYSMi_CheckEntryAddress( void );
|
static BOOL SYSMi_CheckEntryAddress( void );
|
||||||
static void SYSMi_CheckCardCloneBoot( void );
|
static void SYSMi_CheckCardCloneBoot( void );
|
||||||
static void SYSMi_CheckRTC( void );
|
static void SYSMi_CheckRTC( void );
|
||||||
|
|
||||||
static s32 ReadFile(FSFile* pf, void* buffer, s32 size);
|
static s32 ReadFile(FSFile* pf, void* buffer, s32 size);
|
||||||
|
|
||||||
|
static void SYSMi_Relocate( void );
|
||||||
|
static BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner );
|
||||||
|
static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner );
|
||||||
|
|
||||||
|
|
||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
void *(*SYSM_Alloc)( u32 size );
|
void *(*SYSM_Alloc)( u32 size );
|
||||||
void (*SYSM_Free )( void *ptr );
|
void (*SYSM_Free )( void *ptr );
|
||||||
@ -55,18 +59,11 @@ SYSM_work *pSysm; //
|
|||||||
|
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
static OSThread thread;
|
static OSThread thread;
|
||||||
|
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
|
||||||
|
|
||||||
static BOOL s_isBanner = FALSE;
|
|
||||||
static NTRBannerFile s_bannerBuf;
|
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
|
|
||||||
static BannerCheckParam s_bannerCheckList[ NTR_BNR_VER_MAX ] = {
|
|
||||||
{ (u8 *)&s_bannerBuf.v1, sizeof( BannerFileV1 ) },
|
|
||||||
{ (u8 *)&s_bannerBuf.v2, sizeof( BannerFileV2 ) },
|
|
||||||
{ (u8 *)&s_bannerBuf.v3, sizeof( BannerFileV3 ) },
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
//
|
//
|
||||||
@ -120,6 +117,11 @@ TitleProperty *SYSM_ReadParameters( void )
|
|||||||
while( !SYSMi_GetWork()->isARM9Start ) {
|
while( !SYSMi_GetWork()->isARM9Start ) {
|
||||||
SVC_WaitByLoop( 0x1000 );
|
SVC_WaitByLoop( 0x1000 );
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
while( !SYSMi_GetWork()->is1stCardChecked ) {
|
||||||
|
SVC_WaitByLoop( 0x1000 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
// リセットパラメータの判定(リセットパラメータが有効かどうかは、ARM7でやってくれている)
|
// リセットパラメータの判定(リセットパラメータが有効かどうかは、ARM7でやってくれている)
|
||||||
@ -158,7 +160,6 @@ TitleProperty *SYSM_ReadParameters( void )
|
|||||||
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
|
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
|
||||||
|
|
||||||
// SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
|
// SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
|
||||||
// SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
|
|
||||||
|
|
||||||
//NAMの初期化
|
//NAMの初期化
|
||||||
//NAM_Init(AllocForNAM,FreeForNAM);
|
//NAM_Init(AllocForNAM,FreeForNAM);
|
||||||
@ -187,6 +188,9 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
|
|||||||
if( SYSM_GetCardTitleProperty( &s_bootTitle ) ) { // ※未実装
|
if( SYSM_GetCardTitleProperty( &s_bootTitle ) ) { // ※未実装
|
||||||
s_bootTitle.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
|
s_bootTitle.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
|
||||||
s_bootTitle.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
|
s_bootTitle.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
|
||||||
|
s_bootTitle.flags.media = TITLE_MEDIA_CARD;
|
||||||
|
s_bootTitle.flags.isValid = TRUE;
|
||||||
|
// titleIDは"0"(カード)
|
||||||
SYSM_SetLogoDemoSkip( TRUE );
|
SYSM_SetLogoDemoSkip( TRUE );
|
||||||
return &s_bootTitle;
|
return &s_bootTitle;
|
||||||
}
|
}
|
||||||
@ -202,6 +206,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
|
|||||||
!TSD_IsSetUserColor() ||
|
!TSD_IsSetUserColor() ||
|
||||||
!TSD_IsSetNickname() ) {
|
!TSD_IsSetNickname() ) {
|
||||||
s_bootTitle.titleID = TITLE_ID_MACHINE_SETTINGS;
|
s_bootTitle.titleID = TITLE_ID_MACHINE_SETTINGS;
|
||||||
|
s_bootTitle.flags.media = TITLE_MEDIA_NAND;
|
||||||
|
s_bootTitle.flags.isValid = TRUE;
|
||||||
return &s_bootTitle;
|
return &s_bootTitle;
|
||||||
}
|
}
|
||||||
#endif // ENABLE_INITIAL_SETTINGS_
|
#endif // ENABLE_INITIAL_SETTINGS_
|
||||||
@ -212,10 +218,47 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
|
|||||||
|
|
||||||
|
|
||||||
// カードタイトルの取得
|
// カードタイトルの取得
|
||||||
int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
|
BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
|
||||||
{
|
{
|
||||||
#pragma unused( pTitleList_Card )
|
BOOL retval = FALSE;
|
||||||
return 0;
|
|
||||||
|
if( SYSMi_GetWork()->isCardStateChanged ) {
|
||||||
|
|
||||||
|
MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) );
|
||||||
|
|
||||||
|
// ROMヘッダバッファのコピー
|
||||||
|
if( SYSM_IsExistCard() ) {
|
||||||
|
u16 id = (u16)OS_GetLockID();
|
||||||
|
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する
|
||||||
|
DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // キャッシュケア
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_CARD_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); // ROMヘッダコピー
|
||||||
|
SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16; // ROMヘッダCRCコピー
|
||||||
|
SYSMi_GetWork()->isCardStateChanged = FALSE; // カード情報更新フラグを落とす
|
||||||
|
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する
|
||||||
|
OS_ReleaseLockID( id );
|
||||||
|
|
||||||
|
pTitleList_Card->flags.isValid = TRUE;
|
||||||
|
pTitleList_Card->flags.isAppLoadCompleted = TRUE;
|
||||||
|
pTitleList_Card->flags.isAppRelocate = TRUE;
|
||||||
|
pTitleList_Card->pBanner = NULL;
|
||||||
|
|
||||||
|
// バナーデータのリード
|
||||||
|
if( SYSM_GetCardRomHeader()->banner_offset &&
|
||||||
|
SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ 0 ] ) ) {
|
||||||
|
pTitleList_Card->pBanner = &s_bannerBuf[ 0 ];
|
||||||
|
}else {
|
||||||
|
MI_CpuClearFast( &s_bannerBuf[ 0 ], sizeof(TWLBannerFile) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// タイトル情報フラグのセット
|
||||||
|
pTitleList_Card->flags.media = TITLE_MEDIA_CARD;
|
||||||
|
pTitleList_Card->titleID = 0;
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -250,17 +293,16 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
|
|||||||
ESTitleMeta dst[1];
|
ESTitleMeta dst[1];
|
||||||
|
|
||||||
// NANDタイトルリストの取得
|
// NANDタイトルリストの取得
|
||||||
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
|
||||||
{
|
{
|
||||||
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
|
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
|
||||||
// とりあえずALL
|
// とりあえずALL
|
||||||
int l;
|
int l;
|
||||||
int gotten;
|
int gotten;
|
||||||
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];
|
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
|
||||||
static TWLBannerFile bannerBuf[ LAUNCHER_TITLE_LIST_NUM ];
|
gotten = NAM_GetTitleList( &titleIdArray[ 1 ], LAUNCHER_TITLE_LIST_NUM - 1 );
|
||||||
gotten = NAM_GetTitleList( titleIdArray, LAUNCHER_TITLE_LIST_NUM-1 );
|
|
||||||
|
|
||||||
for(l=0;l<gotten;l++)
|
for(l=1;l<gotten;l++)
|
||||||
{
|
{
|
||||||
//ヘッダからバナーを読み込む
|
//ヘッダからバナーを読み込む
|
||||||
FSFile file[1];
|
FSFile file[1];
|
||||||
@ -308,7 +350,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
|||||||
FS_CloseFile(file);
|
FS_CloseFile(file);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
readLen = ReadFile(file, &bannerBuf[l], (s32)sizeof(TWLBannerFile));
|
readLen = ReadFile(file, &s_bannerBuf[l], (s32)sizeof(TWLBannerFile));
|
||||||
if( readLen != (s32)sizeof(TWLBannerFile) )
|
if( readLen != (s32)sizeof(TWLBannerFile) )
|
||||||
{
|
{
|
||||||
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
|
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
|
||||||
@ -323,22 +365,31 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
|||||||
// 念のため0にクリア
|
// 念のため0にクリア
|
||||||
titleIdArray[l] = 0;
|
titleIdArray[l] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(l=0;l<size;l++)
|
#if 0
|
||||||
|
for(l=1;l<listNum;l++)
|
||||||
{
|
{
|
||||||
pTitleList_Nand[l].titleID = 0;
|
pTitleList_Nand[l].titleID = 0;
|
||||||
pTitleList_Nand[l].pBanner = 0;
|
pTitleList_Nand[l].pBanner = 0;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
size = (gotten<size) ? gotten : size;
|
// カードアプリ部分を除いたリストクリア
|
||||||
|
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
|
||||||
|
#endif
|
||||||
|
|
||||||
for(l=0;l<size;l++)
|
listNum = (gotten<listNum) ? gotten : listNum;
|
||||||
|
|
||||||
|
for(l=1;l<listNum;l++)
|
||||||
{
|
{
|
||||||
pTitleList_Nand[l+1].titleID = titleIdArray[l];
|
pTitleList_Nand[l].titleID = titleIdArray[l];
|
||||||
pTitleList_Nand[l+1].pBanner = &bannerBuf[l];
|
pTitleList_Nand[l].pBanner = &s_bannerBuf[l];
|
||||||
|
if( titleIdArray[l] ) {
|
||||||
|
pTitleList_Nand[l].flags.isValid = TRUE;
|
||||||
|
pTitleList_Nand[l].flags.media = TITLE_MEDIA_NAND;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// return : *TitleProperty Array
|
// return : *TitleProperty Array
|
||||||
return size;
|
return listNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -375,21 +426,6 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
|
|||||||
#endif // __IS_DEBUGGER_BUILD
|
#endif // __IS_DEBUGGER_BUILD
|
||||||
}
|
}
|
||||||
|
|
||||||
// 有効なTWL/NTRカードが差さっているか?
|
|
||||||
BOOL SYSM_IsExistCard( void )
|
|
||||||
{
|
|
||||||
return SYSMi_GetWork()->isExistCard;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 検査用カードが差さっているか?
|
|
||||||
BOOL SYSM_IsInspectCard( void )
|
|
||||||
{
|
|
||||||
return ( SYSM_IsExistCard() && SYSM_GetCardRomHeader()->inspect_card );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 指定タイトルがブート可能なポインタかチェック
|
// 指定タイトルがブート可能なポインタかチェック
|
||||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
|
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
|
||||||
@ -569,17 +605,43 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
|||||||
OS_WakeupThreadDirect( &thread );
|
OS_WakeupThreadDirect( &thread );
|
||||||
}else if( pBootTitle->flags.isAppRelocate ) {
|
}else if( pBootTitle->flags.isAppRelocate ) {
|
||||||
// アプリロード済みで、再配置要求ありなら、再配置
|
// アプリロード済みで、再配置要求ありなら、再配置
|
||||||
// ※再配置処理
|
SYSMi_Relocate();
|
||||||
// SYSMi_Relocate();
|
|
||||||
SYSMi_GetWork()->isLoadSucceeded = TRUE;
|
SYSMi_GetWork()->isLoadSucceeded = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// アプリロード済み?
|
// カードアプリケーションの再配置
|
||||||
BOOL SYSM_IsLoadTitleFinished( void )
|
static void SYSMi_Relocate( void )
|
||||||
{
|
{
|
||||||
if( SYSM_GetResetParamBody()->v1.flags.isAppLoadCompleted ) {
|
u32 size;
|
||||||
|
// NTRセキュア領域の再配置
|
||||||
|
DC_InvalidateRange( (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア
|
||||||
|
size = ( SYSM_GetCardRomHeader()->main_size < SECURE_AREA_SIZE ) ?
|
||||||
|
SYSM_GetCardRomHeader()->main_size : SECURE_AREA_SIZE;
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_NTR_SECURE_BUF, SYSM_GetCardRomHeader()->main_ram_address, size );
|
||||||
|
|
||||||
|
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
||||||
|
// TWLセキュア領域の再配置
|
||||||
|
DC_InvalidateRange( (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア
|
||||||
|
size = ( SYSM_GetCardRomHeader()->main_ltd_size < SECURE_AREA_SIZE ) ?
|
||||||
|
SYSM_GetCardRomHeader()->main_ltd_size : SECURE_AREA_SIZE;
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_TWL_SECURE_BUF, SYSM_GetCardRomHeader()->main_ltd_ram_address, size );
|
||||||
|
// TWL-ROMヘッダ情報の再配置
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE );
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
|
||||||
|
}else {
|
||||||
|
// NTR-ROMヘッダ情報の再配置
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)0x027ffe00, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); // 8Mのケツへ(TWLデバッガでのNTRモードデバッグ用)
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)0x023ffe00, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); // 4Mのケツへ
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// アプリロード済み?
|
||||||
|
BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle )
|
||||||
|
{
|
||||||
|
if( pBootTitle->flags.isAppLoadCompleted ) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return OS_IsThreadTerminated( &thread );
|
return OS_IsThreadTerminated( &thread );
|
||||||
@ -590,7 +652,7 @@ BOOL SYSM_IsLoadTitleFinished( void )
|
|||||||
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
|
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
|
||||||
{
|
{
|
||||||
// ロード中
|
// ロード中
|
||||||
if( !SYSM_IsLoadTitleFinished() ) {
|
if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||||
return AUTH_RESULT_PROCESSING;
|
return AUTH_RESULT_PROCESSING;
|
||||||
}
|
}
|
||||||
// ロード成功?
|
// ロード成功?
|
||||||
@ -701,44 +763,68 @@ static void SYSMi_WriteAdjustRTC( void )
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
// バナーファイルの読み込みの実体
|
// バナーファイルの読み込みの実体
|
||||||
static void SYSMi_ReadCardBannerFile( void )
|
static BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner )
|
||||||
{
|
{
|
||||||
NTRBannerFile *pBanner = &s_bannerBuf;
|
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
// ※スロットAからのリードなら問題ないが、スロットBからは直接読めないので
|
||||||
if( ( !SYSMi_IsValidCard() ) || ( *(void** )BANNER_ROM_OFFSET == NULL ) ) {
|
BOOL isRead;
|
||||||
s_isBanner = FALSE;
|
u16 id = (u16)OS_GetLockID();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ROMカードからのバナーデータのリード
|
// ROMカードからのバナーデータのリード
|
||||||
DC_FlushRange( pBanner, sizeof(NTRBannerFile) );
|
DC_FlushRange( pBanner, sizeof(TWLBannerFile) );
|
||||||
CARD_ReadRom( 4, *(void** )BANNER_ROM_OFFSET, pBanner, sizeof(NTRBannerFile) );
|
CARD_LockRom( id );
|
||||||
|
CARD_ReadRom( 4, (void *)bannerOffset, pBanner, sizeof(TWLBannerFile) );
|
||||||
|
CARD_UnlockRom( id );
|
||||||
|
OS_ReleaseLockID( id );
|
||||||
|
|
||||||
// バナーデータの正誤チェック
|
isRead = SYSMi_CheckBannerFile( (NTRBannerFile *)pBanner );
|
||||||
{
|
|
||||||
int i;
|
if( !isRead ) {
|
||||||
u16 calc_crc = 0xffff;
|
MI_CpuClearFast( pBanner, sizeof(TWLBannerFile) );
|
||||||
u16 *hd_crcp = (u16 *)&pBanner->h.crc16_v1;
|
|
||||||
BannerCheckParam *chkp = &s_bannerCheckList[ 0 ];
|
|
||||||
|
|
||||||
s_isBanner = TRUE;
|
|
||||||
|
|
||||||
for( i = 0; i < NTR_BNR_VER_MAX; i++ ) {
|
|
||||||
if( i < pBanner->h.version ) {
|
|
||||||
calc_crc = SVC_GetCRC16( calc_crc, chkp->srcp, chkp->size );
|
|
||||||
if( calc_crc != *hd_crcp++ ) {
|
|
||||||
s_isBanner = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
MI_CpuClear16( chkp->srcp, chkp->size );
|
|
||||||
}
|
|
||||||
chkp++;
|
|
||||||
}
|
|
||||||
if( !s_isBanner ) {
|
|
||||||
MI_CpuClear16( &s_bannerBuf, sizeof(NTRBannerFile) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return isRead;
|
||||||
|
#else
|
||||||
|
#pragma unused(bannerOffset)
|
||||||
|
if( SYSMi_GetWork()->isValidCardBanner ) {
|
||||||
|
DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 );
|
||||||
|
MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) );
|
||||||
|
}
|
||||||
|
return SYSMi_GetWork()->isValidCardBanner;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// バナーデータの正誤チェック
|
||||||
|
static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BOOL retval = TRUE;
|
||||||
|
u16 calc_crc = 0xffff;
|
||||||
|
u16 *pHeaderCRC = (u16 *)&pBanner->h.crc16_v1;
|
||||||
|
BannerCheckParam bannerCheckList[ NTR_BNR_VER_MAX ];
|
||||||
|
BannerCheckParam *pChk = &bannerCheckList[ 0 ];
|
||||||
|
|
||||||
|
bannerCheckList[ 0 ].pSrc = (u8 *)&( pBanner->v1 );
|
||||||
|
bannerCheckList[ 0 ].size = sizeof( BannerFileV1 );
|
||||||
|
bannerCheckList[ 1 ].pSrc = (u8 *)&( pBanner->v2 );
|
||||||
|
bannerCheckList[ 1 ].size = sizeof( BannerFileV2 );
|
||||||
|
bannerCheckList[ 2 ].pSrc = (u8 *)&( pBanner->v3 );
|
||||||
|
bannerCheckList[ 2 ].size = sizeof( BannerFileV3 );
|
||||||
|
|
||||||
|
for( i = 0; i < NTR_BNR_VER_MAX; i++ ) {
|
||||||
|
if( i < pBanner->h.version ) {
|
||||||
|
calc_crc = SVC_GetCRC16( calc_crc, pChk->pSrc, pChk->size );
|
||||||
|
if( calc_crc != *pHeaderCRC++ ) {
|
||||||
|
retval = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
MI_CpuClear16( pChk->pSrc, pChk->size );
|
||||||
|
}
|
||||||
|
pChk++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -748,6 +834,20 @@ static void SYSMi_ReadCardBannerFile( void )
|
|||||||
//
|
//
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
|
// 有効なTWL/NTRカードが差さっているか?
|
||||||
|
BOOL SYSM_IsExistCard( void )
|
||||||
|
{
|
||||||
|
return SYSMi_GetWork()->isExistCard;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 検査用カードが差さっているか?
|
||||||
|
BOOL SYSM_IsInspectCard( void )
|
||||||
|
{
|
||||||
|
return ( SYSM_IsExistCard() && SYSM_GetCardRomHeader()->inspect_card );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 有効なTWLカードが差さっているか?
|
// 有効なTWLカードが差さっているか?
|
||||||
BOOL SYSM_IsTWLCard( void );
|
BOOL SYSM_IsTWLCard( void );
|
||||||
BOOL SYSM_IsTWLCard( void )
|
BOOL SYSM_IsTWLCard( void )
|
||||||
@ -800,10 +900,12 @@ static BOOL SYSMi_CheckEntryAddress( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// クローンブート判定
|
// クローンブート判定
|
||||||
static void SYSMi_CheckCardCloneBoot( void )
|
static void SYSMi_CheckCardCloneBoot( void )
|
||||||
{
|
{
|
||||||
u8 *buffp = (u8 *)&s_bannerBuf; // バナー用バッファをテンポラリとして使用
|
#if 0
|
||||||
|
u8 *buffp = (u8 *)&pTempBuffer;
|
||||||
u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000;
|
u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000;
|
||||||
u32 file_offset = total_rom_size & 0xFFFFFE00;
|
u32 file_offset = total_rom_size & 0xFFFFFE00;
|
||||||
|
|
||||||
@ -820,6 +922,7 @@ static void SYSMi_CheckCardCloneBoot( void )
|
|||||||
}else {
|
}else {
|
||||||
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
|
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -160,7 +160,7 @@ static void SetDefaultBanner( TitleProperty *titleprop )
|
|||||||
|
|
||||||
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
|
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
|
||||||
{
|
{
|
||||||
if(titleprop[l].titleID == 0) //IDがゼロの時はEmpty
|
if( !titleprop[l].flags.isValid ) //isValidフラグがFALSEの時はEmpty
|
||||||
{
|
{
|
||||||
if(l != 0)
|
if(l != 0)
|
||||||
{
|
{
|
||||||
@ -492,7 +492,7 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList )
|
|||||||
tp_select = SelectSomethingByTP(&dummy, func, 1 );
|
tp_select = SelectSomethingByTP(&dummy, func, 1 );
|
||||||
|
|
||||||
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
|
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
|
||||||
if(pTitleList[selected].titleID != 0)
|
if( pTitleList[selected].flags.isValid )
|
||||||
{
|
{
|
||||||
ret = &pTitleList[selected];
|
ret = &pTitleList[selected];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,7 @@ static void INTR_VBlank( void );
|
|||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
|
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
|
static TitleProperty s_titleList[ LAUNCHER_TITLE_LIST_NUM ];
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
|
|
||||||
@ -49,7 +50,6 @@ void TwlMain( void )
|
|||||||
};
|
};
|
||||||
u32 state = LOGODEMO_INIT;
|
u32 state = LOGODEMO_INIT;
|
||||||
TitleProperty *pBootTitle = NULL;
|
TitleProperty *pBootTitle = NULL;
|
||||||
TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ];
|
|
||||||
OSTick start, end = 0;
|
OSTick start, end = 0;
|
||||||
|
|
||||||
// システムメニュー初期化----------
|
// システムメニュー初期化----------
|
||||||
@ -84,8 +84,8 @@ void TwlMain( void )
|
|||||||
|
|
||||||
// 「ダイレクトブートでない」なら、NAND & カードアプリリスト取得
|
// 「ダイレクトブートでない」なら、NAND & カードアプリリスト取得
|
||||||
if( !pBootTitle ) {
|
if( !pBootTitle ) {
|
||||||
(void)SYSM_GetNandTitleList( pTitleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはpTitleList[1]から格納される)
|
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される)
|
||||||
(void)SYSM_GetCardTitleList( pTitleList ); // カードアプリリストの取得(カードアプリはpTitleList[0]に格納される)
|
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 「ダイレクトブートでない」もしくは
|
// 「ダイレクトブートでない」もしくは
|
||||||
@ -127,11 +127,11 @@ void TwlMain( void )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LAUNCHER_INIT:
|
case LAUNCHER_INIT:
|
||||||
LauncherInit( pTitleList );
|
LauncherInit( s_titleList );
|
||||||
state = LAUNCHER;
|
state = LAUNCHER;
|
||||||
break;
|
break;
|
||||||
case LAUNCHER:
|
case LAUNCHER:
|
||||||
pBootTitle = LauncherMain( pTitleList );
|
pBootTitle = LauncherMain( s_titleList );
|
||||||
if( pBootTitle ) {
|
if( pBootTitle ) {
|
||||||
state = LOAD_START;
|
state = LOAD_START;
|
||||||
}
|
}
|
||||||
@ -144,13 +144,13 @@ void TwlMain( void )
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case LOADING:
|
case LOADING:
|
||||||
if( LauncherFadeout( pTitleList ) &&
|
if( LauncherFadeout( s_titleList ) &&
|
||||||
SYSM_IsLoadTitleFinished() ) {
|
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||||
state = AUTHENTICATE;
|
state = AUTHENTICATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( end == 0 ) &&
|
if( ( end == 0 ) &&
|
||||||
SYSM_IsLoadTitleFinished() ) {
|
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||||
end = OS_GetTick();
|
end = OS_GetTick();
|
||||||
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ void TwlMain( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
|
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
|
||||||
(void)SYSM_GetCardTitleList( pTitleList );
|
(void)SYSM_GetCardTitleList( s_titleList );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,12 @@
|
|||||||
#ifndef SYSMENU_H_
|
#ifndef SYSMENU_H_
|
||||||
#define SYSMENU_H_
|
#define SYSMENU_H_
|
||||||
|
|
||||||
|
// Compile switch----------------------
|
||||||
|
#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。
|
||||||
|
|
||||||
|
//-------------------------------------
|
||||||
|
|
||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <twl/os/common/format_rom.h>
|
#include <twl/os/common/format_rom.h>
|
||||||
|
|
||||||
@ -24,7 +30,7 @@
|
|||||||
#include <sysmenu/banner.h>
|
#include <sysmenu/banner.h>
|
||||||
#include <sysmenu/settings.h>
|
#include <sysmenu/settings.h>
|
||||||
#include <sysmenu/memorymap.h>
|
#include <sysmenu/memorymap.h>
|
||||||
|
#include <sysmenu/card.h>
|
||||||
#include <sysmenu/acsign.h>
|
#include <sysmenu/acsign.h>
|
||||||
#include <sysmenu/mb_loader.h>
|
#include <sysmenu/mb_loader.h>
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,11 @@ extern "C" {
|
|||||||
|
|
||||||
// SystemMenu自身のマップ情報定義
|
// SystemMenu自身のマップ情報定義
|
||||||
#define SYSM_OWN_ARM9_MMEM_ADDR 0x02800000
|
#define SYSM_OWN_ARM9_MMEM_ADDR 0x02800000
|
||||||
#define SYSM_OWN_ARM9_MMEM_ADDR_END 0x02e77000
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
#define SYSM_OWN_ARM9_MMEM_ADDR_END 0x02e73000
|
||||||
|
#else
|
||||||
|
#define SYSM_OWN_ARM9_MMEM_ADDR_END 0x02e76000
|
||||||
|
#endif
|
||||||
#define SYSM_OWN_ARM7_MMEM_ADDR 0x02280000
|
#define SYSM_OWN_ARM7_MMEM_ADDR 0x02280000
|
||||||
#define SYSM_OWN_ARM7_MMEM_ADDR_END 0x02380000
|
#define SYSM_OWN_ARM7_MMEM_ADDR_END 0x02380000
|
||||||
#define SYSM_OWN_ARM7_WRAM_ADDR 0x037c0000
|
#define SYSM_OWN_ARM7_WRAM_ADDR 0x037c0000
|
||||||
@ -38,13 +42,22 @@ extern "C" {
|
|||||||
#define SYSROM9_NINLOGO_ADR 0xffff0020 // ARM9システムROM内の任天堂ロゴ格納アドレス
|
#define SYSROM9_NINLOGO_ADR 0xffff0020 // ARM9システムROM内の任天堂ロゴ格納アドレス
|
||||||
|
|
||||||
// カードアプリ格納バッファ
|
// カードアプリ格納バッファ
|
||||||
#define SYSM_CARD_ROM_HEADER_BUFFER ( SYSM_OWN_ARM9_MMEM_ADDR_END )
|
#define SYSM_CARD_ROM_HEADER_SIZE 0x1000
|
||||||
#define SYSM_CARD_ROM_HEADER_BUFFER_END ( SYSM_OWN_ARM9_MMEM_ADDR_END + 0x1000 )
|
|
||||||
#define SYSM_CARD_NTR_SECURE_BUFFER ( SYSM_CARD_ROM_HEADER_BUFFER_END )
|
|
||||||
#define SYSM_CARD_NTR_SECURE_BUFFER_END ( SYSM_CARD_ROM_HEADER_BUFFER_END + SECURE_AREA_SIZE )
|
|
||||||
#define SYSM_CARD_TWL_SECURE_BUFFER ( SYSM_CARD_NTR_SECURE_BUFFER_END )
|
|
||||||
#define SYSM_CARD_TWL_SECURE_BUFFER_END ( SYSM_CARD_NTR_SECURE_BUFFER_END + SECURE_AREA_SIZE )
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
|
#define SYSM_CARD_BANNER_BUF ( SYSM_OWN_ARM9_MMEM_ADDR_END )
|
||||||
|
#define SYSM_CARD_BANNER_BUF_END ( SYSM_CARD_BANNER_BUF + 0x3000 )
|
||||||
|
#define SYSM_CARD_ROM_HEADER_BUF ( SYSM_CARD_BANNER_BUF_END )
|
||||||
|
#else
|
||||||
|
#define SYSM_CARD_ROM_HEADER_BUF ( SYSM_OWN_ARM9_MMEM_ADDR_END )
|
||||||
|
#endif
|
||||||
|
#define SYSM_CARD_ROM_HEADER_BUF_END ( SYSM_CARD_ROM_HEADER_BUF + SYSM_CARD_ROM_HEADER_SIZE )
|
||||||
|
#define SYSM_CARD_ROM_HEADER_BAK ( SYSM_CARD_ROM_HEADER_BUF_END )
|
||||||
|
#define SYSM_CARD_ROM_HEADER_BAK_END ( SYSM_CARD_ROM_HEADER_BAK + SYSM_CARD_ROM_HEADER_SIZE )
|
||||||
|
#define SYSM_CARD_NTR_SECURE_BUF ( SYSM_CARD_ROM_HEADER_BAK_END )
|
||||||
|
#define SYSM_CARD_NTR_SECURE_BUF_END ( SYSM_CARD_NTR_SECURE_BUF + SECURE_AREA_SIZE )
|
||||||
|
#define SYSM_CARD_TWL_SECURE_BUF ( SYSM_CARD_NTR_SECURE_BUF_END )
|
||||||
|
#define SYSM_CARD_TWL_SECURE_BUF_END ( SYSM_CARD_TWL_SECURE_BUF + SECURE_AREA_SIZE )
|
||||||
|
|
||||||
// ※アプリをWRAMに直接配置してブートしようとすると、SystemMenuのコードとぶつかっていろいろややこしい状態になるので、検討が必要
|
// ※アプリをWRAMに直接配置してブートしようとすると、SystemMenuのコードとぶつかっていろいろややこしい状態になるので、検討が必要
|
||||||
|
|
||||||
|
|||||||
@ -86,7 +86,7 @@ extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); /
|
|||||||
|
|
||||||
// アプリ起動
|
// アプリ起動
|
||||||
extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始
|
extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドでロード開始
|
||||||
extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
|
extern BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
|
||||||
extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート
|
extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート
|
||||||
// 成功時は、never return.
|
// 成功時は、never return.
|
||||||
// デバイス制御
|
// デバイス制御
|
||||||
|
|||||||
@ -21,12 +21,12 @@
|
|||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <twl/nam.h>
|
#include <twl/nam.h>
|
||||||
|
|
||||||
|
#include <sysmenu/memorymap.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// compile switch ---------------------------------
|
|
||||||
|
|
||||||
// define data ------------------------------------
|
// define data ------------------------------------
|
||||||
#define SYSM_RESET_PARAM_MAGIC_CODE "TRST"
|
#define SYSM_RESET_PARAM_MAGIC_CODE "TRST"
|
||||||
#define SYSM_RESET_PARAM_MAGIC_CODE_LEN 4
|
#define SYSM_RESET_PARAM_MAGIC_CODE_LEN 4
|
||||||
@ -34,19 +34,31 @@ extern "C" {
|
|||||||
#define CLONE_BOOT_MODE 1
|
#define CLONE_BOOT_MODE 1
|
||||||
#define OTHER_BOOT_MODE 2
|
#define OTHER_BOOT_MODE 2
|
||||||
|
|
||||||
|
|
||||||
// NAMTitleIDをHiLoに分割してアクセスする場合に使用
|
// NAMTitleIDをHiLoに分割してアクセスする場合に使用
|
||||||
typedef struct TitleID_HiLo {
|
typedef struct TitleID_HiLo {
|
||||||
u8 Lo[ 4 ];
|
u8 Lo[ 4 ];
|
||||||
u32 Hi;
|
u32 Hi;
|
||||||
}TitleID_HiLo;
|
}TitleID_HiLo;
|
||||||
|
|
||||||
// リセットパラメータ フラグ
|
|
||||||
|
// BootFlagsで使用するmedia情報
|
||||||
|
typedef enum TitleMedia {
|
||||||
|
TITLE_MEDIA_NAND = 0,
|
||||||
|
TITLE_MEDIA_CARD = 1,
|
||||||
|
TITLE_MEDIA_MAX = 2
|
||||||
|
}TitleMedia;
|
||||||
|
|
||||||
|
|
||||||
|
// タイトル&リセットパラメータ フラグ
|
||||||
typedef struct BootFlags {
|
typedef struct BootFlags {
|
||||||
|
u16 isValid : 1; // TRUE:valid, FALSE:invalid
|
||||||
|
u16 media : 3; // 0:nand, 1:card, 2-7:rsv;
|
||||||
u16 isLogoSkip : 1; // ロゴデモスキップ要求
|
u16 isLogoSkip : 1; // ロゴデモスキップ要求
|
||||||
u16 isInitialShortcutSkip : 1; // 初回起動シーケンススキップ要求
|
u16 isInitialShortcutSkip : 1; // 初回起動シーケンススキップ要求
|
||||||
u16 isAppLoadCompleted : 1; // アプリロード済みを示す
|
u16 isAppLoadCompleted : 1; // アプリロード済みを示す
|
||||||
u16 isAppRelocate : 1; // アプリ再配置要求
|
u16 isAppRelocate : 1; // アプリ再配置要求
|
||||||
u16 rsv : 12;
|
u16 rsv : 9;
|
||||||
}BootFlags;
|
}BootFlags;
|
||||||
|
|
||||||
|
|
||||||
@ -89,10 +101,21 @@ typedef struct SYSM_work {
|
|||||||
vu16 isLogoSkip :1; // ロゴデモスキップ
|
vu16 isLogoSkip :1; // ロゴデモスキップ
|
||||||
vu16 isOnDebugger :1; // デバッガ動作か?
|
vu16 isOnDebugger :1; // デバッガ動作か?
|
||||||
vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか?
|
vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか?
|
||||||
|
vu16 isCardStateChanged :1; // カード状態更新フラグ
|
||||||
vu16 isLoadSucceeded :1;
|
vu16 isLoadSucceeded :1;
|
||||||
vu16 rsv :8;
|
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||||
u16 cardHeaderCrc16; // システムメニューで計算したROMヘッダCRC16
|
vu16 isValidCardBanner :1;
|
||||||
|
vu16 is1stCardChecked :1;
|
||||||
|
vu16 rsv :5;
|
||||||
|
#else
|
||||||
|
vu16 rsv :7;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側)
|
||||||
|
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側)
|
||||||
|
OSLockWord lockCardRsc; // カードリソース排他制御用
|
||||||
int cloneBootMode;
|
int cloneBootMode;
|
||||||
|
|
||||||
ResetParam resetParam;
|
ResetParam resetParam;
|
||||||
|
|
||||||
// NTR-IPL2のレガシー 最終的には消すと思う
|
// NTR-IPL2のレガシー 最終的には消すと思う
|
||||||
@ -121,14 +144,14 @@ typedef struct SDKBootCheckInfo{
|
|||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// SYSM共有ワーク領域のアドレス獲得
|
// SYSM共有ワーク領域のアドレス獲得
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
#if 0
|
|
||||||
// SYSMリセットパラメータアドレスの取得(※ライブラリ向け。ARM9側はSYSM_GetResetParamを使用して下さい。)
|
// SYSMリセットパラメータアドレスの取得(※ライブラリ向け。ARM9側はSYSM_GetResetParamを使用して下さい。)
|
||||||
#define SYSMi_GetResetParamAddr() ( (ResetParam *)0x02000100 )
|
#define SYSMi_GetResetParamAddr() ( (ResetParam *)0x02000100 )
|
||||||
|
|
||||||
|
#if 0
|
||||||
// SYSM共有ワークの取得
|
// SYSM共有ワークの取得
|
||||||
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
|
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
|
||||||
#else
|
#else
|
||||||
#define SYSMi_GetResetParamAddr() ( (ResetParam *)( HW_RED_RESERVED + 0x50 ) )
|
#define SYSMi_GetWork() ( (SYSM_work *)( HW_RED_RESERVED + 0x10 ) )
|
||||||
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED + 0x10 )
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SDKブートチェック(アプリ起動時にカードIDをセットする必要がある。)
|
// SDKブートチェック(アプリ起動時にカードIDをセットする必要がある。)
|
||||||
@ -139,7 +162,7 @@ typedef struct SDKBootCheckInfo{
|
|||||||
#define SYSMi_GetMCUFreeRegisterValue() ( *(vu8 *)HW_RESET_PARAMETER_BUF )
|
#define SYSMi_GetMCUFreeRegisterValue() ( *(vu8 *)HW_RESET_PARAMETER_BUF )
|
||||||
|
|
||||||
// カードROMヘッダワークの取得
|
// カードROMヘッダワークの取得
|
||||||
#define SYSM_GetCardRomHeader() ( (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF )
|
#define SYSM_GetCardRomHeader() ( (ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF )
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user