From 6acdecc63d5584f475a6d7a1f18f244ad09e3756 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Thu, 22 Nov 2007 13:16:33 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=AB=E3=83=BC=E3=83=89=E3=83=96?= =?UTF-8?q?=E3=83=BC=E3=83=88=E5=AE=9F=E8=A3=85=E4=B8=AD=E3=80=82=EF=BC=88?= =?UTF-8?q?ARM9Ltd,ARM7Ltd=E3=81=AE=E3=82=A4=E3=83=A1=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=81=8C=E3=81=86=E3=81=BE=E3=81=8F=E8=AA=AD=E3=82=81=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=84=E3=80=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@248 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/hyena.TWL/src/main.c | 9 +- build/libraries_sysmenu/card/ARM7/src/Card.c | 168 +++++++---- .../sysmenu/ARM9/src/sysmenu_lib.c | 269 ++++++++++++------ .../Launcher/ARM9/src/launcher.c | 4 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 18 +- include/sysmenu.h | 8 +- include/sysmenu/hw/common/mmap.h | 27 +- .../sysmenu/sysmenu_lib/ARM9/sysmenu_api.h | 2 +- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 43 ++- 9 files changed, 382 insertions(+), 166 deletions(-) diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 352bfa4a..1edc6e03 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -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(); diff --git a/build/libraries_sysmenu/card/ARM7/src/Card.c b/build/libraries_sysmenu/card/ARM7/src/Card.c index 51a0e9a8..d91f9c04 100644 --- a/build/libraries_sysmenu/card/ARM7/src/Card.c +++ b/build/libraries_sysmenu/card/ARM7/src/Card.c @@ -16,11 +16,8 @@ //#include #include -#include -#include -#include -#include -#include +#include + // 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関数 * diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 7d17e7ba..2e7694ba 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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;lisExistCard; -} - - -// 検査用カードが差さっているか? -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 } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 273c0207..0483e2d7 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -160,7 +160,7 @@ static void SetDefaultBanner( TitleProperty *titleprop ) for(l=0;l #include @@ -24,7 +30,7 @@ #include #include #include - +#include #include #include diff --git a/include/sysmenu/hw/common/mmap.h b/include/sysmenu/hw/common/mmap.h index 95d2a783..8dc82b81 100644 --- a/include/sysmenu/hw/common/mmap.h +++ b/include/sysmenu/hw/common/mmap.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のコードとぶつかっていろいろややこしい状態になるので、検討が必要 diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index 2cbc7eb8..a5ce5596 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -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. // デバイス制御 diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 4d741788..53336cc9 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -21,12 +21,12 @@ #include #include +#include + #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