From f99d45cd2f643c03de683cd6baa23c5dcb5326f0 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Wed, 11 Jun 2008 05:33:45 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBSDK5.0FCplus4=E7=94=A8IPL=E3=83=96?= =?UTF-8?q?=E3=83=A9=E3=83=B3=E3=83=81=E3=81=AE=E3=83=9E=E3=83=BC=E3=82=B8?= =?UTF-8?q?=20=E3=83=BB=E6=99=82=E9=96=93=E8=A8=88=E6=B8=AC=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E8=BF=BD=E5=8A=A0?= 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@1597 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/hyena.TWL/hyena.lsf | 11 ++ .../banner/ARM9/src/banner.c | 76 +++++++++++- .../libraries_sysmenu/namut/ARM9/src/namut.c | 6 + .../sysmenu/ARM9/src/title.c | 30 +++++ build/libraries_sysmenu/util/ARM9/src/util.c | 29 +++++ build/nandfirm/menu-launcher/nandfirm.nandsf | 2 +- .../nandfirm-print/nandfirm-BB.nandsf | 2 +- build/nandfirm/sdmc-launcher/nandfirm.nandsf | 2 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 113 +++++++++++++++++- docs/AboutApplicationJump.doc | Bin 146944 -> 147456 bytes include/sysmenu/util.h | 11 ++ 11 files changed, 271 insertions(+), 11 deletions(-) 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 0e0f7f8b64fca7cb038fc3a17ab0f9a93e91f5fe..4ef9565c1a421ff49feb421fb5f60f93c26acda2 100644 GIT binary patch delta 6290 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 delta 5800 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 +#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