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_Init();
|
||||
OS_InitTick();
|
||||
PrintDebugInfo();
|
||||
|
||||
// NVRAM からユーザー情報読み出し
|
||||
@ -110,6 +111,9 @@ TwlSpMain(void)
|
||||
|
||||
// Cold/Hotスタート判定
|
||||
ReadResetParameter();
|
||||
|
||||
// ※カード電源ONして、ROMヘッダのみリード&チェックくらいはやっておきたい
|
||||
|
||||
SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
|
||||
|
||||
// ヒープ領域設定
|
||||
@ -173,10 +177,9 @@ TwlSpMain(void)
|
||||
|
||||
// 活栓挿抜機能初期化
|
||||
Cardm_Init();
|
||||
|
||||
// カードがささっていたらブート開始
|
||||
Card_Boot();
|
||||
|
||||
(void)Card_Boot();
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
OS_Halt();
|
||||
|
||||
@ -16,11 +16,8 @@
|
||||
//#include <istdbglib.h>
|
||||
|
||||
#include <nitro/card/types.h>
|
||||
#include <sysmenu/card/common/blowfish.h>
|
||||
#include <sysmenu/card/common/Card.h>
|
||||
#include <sysmenu/card/common/dsCardType1.h>
|
||||
#include <sysmenu/card/common/dsCardType2.h>
|
||||
#include <sysmenu/memorymap.h>
|
||||
#include <sysmenu.h>
|
||||
|
||||
// define -------------------------------------------------------------------
|
||||
#define STACK_SIZE 1024 // スタックサイズ
|
||||
#define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
||||
@ -120,10 +117,10 @@ void Cardm_Init(void)
|
||||
OS_WakeupThreadDirect(&s_MCThread);
|
||||
|
||||
// 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 バッファの設定
|
||||
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,
|
||||
@ -155,7 +152,8 @@ BOOL Card_Boot(void)
|
||||
{
|
||||
s32 tempLockID;
|
||||
BOOL retval = TRUE;
|
||||
|
||||
OSTick start = OS_GetTick();
|
||||
|
||||
OS_TPrintf("---------------- Card Boot Start ---------------\n");
|
||||
// カード電源ON
|
||||
McPowerOn();
|
||||
@ -196,58 +194,92 @@ BOOL Card_Boot(void)
|
||||
s_cbData.cardType = DS_CARD_TYPE_1;
|
||||
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読み込み
|
||||
s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
|
||||
|
||||
// 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();
|
||||
// ※最終的にはカードIDをHW_BOOT_CHECK_INFO_BUFに入れないと、アプリ起動後のカード抜け処理が上手く動作しないので注意。
|
||||
// 今はスロットBを使用しているので、ノーケアでOK.
|
||||
// *(u32 *)HW_BOOT_CHECK_INFO_BUF = s_cbData.id_gam;
|
||||
|
||||
OS_TPrintf("-----------------------------------------------\n\n");
|
||||
}
|
||||
else{
|
||||
OS_TPrintf("Card Not Found\n");
|
||||
retval = FALSE;
|
||||
}
|
||||
|
||||
// カードロックIDの開放
|
||||
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;
|
||||
}
|
||||
|
||||
@ -260,6 +292,18 @@ BOOL Card_Boot(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");
|
||||
// Arm9の常駐モジュール残りを指定先に転送
|
||||
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,
|
||||
(u32 *)((u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address),
|
||||
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関数
|
||||
*
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
// define data-----------------------------------------------------------------
|
||||
|
||||
typedef struct BannerCheckParam {
|
||||
u8 *srcp;
|
||||
u8 *pSrc;
|
||||
u32 size;
|
||||
}BannerCheckParam;
|
||||
|
||||
@ -38,13 +38,17 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void );
|
||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
||||
static void SYSMi_WriteAdjustRTC( void );
|
||||
static int SYSMi_IsValidCard( void );
|
||||
static void SYSMi_ReadCardBannerFile( void );
|
||||
static BOOL SYSMi_CheckEntryAddress( void );
|
||||
static void SYSMi_CheckCardCloneBoot( void );
|
||||
static void SYSMi_CheckRTC( void );
|
||||
|
||||
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-------------------------------------------------------------
|
||||
void *(*SYSM_Alloc)( u32 size );
|
||||
void (*SYSM_Free )( void *ptr );
|
||||
@ -55,18 +59,11 @@ SYSM_work *pSysm; //
|
||||
|
||||
// static variable-------------------------------------------------------------
|
||||
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------------------------------------------------------------------
|
||||
|
||||
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 ) {
|
||||
SVC_WaitByLoop( 0x1000 );
|
||||
}
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
while( !SYSMi_GetWork()->is1stCardChecked ) {
|
||||
SVC_WaitByLoop( 0x1000 );
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------
|
||||
// リセットパラメータの判定(リセットパラメータが有効かどうかは、ARM7でやってくれている)
|
||||
@ -158,7 +160,6 @@ TitleProperty *SYSM_ReadParameters( void )
|
||||
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
|
||||
|
||||
// SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
|
||||
// SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
|
||||
|
||||
//NAMの初期化
|
||||
//NAM_Init(AllocForNAM,FreeForNAM);
|
||||
@ -187,6 +188,9 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
|
||||
if( SYSM_GetCardTitleProperty( &s_bootTitle ) ) { // ※未実装
|
||||
s_bootTitle.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
|
||||
s_bootTitle.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
|
||||
s_bootTitle.flags.media = TITLE_MEDIA_CARD;
|
||||
s_bootTitle.flags.isValid = TRUE;
|
||||
// titleIDは"0"(カード)
|
||||
SYSM_SetLogoDemoSkip( TRUE );
|
||||
return &s_bootTitle;
|
||||
}
|
||||
@ -202,6 +206,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
|
||||
!TSD_IsSetUserColor() ||
|
||||
!TSD_IsSetNickname() ) {
|
||||
s_bootTitle.titleID = TITLE_ID_MACHINE_SETTINGS;
|
||||
s_bootTitle.flags.media = TITLE_MEDIA_NAND;
|
||||
s_bootTitle.flags.isValid = TRUE;
|
||||
return &s_bootTitle;
|
||||
}
|
||||
#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 )
|
||||
return 0;
|
||||
BOOL retval = FALSE;
|
||||
|
||||
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];
|
||||
|
||||
// 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, 等の条件を指定してタイトルリストを取得する。
|
||||
// とりあえずALL
|
||||
int l;
|
||||
int gotten;
|
||||
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];
|
||||
static TWLBannerFile bannerBuf[ LAUNCHER_TITLE_LIST_NUM ];
|
||||
gotten = NAM_GetTitleList( titleIdArray, LAUNCHER_TITLE_LIST_NUM-1 );
|
||||
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
|
||||
gotten = NAM_GetTitleList( &titleIdArray[ 1 ], LAUNCHER_TITLE_LIST_NUM - 1 );
|
||||
|
||||
for(l=0;l<gotten;l++)
|
||||
for(l=1;l<gotten;l++)
|
||||
{
|
||||
//ヘッダからバナーを読み込む
|
||||
FSFile file[1];
|
||||
@ -308,7 +350,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
||||
FS_CloseFile(file);
|
||||
return -1;
|
||||
}
|
||||
readLen = ReadFile(file, &bannerBuf[l], (s32)sizeof(TWLBannerFile));
|
||||
readLen = ReadFile(file, &s_bannerBuf[l], (s32)sizeof(TWLBannerFile));
|
||||
if( readLen != (s32)sizeof(TWLBannerFile) )
|
||||
{
|
||||
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
|
||||
@ -323,22 +365,31 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
||||
// 念のため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].pBanner = 0;
|
||||
}
|
||||
|
||||
size = (gotten<size) ? gotten : size;
|
||||
#else
|
||||
// カードアプリ部分を除いたリストクリア
|
||||
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+1].pBanner = &bannerBuf[l];
|
||||
pTitleList_Nand[l].titleID = titleIdArray[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 size;
|
||||
return listNum;
|
||||
}
|
||||
|
||||
|
||||
@ -375,21 +426,6 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
|
||||
#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 )
|
||||
@ -569,17 +605,43 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
||||
OS_WakeupThreadDirect( &thread );
|
||||
}else if( pBootTitle->flags.isAppRelocate ) {
|
||||
// アプリロード済みで、再配置要求ありなら、再配置
|
||||
// ※再配置処理
|
||||
// SYSMi_Relocate();
|
||||
SYSMi_Relocate();
|
||||
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 OS_IsThreadTerminated( &thread );
|
||||
@ -590,7 +652,7 @@ BOOL SYSM_IsLoadTitleFinished( void )
|
||||
AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
|
||||
{
|
||||
// ロード中
|
||||
if( !SYSM_IsLoadTitleFinished() ) {
|
||||
if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||
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;
|
||||
|
||||
if( ( !SYSMi_IsValidCard() ) || ( *(void** )BANNER_ROM_OFFSET == NULL ) ) {
|
||||
s_isBanner = FALSE;
|
||||
return;
|
||||
}
|
||||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||
// ※スロットAからのリードなら問題ないが、スロットBからは直接読めないので
|
||||
BOOL isRead;
|
||||
u16 id = (u16)OS_GetLockID();
|
||||
|
||||
// ROMカードからのバナーデータのリード
|
||||
DC_FlushRange( pBanner, sizeof(NTRBannerFile) );
|
||||
CARD_ReadRom( 4, *(void** )BANNER_ROM_OFFSET, pBanner, sizeof(NTRBannerFile) );
|
||||
DC_FlushRange( pBanner, sizeof(TWLBannerFile) );
|
||||
CARD_LockRom( id );
|
||||
CARD_ReadRom( 4, (void *)bannerOffset, pBanner, sizeof(TWLBannerFile) );
|
||||
CARD_UnlockRom( id );
|
||||
OS_ReleaseLockID( id );
|
||||
|
||||
// バナーデータの正誤チェック
|
||||
{
|
||||
int i;
|
||||
u16 calc_crc = 0xffff;
|
||||
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) );
|
||||
}
|
||||
isRead = SYSMi_CheckBannerFile( (NTRBannerFile *)pBanner );
|
||||
|
||||
if( !isRead ) {
|
||||
MI_CpuClearFast( pBanner, sizeof(TWLBannerFile) );
|
||||
}
|
||||
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カードが差さっているか?
|
||||
BOOL SYSM_IsTWLCard( void );
|
||||
BOOL SYSM_IsTWLCard( void )
|
||||
@ -800,10 +900,12 @@ static BOOL SYSMi_CheckEntryAddress( 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 file_offset = total_rom_size & 0xFFFFFE00;
|
||||
|
||||
@ -820,6 +922,7 @@ static void SYSMi_CheckCardCloneBoot( void )
|
||||
}else {
|
||||
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++)
|
||||
{
|
||||
if(titleprop[l].titleID == 0) //IDがゼロの時はEmpty
|
||||
if( !titleprop[l].flags.isValid ) //isValidフラグがFALSEの時はEmpty
|
||||
{
|
||||
if(l != 0)
|
||||
{
|
||||
@ -492,7 +492,7 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList )
|
||||
tp_select = SelectSomethingByTP(&dummy, func, 1 );
|
||||
|
||||
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
|
||||
if(pTitleList[selected].titleID != 0)
|
||||
if( pTitleList[selected].flags.isValid )
|
||||
{
|
||||
ret = &pTitleList[selected];
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@ static void INTR_VBlank( void );
|
||||
// global variable-------------------------------------------------------------
|
||||
|
||||
// static variable-------------------------------------------------------------
|
||||
static TitleProperty s_titleList[ LAUNCHER_TITLE_LIST_NUM ];
|
||||
|
||||
// const data------------------------------------------------------------------
|
||||
|
||||
@ -49,7 +50,6 @@ void TwlMain( void )
|
||||
};
|
||||
u32 state = LOGODEMO_INIT;
|
||||
TitleProperty *pBootTitle = NULL;
|
||||
TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ];
|
||||
OSTick start, end = 0;
|
||||
|
||||
// システムメニュー初期化----------
|
||||
@ -84,8 +84,8 @@ void TwlMain( void )
|
||||
|
||||
// 「ダイレクトブートでない」なら、NAND & カードアプリリスト取得
|
||||
if( !pBootTitle ) {
|
||||
(void)SYSM_GetNandTitleList( pTitleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはpTitleList[1]から格納される)
|
||||
(void)SYSM_GetCardTitleList( pTitleList ); // カードアプリリストの取得(カードアプリはpTitleList[0]に格納される)
|
||||
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される)
|
||||
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される)
|
||||
}
|
||||
|
||||
// 「ダイレクトブートでない」もしくは
|
||||
@ -127,11 +127,11 @@ void TwlMain( void )
|
||||
}
|
||||
break;
|
||||
case LAUNCHER_INIT:
|
||||
LauncherInit( pTitleList );
|
||||
LauncherInit( s_titleList );
|
||||
state = LAUNCHER;
|
||||
break;
|
||||
case LAUNCHER:
|
||||
pBootTitle = LauncherMain( pTitleList );
|
||||
pBootTitle = LauncherMain( s_titleList );
|
||||
if( pBootTitle ) {
|
||||
state = LOAD_START;
|
||||
}
|
||||
@ -144,13 +144,13 @@ void TwlMain( void )
|
||||
|
||||
break;
|
||||
case LOADING:
|
||||
if( LauncherFadeout( pTitleList ) &&
|
||||
SYSM_IsLoadTitleFinished() ) {
|
||||
if( LauncherFadeout( s_titleList ) &&
|
||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||
state = AUTHENTICATE;
|
||||
}
|
||||
|
||||
if( ( end == 0 ) &&
|
||||
SYSM_IsLoadTitleFinished() ) {
|
||||
SYSM_IsLoadTitleFinished( pBootTitle ) ) {
|
||||
end = OS_GetTick();
|
||||
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_
|
||||
#define SYSMENU_H_
|
||||
|
||||
// Compile switch----------------------
|
||||
#define DEBUG_USED_CARD_SLOT_B_ // デバッグ用でカードスロットBを使用する場合に有効にする。
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
|
||||
#include <twl.h>
|
||||
#include <twl/os/common/format_rom.h>
|
||||
|
||||
@ -24,7 +30,7 @@
|
||||
#include <sysmenu/banner.h>
|
||||
#include <sysmenu/settings.h>
|
||||
#include <sysmenu/memorymap.h>
|
||||
|
||||
#include <sysmenu/card.h>
|
||||
#include <sysmenu/acsign.h>
|
||||
#include <sysmenu/mb_loader.h>
|
||||
|
||||
|
||||
@ -28,7 +28,11 @@ extern "C" {
|
||||
|
||||
// SystemMenu自身のマップ情報定義
|
||||
#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_END 0x02380000
|
||||
#define SYSM_OWN_ARM7_WRAM_ADDR 0x037c0000
|
||||
@ -38,13 +42,22 @@ extern "C" {
|
||||
#define SYSROM9_NINLOGO_ADR 0xffff0020 // ARM9システムROM内の任天堂ロゴ格納アドレス
|
||||
|
||||
// カードアプリ格納バッファ
|
||||
#define SYSM_CARD_ROM_HEADER_BUFFER ( SYSM_OWN_ARM9_MMEM_ADDR_END )
|
||||
#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 )
|
||||
#define SYSM_CARD_ROM_HEADER_SIZE 0x1000
|
||||
|
||||
#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のコードとぶつかっていろいろややこしい状態になるので、検討が必要
|
||||
|
||||
|
||||
@ -86,7 +86,7 @@ extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); /
|
||||
|
||||
// アプリ起動
|
||||
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を認証してブート
|
||||
// 成功時は、never return.
|
||||
// デバイス制御
|
||||
|
||||
@ -21,12 +21,12 @@
|
||||
#include <twl.h>
|
||||
#include <twl/nam.h>
|
||||
|
||||
#include <sysmenu/memorymap.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// compile switch ---------------------------------
|
||||
|
||||
// define data ------------------------------------
|
||||
#define SYSM_RESET_PARAM_MAGIC_CODE "TRST"
|
||||
#define SYSM_RESET_PARAM_MAGIC_CODE_LEN 4
|
||||
@ -34,19 +34,31 @@ extern "C" {
|
||||
#define CLONE_BOOT_MODE 1
|
||||
#define OTHER_BOOT_MODE 2
|
||||
|
||||
|
||||
// NAMTitleIDをHiLoに分割してアクセスする場合に使用
|
||||
typedef struct TitleID_HiLo {
|
||||
u8 Lo[ 4 ];
|
||||
u32 Hi;
|
||||
}TitleID_HiLo;
|
||||
|
||||
// リセットパラメータ フラグ
|
||||
|
||||
// BootFlagsで使用するmedia情報
|
||||
typedef enum TitleMedia {
|
||||
TITLE_MEDIA_NAND = 0,
|
||||
TITLE_MEDIA_CARD = 1,
|
||||
TITLE_MEDIA_MAX = 2
|
||||
}TitleMedia;
|
||||
|
||||
|
||||
// タイトル&リセットパラメータ フラグ
|
||||
typedef struct BootFlags {
|
||||
u16 isValid : 1; // TRUE:valid, FALSE:invalid
|
||||
u16 media : 3; // 0:nand, 1:card, 2-7:rsv;
|
||||
u16 isLogoSkip : 1; // ロゴデモスキップ要求
|
||||
u16 isInitialShortcutSkip : 1; // 初回起動シーケンススキップ要求
|
||||
u16 isAppLoadCompleted : 1; // アプリロード済みを示す
|
||||
u16 isAppRelocate : 1; // アプリ再配置要求
|
||||
u16 rsv : 12;
|
||||
u16 rsv : 9;
|
||||
}BootFlags;
|
||||
|
||||
|
||||
@ -89,10 +101,21 @@ typedef struct SYSM_work {
|
||||
vu16 isLogoSkip :1; // ロゴデモスキップ
|
||||
vu16 isOnDebugger :1; // デバッガ動作か?
|
||||
vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか?
|
||||
vu16 isCardStateChanged :1; // カード状態更新フラグ
|
||||
vu16 isLoadSucceeded :1;
|
||||
vu16 rsv :8;
|
||||
u16 cardHeaderCrc16; // システムメニューで計算したROMヘッダCRC16
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
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;
|
||||
|
||||
ResetParam resetParam;
|
||||
|
||||
// NTR-IPL2のレガシー 最終的には消すと思う
|
||||
@ -121,14 +144,14 @@ typedef struct SDKBootCheckInfo{
|
||||
//----------------------------------------------------------------------
|
||||
// SYSM共有ワーク領域のアドレス獲得
|
||||
//----------------------------------------------------------------------
|
||||
#if 0
|
||||
// SYSMリセットパラメータアドレスの取得(※ライブラリ向け。ARM9側はSYSM_GetResetParamを使用して下さい。)
|
||||
#define SYSMi_GetResetParamAddr() ( (ResetParam *)0x02000100 )
|
||||
|
||||
#if 0
|
||||
// SYSM共有ワークの取得
|
||||
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
|
||||
#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
|
||||
|
||||
// SDKブートチェック(アプリ起動時にカードIDをセットする必要がある。)
|
||||
@ -139,7 +162,7 @@ typedef struct SDKBootCheckInfo{
|
||||
#define SYSMi_GetMCUFreeRegisterValue() ( *(vu8 *)HW_RESET_PARAMETER_BUF )
|
||||
|
||||
// カード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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user