diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index f5b30d8f..f62c18d0 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -201,6 +201,17 @@ Autoload WRAM Library libathdrv_sp$(LIBSUFFIX).a (.bss) Library libathdrv_sp$(LIBSUFFIX).a (.data) + + # FATFS core symbols + Object OBJECT(FATFSi_lfi2text, libfatfs_sp$(LIBSUFFIX).a) (.text) # 360 BYTEs + Object OBJECT(FATFSi_pc_findin, libfatfs_sp$(LIBSUFFIX).a) (.text) # 904 BYTEs + Object OBJECT(FATFSi_pc_patcmp_vfat, libfatfs_sp$(LIBSUFFIX).a) (.text) # 436 BYTEs + Object OBJECT(FATFSi_pc_ascii_mfile, libfatfs_sp$(LIBSUFFIX).a) (.text) # 160 BYTEs + Object OBJECT(FATFSi_map_ascii_to_unicode, libfatfs_sp$(LIBSUFFIX).a) (.text) # 48 BYTEs + Object OBJECT(SDCARD_Intr_Thread, libfatfs_sp$(LIBSUFFIX).a) (.text) # 520 BYTEs + Object OBJECT(FATFSi_unicode_cmp_to_ascii_char, libfatfs_sp$(LIBSUFFIX).a) (.text) # 40 BYTEs + Object OBJECT(FATFSi_pc_read_blk, libfatfs_sp$(LIBSUFFIX).a) (.text) # 352 BYTEs + Object * (.rsvwram) } diff --git a/build/libraries_sysmenu/banner/ARM9/src/banner.c b/build/libraries_sysmenu/banner/ARM9/src/banner.c index ad0ba346..3e6abcf7 100644 --- a/build/libraries_sysmenu/banner/ARM9/src/banner.c +++ b/build/libraries_sysmenu/banner/ARM9/src/banner.c @@ -25,6 +25,8 @@ typedef struct BannerCheckParam { u32 size; }BannerCheckParam; +#define MEASURE_BANNER_LOAD_TIME 0 + // extern data----------------------------------------------------------------- // function's prototype------------------------------------------------------- @@ -66,7 +68,11 @@ BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pBanner ) BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) { #define PATH_LENGTH 1024 + +#if (MEASURE_BANNER_LOAD_TIME == 1) OSTick start; +#endif + FSFile file[1]; BOOL bSuccess; char path[PATH_LENGTH]; @@ -75,9 +81,15 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) FS_InitFile(file); +#if (MEASURE_BANNER_LOAD_TIME == 1) start = OS_GetTick(); +#endif + readLen = NAM_GetTitleBootContentPathFast( path, titleID ); + +#if (MEASURE_BANNER_LOAD_TIME == 1) OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); +#endif // ファイルパスを取得 if(readLen != NAM_OK){ @@ -85,6 +97,10 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) return FALSE; } +#if (MEASURE_BANNER_LOAD_TIME == 1) + start = OS_GetTick(); +#endif + // ファイルオープン bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); if( ! bSuccess ) @@ -93,6 +109,11 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) return FALSE; } +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "OpenFileEX : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif + // ROMヘッダのバナーデータオフセットを読み込む bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET); if( ! bSuccess ) @@ -101,6 +122,12 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) FS_CloseFile(file); return FALSE; } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "FS_SeekFile offset: %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif + readLen = FS_ReadFile(file, &offset, sizeof(offset)); if( readLen != sizeof(offset) ) { @@ -108,9 +135,18 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) FS_CloseFile(file); return FALSE; } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "FS_ReadFile offset : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); +#endif // バナーが存在する場合のみリード if( offset ) { + +#if (MEASURE_BANNER_LOAD_TIME == 1) + start = OS_GetTick(); +#endif + bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET); if( ! bSuccess ) { @@ -118,6 +154,12 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) FS_CloseFile(file); return FALSE; } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "FS_SeekFile banner: %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif + readLen = FS_ReadFile( file, pDst, (s32)sizeof(TWLBannerFile) ); if( readLen != (s32)sizeof(TWLBannerFile) ) { @@ -125,21 +167,46 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) FS_CloseFile(file); return FALSE; } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "FS_ReadFile banner: %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif + if( !BANNER_CheckBanner( pDst ) ) { // 正当性チェック失敗の場合はバッファクリア MI_CpuClearFast( pDst, sizeof(TWLBannerFile) ); } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "check banner: %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); +#endif + }else { // バナーが存在しない場合はバッファクリア MI_CpuClearFast( pDst, sizeof(TWLBannerFile) ); } +#if (MEASURE_BANNER_LOAD_TIME == 1) + start = OS_GetTick(); +#endif + FS_CloseFile(file); +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "close file : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif + // サブバナーファイルを読み込んでみる if(NAM_OK == NAM_GetTitleBannerFilePath( path, titleID )) { + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "NAM_GetTitleBannerFilePath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); +#endif if( FS_OpenFileEx(file, path, FS_FILEMODE_R) ) { TWLSubBannerFile subBanner; @@ -153,16 +220,21 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) // 成功したのでコピーする pDst->h = subBanner.h; pDst->anime = subBanner.anime; - OS_TPrintf("BANNER_ReadBanner_NAND : subbanner check succeed. id=%.16x\n", titleID); +// OS_TPrintf("BANNER_ReadBanner_NAND : subbanner check succeed. id=%.16x\n", titleID); }else { - OS_TPrintf("BANNER_ReadBanner_NAND : subbanner check failed. id=%.16x\n", titleID); +// OS_TPrintf("BANNER_ReadBanner_NAND : subbanner check failed. id=%.16x\n", titleID); } }else { OS_TPrintf("BANNER_ReadBanner_NAND : subbanner read failed. id=%.16x\n", titleID); } } + +#if (MEASURE_BANNER_LOAD_TIME == 1) + OS_TPrintf( "open-read-close-check subbanner : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); +#endif + } return TRUE; diff --git a/build/libraries_sysmenu/namut/ARM9/src/namut.c b/build/libraries_sysmenu/namut/ARM9/src/namut.c index 2565f5a8..ba69d1b6 100644 --- a/build/libraries_sysmenu/namut/ARM9/src/namut.c +++ b/build/libraries_sysmenu/namut/ARM9/src/namut.c @@ -784,6 +784,9 @@ static void NAMUTi_ClearWiFiSettings( void ) *---------------------------------------------------------------------------*/ static void PrintDirectory(s32 depth, const char* path) { +#ifdef SDK_FINALROM +#pragma unused(path) +#endif int i; for (i=0; inum = count; + // end時間計測総合 + OS_TPrintf("SYSMi_makeTitleIdList : total %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - start)); } diff --git a/build/libraries_sysmenu/util/ARM9/src/util.c b/build/libraries_sysmenu/util/ARM9/src/util.c index 5569200b..e3db2a3d 100644 --- a/build/libraries_sysmenu/util/ARM9/src/util.c +++ b/build/libraries_sysmenu/util/ARM9/src/util.c @@ -16,6 +16,7 @@ *---------------------------------------------------------------------------*/ #include +#include #include // define data------------------------------------------ @@ -246,3 +247,31 @@ BOOL UTL_CheckRTCTime( RTCTime *timep ) return TRUE; } +//====================================================================== +// タイトル数取得 +//====================================================================== + +// ローンチ対象のアプリ数カウント +int UTL_GetInstalledSoftBoxCount( void ) +{ + int l; + int listNum; + int validNum = 0; + OSTitleId titleIDArray[ LCFG_TWL_FREE_SOFT_BOX_COUNT_MAX ]; + + MI_CpuClear32( titleIDArray, sizeof(titleIDArray) ); + + // インストールされているNANDアプリ全タイトルのTitleID取得 + listNum = NAM_GetNumTitles(); + (void)NAM_GetTitleList( titleIDArray, (u32)listNum ); + + // 取得したタイトルがローンチ対象かどうかをチェック + for( l = 0; l < listNum; l++ ) { + // "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加 + if( ( titleIDArray[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) { + validNum++; + } + } + return validNum; +} + diff --git a/build/nandfirm/menu-launcher/nandfirm.nandsf b/build/nandfirm/menu-launcher/nandfirm.nandsf index 86997aa8..a866877d 100644 --- a/build/nandfirm/menu-launcher/nandfirm.nandsf +++ b/build/nandfirm/menu-launcher/nandfirm.nandsf @@ -7,7 +7,7 @@ OUT_KEY : rsa_public.sbin WRAM_RBIN: ./wram_regs/wram_regs.rbin -MIRROR_OFS: 0x100000 +MIRROR_OFS: 0x80000 DECOMP_PROC : ARM9 # ARM9 or ARM7 diff --git a/build/nandfirm/nandfirm-print/nandfirm-BB.nandsf b/build/nandfirm/nandfirm-print/nandfirm-BB.nandsf index 8abce15b..f988a712 100644 --- a/build/nandfirm/nandfirm-print/nandfirm-BB.nandsf +++ b/build/nandfirm/nandfirm-print/nandfirm-BB.nandsf @@ -7,7 +7,7 @@ OUT_KEY : rsa_public.sbin WRAM_RBIN: ../../norfirm/norfirm-print/wram_regs/wram_regs.rbin -MIRROR_OFS: 0x100000 +MIRROR_OFS: 0x80000 DECOMP_PROC : ARM9 # ARM9 or ARM7 diff --git a/build/nandfirm/sdmc-launcher/nandfirm.nandsf b/build/nandfirm/sdmc-launcher/nandfirm.nandsf index 5b003f8b..0cb73cd2 100644 --- a/build/nandfirm/sdmc-launcher/nandfirm.nandsf +++ b/build/nandfirm/sdmc-launcher/nandfirm.nandsf @@ -7,7 +7,7 @@ OUT_KEY : rsa_public.sbin WRAM_RBIN: ./wram_regs/wram_regs.rbin -MIRROR_OFS: 0x100000 +MIRROR_OFS: 0x80000 DECOMP_PROC : ARM9 # ARM9 or ARM7 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 8fba7a72..b9491227 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -32,6 +32,8 @@ #define INIT_DEVICES_LIKE_UIG_LAUNCHER +#define MEASURE_TIME 1 + // function's prototype------------------------------------------------------- static void INTR_VBlank( void ); static void deleteTmp(); @@ -134,7 +136,7 @@ void TwlMain( void ) }; u32 state = LOGODEMO_INIT; TitleProperty *pBootTitle = NULL; - OSTick start, end = 0; + OSTick allstart, start, end = 0; BOOL direct_boot = FALSE; #ifdef DEBUG_LAUNCHER_DUMP @@ -149,6 +151,17 @@ void TwlMain( void ) // OS初期化------------------------ OS_InitTick(); + + // start 時間計測total +#if (MEASURE_TIME == 1) + allstart = OS_GetTick(); +#endif + + // start時間計測1 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif + PM_Init(); (void)OS_EnableIrq(); @@ -171,24 +184,39 @@ void TwlMain( void ) #ifdef USE_WRAM_LOAD HOTSW_Init(); #endif - + //NAMの初期化 NAM_Init( Alloc, Free ); - + OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) ); // 割り込み許可-------------------- (void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank); (void)OS_EnableIrqMask(OS_IE_V_BLANK); (void)GX_VBlankIntr(TRUE); - + // システムの初期化---------------- InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に - // Alloc, Freeで登録したメモリアロケータを初期化してください。 + + // end時間計測1 +#if (MEASURE_TIME == 1) + OS_TPrintf( "System Init Time 1: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + + // start時間計測1-b +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif + // Alloc, Freeで登録したメモリアロケータを初期化してください。 #ifdef INIT_DEVICES_LIKE_UIG_LAUNCHER // カメラ初期化 CAMERA_Init(); + // end時間計測1-b +#if (MEASURE_TIME == 1) + OS_TPrintf( "Camera Init: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // DSP初期化 #if 0 { @@ -211,11 +239,27 @@ void TwlMain( void ) DSP_UnloadJpegDecoder(); } #endif + #endif // INIT_DEVICES_LIKE_UIG_LAUNCHER + // start時間計測1-c +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif + // 各種パラメータの取得------------ pBootTitle = SYSM_ReadParameters(); // 本体設定データ、リセットパラメータのリード、検査用オート起動カード判定、量産ライン用キーショートカット起動判定等のリード + // end時間計測1-c +#if (MEASURE_TIME == 1) + OS_TPrintf( "SYSM_ReadParameters: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + + // start時間計測2 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif + // TPキャリブレーション UTL_CaribrateTP( LCFG_TSD_GetTPCalibrationPtr() ); @@ -225,21 +269,53 @@ void TwlMain( void ) if( !LCFG_TSD_IsFinishedInitialSetting() ) { // 初回起動シーケンス判定 } - + (void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される) + // end時間計測2 +#if (MEASURE_TIME == 1) + OS_TPrintf( "GetCardTitleList Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // start時間計測3 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif // TMPフォルダのクリーン SYSM_DeleteTmpDirectory( pBootTitle ); + // end時間計測3 +#if (MEASURE_TIME == 1) + OS_TPrintf( "TmpClean : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // start時間計測4 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif // NANDタイトルリストの準備 SYSM_InitNandTitleList(); + // end時間計測4 +#if (MEASURE_TIME == 1) + OS_TPrintf( "InitNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // start時間計測5 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif // 「ダイレクトブートでない」なら if( !pBootTitle ) { // NAND & カードアプリリスト取得 (void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される) } + // end時間計測5 +#if (MEASURE_TIME == 1) + OS_TPrintf( "GetNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // start時間計測6 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif // 「ダイレクトブートでない」もしくは // 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------ if( !pBootTitle || @@ -251,9 +327,17 @@ void TwlMain( void ) timestamp = OS_GetSharedFontTimestamp(); if( timestamp > 0 ) OS_TPrintf( "SharedFont timestamp : %08x\n", timestamp ); } + // end時間計測6 +#if (MEASURE_TIME == 1) + OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif // 開始ステートの判定-------------- + // start時間計測7 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif if( pBootTitle ) { // ダイレクトブートなら、ロゴ、ランチャーを飛ばしてロード開始 if( pBootTitle->flags.isLogoSkip ) { @@ -292,19 +376,36 @@ void TwlMain( void ) s_strmThreadStack + THREAD_STACK_SIZE / sizeof(u64), THREAD_STACK_SIZE, STREAM_THREAD_PRIO); OS_WakeupThreadDirect(&s_strmThread); + // end時間計測7 +#if (MEASURE_TIME == 1) + OS_TPrintf( "time 7 (etc...) : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif + // start時間計測8 +#if (MEASURE_TIME == 1) + start = OS_GetTick(); +#endif // 無線ファームウェアを無線モジュールにダウンロードする。 #ifndef DISABLE_WLFIRM_LOAD if( FALSE == InstallWlanFirmware( SYSM_IsHotStart() ) ) { OS_TPrintf( "ERROR: Wireless firmware download failed!\n" ); } #endif // DISABLE_WLFIRM_LOAD + // end時間計測8 +#if (MEASURE_TIME == 1) + OS_TPrintf( "Load WlanFirm Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); +#endif if( SYSM_IsFatalError() ) { // FATALエラー処理 } + // end 時間計測total +#if (MEASURE_TIME == 1) + OS_TPrintf( "Total Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - allstart ) ); +#endif + // メインループ-------------------- while( 1 ) { OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち diff --git a/docs/AboutApplicationJump.doc b/docs/AboutApplicationJump.doc index 0e0f7f8b..4ef9565c 100644 Binary files a/docs/AboutApplicationJump.doc and b/docs/AboutApplicationJump.doc differ diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index 94de957a..20b49685 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -19,6 +19,7 @@ #define __SYSM_UTIL_H__ #include +#include #ifdef __cplusplus extern "C" { @@ -53,6 +54,16 @@ extern BOOL UTL_IsLeapYear100( u32 year ); // extern u32 UTL_CalcPCTLInquiryCode( void ); // 問い合わせコード(10進8桁)算出 extern u32 UTL_CalcPCTLMasterKey( void ); // マスターキー  (10進5桁)算出(※内部でRTC_GetDateを使用します。) +// タイトル数取得(内部でNAMを使用するので、NAM_Initが事前に呼ばれている必要あり) +extern int UTL_GetInstalledSoftBoxCount( void ); + +// アプリROMヘッダの要EULAフラグ取得 +static inline BOOL UTL_IsROMHeaderEULARequired( void ) +{ + return (BOOL)SYSM_GetAppRomHeader()->agree_EULA; +} + + #endif #ifdef __cplusplus