From 510d228557ed08655f567e511a50986a7e59347d Mon Sep 17 00:00:00 2001 From: yosiokat Date: Thu, 15 May 2008 12:00:44 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E5=85=B1=E6=9C=89=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=83=AA=E3=83=BC=E3=83=89=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=AA=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?=20=E3=83=BB=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E5=85=B1=E6=9C=89=E3=83=95=E3=82=A9=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=83=89=E3=82=92=E5=AE=9F=E8=A3=85=E3=80=82?= =?UTF-8?q?=20=E3=83=BB=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=E8=B5=B7=E5=8B=95=E6=99=82=E3=81=AETMP=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E3=82=AF=E3=83=AA=E3=83=BC=E3=83=B3=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82?= 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@1368 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries_sysmenu/Makefile | 3 +- .../libraries_sysmenu/namut/ARM9/src/namut.c | 9 +- .../sharedFont/ARM9/Makefile | 47 +++ .../sharedFont/ARM9/src/sharedFont.c | 318 ++++++++++++++++++ build/libraries_sysmenu/sharedFont/Makefile | 33 ++ .../sysmenu/ARM9/src/sysmenu_lib.c | 14 + build/systemMenu_RED/Launcher/ARM9/Makefile | 10 +- .../Launcher/ARM9/src/loadSharedFont.c | 141 ++++++++ .../Launcher/ARM9/src/loadSharedFont.h | 39 +++ build/systemMenu_RED/Launcher/ARM9/src/main.c | 147 ++------ docs/format_ROM_Header.xls | Bin 92672 -> 92672 bytes include/sysmenu.h | 1 + include/sysmenu/namut.h | 13 + .../sysmenu/sysmenu_lib/common/sysmenu_api.h | 1 + 14 files changed, 648 insertions(+), 128 deletions(-) create mode 100644 build/libraries_sysmenu/sharedFont/ARM9/Makefile create mode 100644 build/libraries_sysmenu/sharedFont/ARM9/src/sharedFont.c create mode 100644 build/libraries_sysmenu/sharedFont/Makefile create mode 100644 build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.c create mode 100644 build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.h diff --git a/build/libraries_sysmenu/Makefile b/build/libraries_sysmenu/Makefile index 15e87a59..ae53007b 100644 --- a/build/libraries_sysmenu/Makefile +++ b/build/libraries_sysmenu/Makefile @@ -32,7 +32,8 @@ SUBDIRS_P = reloc_info \ mcu \ ds \ dht \ - wds + wds \ + sharedFont #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/namut/ARM9/src/namut.c b/build/libraries_sysmenu/namut/ARM9/src/namut.c index a8f094be..7cf42123 100644 --- a/build/libraries_sysmenu/namut/ARM9/src/namut.c +++ b/build/libraries_sysmenu/namut/ARM9/src/namut.c @@ -88,7 +88,6 @@ static char sCurrentFullPath[FS_ENTRY_LONGNAME_MAX]; static BOOL NAMUTi_DeleteNonprotectedTitle(void); static BOOL NAMUTi_DeleteNonprotectedTitleEntity(const char* path); static BOOL NAMUTi_ClearSavedataAll(void); -static BOOL NAMUTi_DeleteNandDirectory(const char *path); static BOOL NAMUTi_MountAndFormatOtherTitleSaveData(u64 titleID, const char *arcname); static void NAMUTi_DrawNandTree(s32 depth, const char *path); static BOOL NAMUTi_FillFile(const char* path); @@ -139,10 +138,10 @@ BOOL NAMUT_Format(void) // NAM関数でtempが作成&使用される可能性があるため最後に実行します for (i=0; i +#include +#include "fs_wram.h" + +// compile switch-------------------------------------------------------------- +//#define HASH_CHECK_OFF +#define USE_FONT_WRAM_LOAD +// extern data----------------------------------------------------------------- +// define data----------------------------------------------------------------- +#define WRAM_SLOT_FOR_FS 4 +#define WRAM_SIZE_FOR_FS MI_WRAM_SIZE_96KB + +#define SHARED_FONT_TABLE_PATH "nand:/sys/TWLFontTable.dat" +#define SHARED_FONT_FILE_NAME_LENGTH 0x20 +#define SHARED_FONT_SIGN_SIZE 0x80 + +typedef struct SFONTHeader { + u32 timestamp; + u16 fontNum; + u8 pad[ 6 ]; + u8 digest[ SVC_SHA1_DIGEST_SIZE ]; +}SFONTHeader; + +typedef struct SFONTInfo { + u8 fileName[ SHARED_FONT_FILE_NAME_LENGTH ]; + u8 pad[ 4 ]; + u32 offset; + u32 length; + u8 digest[ SVC_SHA1_DIGEST_SIZE ]; +}SFONTInfo; + +typedef struct SFONTWork { + SFONTHeader header; + SFONTInfo *pInfoTable; +}SFONTWork; + +typedef struct CalcSHA1CallbackArg +{ + SVCSHA1Context ctx; + u32 hash_length; +} CalcSHA1CallbackArg; + +// function's prototype------------------------------------------------------- +static void CalcSHA1Callback(const void* addr, const void* orig_addr, u32 len, MIWramPos wram, s32 slot, void* arg); + +// global variable------------------------------------------------------------- +// static variable------------------------------------------------------------- +static SFONTWork s_work; +static BOOL s_isInitialized = FALSE; + +// const data------------------------------------------------------------------ +static const u8 s_sharedFontPubKey[] = { + 0x9f, 0x80, 0xbc, 0x5f, 0xb6, 0xb6, 0x1d, 0x2a, 0x46, 0x02, 0x52, 0x64, 0xb2, 0xa3, 0x86, 0xce, + 0xe6, 0x54, 0xd3, 0xa9, 0x70, 0x5b, 0xe3, 0xc2, 0x10, 0xa9, 0xb5, 0x2f, 0x38, 0xc5, 0x51, 0xfb, + 0xb5, 0xd1, 0x80, 0xfd, 0xff, 0x20, 0x65, 0xc1, 0x28, 0x4d, 0x56, 0xbe, 0xfb, 0xbd, 0x3f, 0xe4, + 0xba, 0xf7, 0x9c, 0x3a, 0x33, 0x74, 0x74, 0x9d, 0xdb, 0xdd, 0x9e, 0x86, 0x05, 0x2c, 0xad, 0xfc, + 0x93, 0xfa, 0xfb, 0x08, 0xea, 0x71, 0x18, 0x36, 0xc5, 0xdc, 0x4c, 0x06, 0x34, 0x57, 0xa7, 0x8f, + 0x4e, 0x82, 0xf7, 0xb3, 0xe2, 0x9c, 0xe4, 0x72, 0xe3, 0xdc, 0x60, 0xaf, 0xcc, 0x18, 0xe2, 0xd4, + 0xef, 0xd2, 0x76, 0x47, 0x31, 0xe6, 0x14, 0x0e, 0x1d, 0x26, 0xb5, 0x85, 0x97, 0xbc, 0xc6, 0xb6, + 0xd8, 0xe7, 0x69, 0x2d, 0x2c, 0x26, 0xfb, 0x5f, 0x70, 0x9e, 0x19, 0x9c, 0x6b, 0x02, 0x6d, 0x97 +}; + +// 共有フォント初期化 +BOOL SFONT_Init( void ) +{ + FSFile file[1]; + u8 signature[ SHARED_FONT_SIGN_SIZE ]; + + if( s_isInitialized ) { + return TRUE; + } + + MI_CpuClear32( &s_work, sizeof(s_work) ); + + if( !FS_OpenFileEx( file, SHARED_FONT_TABLE_PATH, FS_FILEMODE_R ) ) { + return FALSE; + } + + // 署名リード + if( FS_ReadFile( file, signature, SHARED_FONT_SIGN_SIZE ) != SHARED_FONT_SIGN_SIZE ){ + goto ERROR; + } + + // ヘッダリード + if( FS_ReadFile( file, &s_work.header, sizeof(SFONTHeader) ) != sizeof(SFONTHeader) ){ + goto ERROR; + } + + FS_CloseFile( file ); + +#ifndef HASH_CHECK_OFF + // ヘッダ署名チェック + { + u8 calc_digest[ SVC_SHA1_DIGEST_SIZE ]; + u8 sign_digest[ SVC_SHA1_DIGEST_SIZE ]; + static u32 heap[ 4096 / sizeof(u32) ]; + + SVCSignHeapContext acmemoryPool; + SVC_CalcSHA1( calc_digest, &s_work.header, sizeof(SFONTHeader) ); + SVC_InitSignHeap( &acmemoryPool, heap, 4096 ); + if( !SVC_DecryptSign( &acmemoryPool, sign_digest, signature, s_sharedFontPubKey ) ) { + return FALSE; + } + if( !SVC_CompareSHA1( calc_digest, sign_digest ) ) { + return FALSE; + } + } +#endif + +#ifdef USE_FONT_WRAM_LOAD + // WRAM利用Read関数の準備、WRAMCの後半だけ解放しておく + FS_InitWramTransfer(3); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); +#endif // USE_FONT_WRAM_LOAD + + s_isInitialized = TRUE; + return TRUE; + +ERROR: + FS_CloseFile( file ); + return FALSE; +} + + +// 共有フォント テーブルサイズ取得 +int SFONT_GetInfoTableSize( void ) +{ + if( s_isInitialized ) { + return (int)( s_work.header.fontNum * sizeof(SFONTInfo) ); + }else { + return -1; + } +} + + +// 共有フォント テーブルロード +BOOL SFONT_LoadInfoTable( void *pBuffer ) +{ + FSFile file[1]; + u32 tableLen = sizeof(SFONTInfo) * s_work.header.fontNum; + + if( ( !s_isInitialized ) || + ( s_work.header.fontNum == 0 ) || + ( pBuffer == NULL ) || + ( s_work.pInfoTable ) ) { + return FALSE; + } + + // フォントInfoテーブルリード + if( !FS_OpenFileEx( file, SHARED_FONT_TABLE_PATH, FS_FILEMODE_R ) ) { + return FALSE; + } + if( !FS_SeekFile( file, SHARED_FONT_SIGN_SIZE + sizeof(SFONTHeader), FS_SEEK_SET ) ){ + goto ERROR; + } + if( FS_ReadFile( file, pBuffer, (int)tableLen ) != tableLen ){ + goto ERROR; + } + FS_CloseFile( file ); + +#ifndef HASH_CHECK_OFF + // フォントInfoテーブル ハッシュチェック + { + u8 calc_digest[ SVC_SHA1_DIGEST_SIZE ]; + SVC_CalcSHA1( calc_digest, pBuffer, tableLen ); + if( !SVC_CompareSHA1( calc_digest, s_work.header.digest ) ) { + return FALSE; + } + } +#endif + + s_work.pInfoTable = pBuffer; + return TRUE; + +ERROR: + FS_CloseFile( file ); + return FALSE; +} + + +// 共有フォント フォントサイズ取得 +int SFONT_GetFontSize( SFONT_Index index ) +{ + if( ( s_isInitialized == NULL ) || + ( s_work.pInfoTable == NULL ) || + ( index >= s_work.header.fontNum ) || + ( index >= SHARED_FONT_MAX ) ) { + return -1; + } + + return (int)s_work.pInfoTable[ index ].length; +} + + +// 共有フォント フォントネーム取得 +const u8 *SFONT_GetFontName( SFONT_Index index ) +{ + if( ( s_isInitialized == NULL ) || + ( s_work.pInfoTable == NULL ) || + ( index >= s_work.header.fontNum ) || + ( index >= SHARED_FONT_MAX ) ) { + return NULL; + } + + return s_work.pInfoTable[ index ].fileName; +} + + +// 共有フォント タイムスタンプ取得 +u32 SFONT_GetFontTimestamp( void ) +{ + if( ( s_isInitialized == NULL ) ) { + return 0; + } + return s_work.header.timestamp; +} + + +// 共有フォント フォントロード +BOOL SFONT_LoadFont( SFONT_Index index, void *pBuffer ) +{ + FSFile file[1]; + SFONTInfo *pInfo = &s_work.pInfoTable[ index ]; + u8 calc_digest[ SVC_SHA1_DIGEST_SIZE ]; + + if( ( s_isInitialized == NULL ) || + ( s_work.pInfoTable == NULL ) || + ( index >= s_work.header.fontNum ) || + ( index >= SHARED_FONT_MAX ) ) { + return FALSE; + } + + // フォント リード + if( !FS_OpenFileEx( file, SHARED_FONT_TABLE_PATH, FS_FILEMODE_R ) ) { + return FALSE; + } + if( !FS_SeekFile( file, (int)pInfo->offset, FS_SEEK_SET ) ){ + goto ERROR; + } +#ifdef USE_FONT_WRAM_LOAD + { + CalcSHA1CallbackArg arg; + SVC_SHA1Init( &arg.ctx ); + arg.hash_length = pInfo->length; + if( !FS_ReadFileViaWram( file, pBuffer, (s32)MATH_ROUNDUP( pInfo->length, 0x20 ), MI_WRAM_C, + WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, +#ifndef HASH_CHECK_OFF + CalcSHA1Callback, +#else + NULL, +#endif // HASH_CHECK_OFF + &arg ) ) { + goto ERROR; + } + SVC_SHA1GetHash( &arg.ctx, &calc_digest ); + } +#else + if( FS_ReadFile( file, pBuffer, (int)pInfo->length ) != pInfo->length ){ + goto ERROR; + } +#ifndef HASH_CHECK_OFF + SVC_CalcSHA1( calc_digest, pBuffer, pInfo->length ); +#endif // HASH_CHECK_OFF +#endif // USE_FONT_WRAM_LOAD + + FS_CloseFile( file ); + +#ifndef HASH_CHECK_OFF + // フォント ハッシュチェック + if( !SVC_CompareSHA1( calc_digest, pInfo->digest ) ) { + return FALSE; + } +#endif // HASH_CHECK_OFF + + return TRUE; + +ERROR: + FS_CloseFile( file ); + return FALSE; +} + + +#ifdef USE_FONT_WRAM_LOAD +// FS-WRAM転送時のSHA1計算コールバック +static void CalcSHA1Callback(const void* addr, const void* orig_addr, u32 len, MIWramPos wram, s32 slot, void* arg) +{ +#pragma unused(orig_addr) +#pragma unused(wram) +#pragma unused(slot) + CalcSHA1CallbackArg *cba = (CalcSHA1CallbackArg *)arg; + u32 calc_len = ( cba->hash_length < len ? cba->hash_length : len ); + if( calc_len == 0 ) return; + cba->hash_length -= calc_len; + SVC_SHA1Update( &cba->ctx, addr, calc_len ); +} +#endif // USE_FONT_WRAM_LOAD diff --git a/build/libraries_sysmenu/sharedFont/Makefile b/build/libraries_sysmenu/sharedFont/Makefile new file mode 100644 index 00000000..a2098ba3 --- /dev/null +++ b/build/libraries_sysmenu/sharedFont/Makefile @@ -0,0 +1,33 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +TARGET_FIRM = SYSTEMMENU + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM9 + +#---------------------------------------------------------------------------- + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 0ccb862e..386bf8fe 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include "internal_api.h" @@ -128,6 +129,19 @@ void SYSMi_SendKeysToARM7( void ) } +// nandのtmpディレクトリの中身を消す +void SYSM_DeleteTmpDirectory( TitleProperty *pBootTitle ) +{ + // bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す + if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP ) { + if( NAMUT_DeleteNandDirectory( "nand:/tmp" ) ) { + OS_TPrintf( "\"nand:/tmp\" delete succeeded.\n" ); + }else { + OS_TPrintf( "\"nand:/tmp\" delete failed.\n" ); + } + } +} + // ============================================================================ // // 情報取得 diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index e3db3acf..e9a2da7a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -1,3 +1,4 @@ + #! make -f #---------------------------------------------------------------------------- # Project: TwlSDK - demos - simpleShoot-1 @@ -20,8 +21,9 @@ SUBDIRS = \ ../../../libraries_sysmenu/sysmenu \ ../../../libraries_sysmenu/boot \ - ../../../components/hyena.TWL -# ../../../libraries_sysmenu/hotsw \ + ../../../components/hyena.TWL \ + ../../../libraries_sysmenu/hotsw \ + ../../../libraries_sysmenu/sharedFont \ # ../../../libraries_sysmenu/reloc_info \ # ../../../libraries_sysmenu/mcu \ # ../../../libraries_sysmenu/ds \ @@ -76,7 +78,7 @@ MISC_DIR = ../../misc BG_DIR = ../../data SRCS_LOGO = logoDemo.c logoData.c -SRCS = main.c launcher.c sound.c bannerCounter.c loadWlanFirm.c scanWDS.c \ +SRCS = main.c launcher.c sound.c bannerCounter.c loadWlanFirm.c loadSharedFont.c scanWDS.c \ $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO)) \ $(MISC_DIR)/src/misc.c $(MISC_DIR)/src/cmn.c \ $(BG_DIR)/BGData_Launcher.c @@ -92,6 +94,8 @@ LLIBRARIES += libes$(TWL_LIBSUFFIX).a \ libnam$(TWL_LIBSUFFIX).a \ libsea$(TWL_LIBSUFFIX).a \ libreloc_info$(TWL_LIBSUFFIX).a \ + libnamut$(TWL_LIBSUFFIX).a \ + libsharedfont$(TWL_LIBSUFFIX).a \ WDS$(TWL_LIBSUFFIX).a ADDRESS_DTCM = 0x0e000000 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.c b/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.c new file mode 100644 index 00000000..0808de66 --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.c @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: loadSharedFont.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include "launcher.h" +#include "misc.h" +#include "loadSharedFont.h" + +// extern data----------------------------------------------------------------- + +// define data----------------------------------------------------------------- +#define FONT_LOAD_THREAD_PRIO 13 +#define THREAD_STACK_SIZE 1024 + +// function's prototype------------------------------------------------------- + +// global variable------------------------------------------------------------- + +// static variable------------------------------------------------------------- +static u64 s_fontLoadThreadStack[THREAD_STACK_SIZE / sizeof(u64)]; +static OSThread s_fontLoadThread; +static OSTick s_fontLoadStartTick; +static u8 *s_pFontBuffer[ SHARED_FONT_MAX ]; // 読み込みはテストなのでロード先はstatic変数にしている。 +static BOOL s_isStarted = FALSE; + +// const data------------------------------------------------------------------ + + +// ============================================================================ +// 共有フォントロード +// ============================================================================ +BOOL LoadSharedFontInit( void ) +{ + u8 *pBuffer; + int size; + + s_fontLoadStartTick = OS_GetTick(); + + // ロードスレッド生成 + OS_CreateThread(&s_fontLoadThread, + LoadSharedFontThread, + NULL, + s_fontLoadThreadStack + THREAD_STACK_SIZE / sizeof(u64), + THREAD_STACK_SIZE, FONT_LOAD_THREAD_PRIO); + + // フォントロード準備 + if( !SFONT_Init() ) { + OS_TPrintf( "SFONT_LoadInfoTable failed.\n" ); + return FALSE; + } + size = SFONT_GetInfoTableSize(); + if( size < 0 ) { + OS_TPrintf( "SFONT_GetInfoTableSize failed.\n" ); + return FALSE; + } + + pBuffer = Alloc( (u32)size ); + if( pBuffer == NULL ) { + OS_TPrintf( "malloc failed.\n" ); + return FALSE; + } + if( !SFONT_LoadInfoTable( pBuffer ) ) { + OS_TPrintf( "SFONT_LoadInfoTable failed.\n" ); + return FALSE; + } + + // ロードスレッド起動 + OS_WakeupThreadDirect(&s_fontLoadThread); + s_isStarted = TRUE; + return TRUE; +} + + +void LoadSharedFontThread( void *arg ) +{ +#pragma unused(arg) + BOOL retval = TRUE; + SFONT_Index i; + + for( i = SHARED_FONT_WW_S; i < SHARED_FONT_MAX; i++ ) { + int size; + + OS_TPrintf( "%s read.\n", SFONT_GetFontName( i ) ); + + size = SFONT_GetFontSize( i ); + if( size < 0 ) { + OS_TPrintf( "SFONT_GetFontSize failed.\n" ); + retval = FALSE; + break; + } + + // FSのキャッシュが怪しそうなので、とりあえずアラインメントをとっておく。 + size = MATH_ROUNDUP( size, SYSM_ALIGNMENT_LOAD_MODULE ); + + s_pFontBuffer[ i ] = Alloc( (u32)size ); + if( s_pFontBuffer[ i ] == NULL ) { + OS_TPrintf( "malloc failed.\n" ); + retval = FALSE; + break; + } + + if( !SFONT_LoadFont( i, s_pFontBuffer[ i ] ) ) { + OS_TPrintf( "SFONT_LoadFont failed.\n" ); + retval = FALSE; + break; + } + } + OS_TPrintf( "Shared Font load time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - s_fontLoadStartTick ) ); + + if( retval ) { + OS_TPrintf( "Shared Font load succeeded.\n" ); + }else { + OS_TPrintf( "Shared Font load failed.\n" ); + SYSM_SetFatalError( TRUE ); + } +} + + +BOOL IsFinishedLoadSharedFont( void ) +{ + if( s_isStarted ) { + return OS_IsThreadTerminated( &s_fontLoadThread ); + }else { + return TRUE; + } +} + diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.h b/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.h new file mode 100644 index 00000000..68aae71d --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadSharedFont.h @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: loadSharedFont.h + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#ifndef __LOAD_SHARED_FONT_H__ +#define __LOAD_SHARED_FONT_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// define data------------------------------------------------------- +// global variables-------------------------------------------------- +// function---------------------------------------------------------- +BOOL LoadSharedFontInit( void ); +void LoadSharedFontThread( void *arg ); +BOOL IsFinishedLoadSharedFont( void ); + +#ifdef __cplusplus +} +#endif + +#endif // __LOAD_SHARED_FONT_H__ diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 76cc1977..7b47e63a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -21,25 +21,25 @@ #include "logoDemo.h" #include "sound.h" #include "loadWlanFirm.h" +#include "loadSharedFont.h" // extern data----------------------------------------------------------------- // define data----------------------------------------------------------------- - // function's prototype------------------------------------------------------- static void INTR_VBlank( void ); static void deleteTmp(); +void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- static TitleProperty s_titleList[ LAUNCHER_TITLE_LIST_NUM ]; -static u64 strmThreadStack[THREAD_STACK_SIZE / sizeof(u64)]; -static OSThread strmThread; - -static StreamInfo strm; // stream info +static u64 s_strmThreadStack[THREAD_STACK_SIZE / sizeof(u64)]; +static OSThread s_strmThread; +static StreamInfo s_strm; // stream info // const data------------------------------------------------------------------ @@ -140,18 +140,14 @@ void TwlMain( void ) (void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得(カードアプリはs_titleList[0]に格納される) - // bootTypeがLAUNCHER_BOOTTYPE_TEMPでない場合、tmpフォルダ内のデータを消す - if( !pBootTitle || pBootTitle->flags.bootType != LAUNCHER_BOOTTYPE_TEMP ) - { - deleteTmp(); - } + // TMPフォルダのクリーン + SYSM_DeleteTmpDirectory( pBootTitle ); // NANDタイトルリストの準備 SYSM_InitNandTitleList(); // 「ダイレクトブートでない」なら if( !pBootTitle ) { - // NAND & カードアプリリスト取得 (void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得(内蔵アプリはs_titleList[1]から格納される) } @@ -160,9 +156,13 @@ void TwlMain( void ) // 「ダイレクトブートだが、ロゴデモ表示」の時、各種リソースのロード------------ if( !pBootTitle || ( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) { -// FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード -// FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード - } + u32 timestamp; + if( !LoadSharedFontInit() ) { // 共有フォントのロード + SYSM_SetFatalError( TRUE ); + } + timestamp = SFONT_GetFontTimestamp(); + if( timestamp > 0 ) OS_TPrintf( "SharedFont timestamp : %08x\n", timestamp ); + } // 開始ステートの判定-------------- @@ -198,12 +198,12 @@ void TwlMain( void ) SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0); /* ストリームスレッドの起動 */ - OS_CreateThread(&strmThread, + OS_CreateThread(&s_strmThread, StrmThread, NULL, - strmThreadStack + THREAD_STACK_SIZE / sizeof(u64), + s_strmThreadStack + THREAD_STACK_SIZE / sizeof(u64), THREAD_STACK_SIZE, STREAM_THREAD_PRIO); - OS_WakeupThreadDirect(&strmThread); + OS_WakeupThreadDirect(&s_strmThread); // 無線ファームウェアを無線モジュールにダウンロードする。 @@ -233,15 +233,21 @@ void TwlMain( void ) case LOGODEMO_INIT: LogoInit(); // 音鳴らすテスト - FS_InitFile(&strm.file); - strm.isPlay = FALSE; - PlayStream(&strm, filename); + FS_InitFile(&s_strm.file); + s_strm.isPlay = FALSE; + PlayStream(&s_strm, filename); state = LOGODEMO; break; case LOGODEMO: - if( LogoMain() ) { - if( !direct_boot ) { + if( LogoMain() && + IsFinishedLoadSharedFont() ) { // フォントロード終了をここでチェック +#if 0 + if( SYSM_IsFatalError() ) { + state = STOP; + }else +#endif + if( !direct_boot ) { state = LAUNCHER_INIT; }else { state = LOAD_START; @@ -333,100 +339,3 @@ static void INTR_VBlank(void) OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット } -// ============================================================================ -// ディレクトリ操作 -// ============================================================================ - -// nandのtmpディレクトリの中身を消す -static void deleteTmp() -{ - if( FS_DeleteFile( OS_TMP_APP_PATH ) ) - { - OS_TPrintf( "deleteTmp: deleted File '%s' \n", OS_TMP_APP_PATH ); - }else - { - FSResult res = FS_GetArchiveResultCode("nand"); - if( FS_RESULT_SUCCESS == res ) - { - OS_TPrintf( "deleteTmp: File '%s' not exists.\n", OS_TMP_APP_PATH ); - }else - { - OS_TPrintf( "deleteTmp: delete File '%s' failed. Error code = %d.\n", OS_TMP_APP_PATH, res ); - } - } -} - -#define OS_SHARED_FONT_FILE_NAME_LENGTH 0x20 - -typedef struct OSSharedFontHeader { - u32 timestamp; - u16 fontNum; - u8 pad[ 6 ]; - u8 digest[ SVC_SHA1_DIGEST_SIZE ]; -}OSSharedFontHeader; - -typedef struct OSSharedFontInfo { - u8 fileName[ OS_SHARED_FONT_FILE_NAME_LENGTH ]; - u8 pad[ 4 ]; - u32 offset; - u32 length; - u8 digest[ SVC_SHA1_DIGEST_SIZE ]; -}OSSharedFontInfo; - -#if 0 -BOOL ReadSharedFontTable( void ) -{ -#define SIGN_SIZE 0x80 -#define HEADER_SIZE 0x20 - const char *pPath = "sdmc:/TWLFontTable.dat"; - FSFile file[1]; - u8 signature[ SIGN_SIZE ]; - OSSharedFontHeader header; - u8 calc_digest[ SVC_SHA1_DIGEST_SIZE ]; - u8 sign_digest[ SVC_SHA1_DIGEST_SIZE ]; - static u32 heap[ 4096 / sizeof(u32) ]; - SVCSignHeapContext acmemoryPool; - u32 len = 0; - - if( !FS_OpenFileEx( file, pPath, FS_FILEMODE_R ) ) { - return FALSE; - } - - // 署名リード - if( FS_ReadFile( file, signature, SIGN_SIZE ) != SIGN_SIZE ){ - goto ERROR; - } - - // ヘッダリード - if( FS_ReadFile( file, header, HEADER_SIZE ) != HEADER_SIZE ){ - goto ERROR; - } - - // ヘッダ署名チェック - SVC_InitSignHeap( &acmemoryPool, heap, 4096 ); - if( !SVC_DecryptSign( &acmemoryPool, sign_digest, signature, pPubKey ) ) { - goto ERROR; - } - - // フォントInfoテーブルリード - len = sizeof(OSSHaredFontInfo) * header->fontNum; - if( FS_ReadFile( file, infoTable, len ) != len ){ - goto ERROR; - } - - // フォントInfoテーブル ハッシュチェック - SVC_CalcSHA1( calc_digest, infoTable, len ); - if( !SVC_CompareSHA1( calc_digest, header->digest ) ) { - return FALSE; - } - - - - FS_CloseFile( file ); - - -ERROR: - FS_CloseFile( file ); - return FALSE; -} -#endif diff --git a/docs/format_ROM_Header.xls b/docs/format_ROM_Header.xls index ee0533025136acd3c571c354eb70d783f88d0f07..1a170996d54fc7950e745a656fee5f21989d50ee 100644 GIT binary patch delta 9526 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 Ibg6Xp|3oK79RL6T delta 9450 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 C1_N#Y diff --git a/include/sysmenu.h b/include/sysmenu.h index 4d0dd104..035761cd 100644 --- a/include/sysmenu.h +++ b/include/sysmenu.h @@ -33,6 +33,7 @@ #include #include #include +#include /* SYSMENU_H_ */ #endif diff --git a/include/sysmenu/namut.h b/include/sysmenu/namut.h index a9dfdb10..d00ce5b4 100644 --- a/include/sysmenu/namut.h +++ b/include/sysmenu/namut.h @@ -95,6 +95,19 @@ BOOL NAMUTi_ClearSavedataPrivate(const char* path, u64 titleID); *---------------------------------------------------------------------------*/ BOOL NAMUTi_DestroySubBanner(const char* path); +/*---------------------------------------------------------------------------* + Name: NAMUT_DeleteNandDirectory + + Description: 指定ディレクトリ以下を消去します。 + 指定ディレクトリ自体は残ります。 + + Arguments: path : 絶対パス(スラッシュを含めない) + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL NAMUT_DeleteNandDirectory(const char *path); + + #endif // SDK_ARM9 #ifdef __cplusplus diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 31d972e6..0cdb6196 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -89,6 +89,7 @@ extern void SYSM_InitPXI( void ); // PXI extern void SYSM_SetArena( void ); // システムメニューのアリーナ初期化。OS_Initの後で呼んでください。 extern void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) ); // SYSM_initで設定した場合は必要なし。 extern TitleProperty *SYSM_ReadParameters( void ); // 本体設定データ、ランチャーパラメータなどを取得 +extern void SYSM_DeleteTmpDirectory( TitleProperty *pBootTitle ); // "nand:/tmp"フォルダのクリーン // アプリ情報取得 extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // カードアプリタイトルリストの取得