・カードブート実装中。(ARM9Ltd,ARM7Ltdのイメージがうまく読めていない。)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@248 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-22 13:16:33 +00:00
parent eae31e1a28
commit 6acdecc63d
9 changed files with 382 additions and 166 deletions

View File

@ -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();

View File

@ -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関数
*

View File

@ -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
}

View File

@ -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];
}

View File

@ -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 );
}
}

View File

@ -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>

View File

@ -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のコードとぶつかっていろいろややこしい状態になるので、検討が必要

View File

@ -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.
// デバイス制御

View File

@ -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ヘッダCRC16ARM9側でコピーして使用する側
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側
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