TWL共有フォントのロードライブラリをSDKに移行。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1388 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-05-19 01:20:57 +00:00
parent fc5a0f14af
commit 051f8fdf12
7 changed files with 1073 additions and 337 deletions

View File

@ -24,15 +24,17 @@ TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
SRCDIR = src
SRCS = sharedFont.c
SRCDIR = $(ROOT)/build/libraries/os/ARM9.TWL/src/
SRCS = os_sharedFont.c
TARGET_LIB = libsharedfont$(TWL_LIBSUFFIX).a
TARGET_LIB = libsharedfont_launcher$(TWL_LIBSUFFIX).a
LINCLUDES += $(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/ARM9/include
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
MACRO_FLAGS += -DUSE_FONT_WRAM_LOAD
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)

View File

@ -1,318 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: sharedFont.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 <twl.h>
#include <sysmenu.h>
#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

File diff suppressed because it is too large Load Diff

View File

@ -69,7 +69,7 @@ TARGET_TAD = $(BINDIR)/$(TITLEID_LO).$(TWL_BUILD_DIR)$(CODEGEN_ARCH).tad
TARGET_BIN = main.srl
LCFILE_SPEC = ARM9-TS.lsf
#LCFILE_TEMPLATE = ARM9-TS.lcf.template
LCFILE_TEMPLATE = ARM9-TS.lcf.template
ROM_SPEC = main.rsf
LOGO_DIR = Logo
@ -95,7 +95,7 @@ LLIBRARIES += libes$(TWL_LIBSUFFIX).a \
libsea$(TWL_LIBSUFFIX).a \
libreloc_info$(TWL_LIBSUFFIX).a \
libnamut$(TWL_LIBSUFFIX).a \
libsharedfont$(TWL_LIBSUFFIX).a \
libsharedfont_launcher$(TWL_LIBSUFFIX).a \
WDS$(TWL_LIBSUFFIX).a
ADDRESS_DTCM = 0x0e000000
@ -148,6 +148,9 @@ endif
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot
# ローカルでビルドしたlibsharedfont_launcherを使用するので、SDKのlibsharedfontは除外する。
GLIBRARIES := $(filter-out libsharedfont$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
MAKEROM = $(SYSMENU_TOOLSDIR)/bin/makerom.TWL.launcher.exe
LDIRT_CLEAN = $(TARGET_TAD)

View File

@ -58,13 +58,13 @@ BOOL LoadSharedFontInit( void )
THREAD_STACK_SIZE, FONT_LOAD_THREAD_PRIO);
// フォントロード準備
if( !SFONT_Init() ) {
OS_TPrintf( "SFONT_LoadInfoTable failed.\n" );
if( !OS_InitSharedFont() ) {
OS_TPrintf( "OS_InitSharedFont failed.\n" );
return FALSE;
}
size = SFONT_GetInfoTableSize();
size = OS_GetSharedFontTableSize();
if( size < 0 ) {
OS_TPrintf( "SFONT_GetInfoTableSize failed.\n" );
OS_TPrintf( "OS_GetSharedTableSize failed.\n" );
return FALSE;
}
@ -73,8 +73,8 @@ BOOL LoadSharedFontInit( void )
OS_TPrintf( "malloc failed.\n" );
return FALSE;
}
if( !SFONT_LoadInfoTable( pBuffer ) ) {
OS_TPrintf( "SFONT_LoadInfoTable failed.\n" );
if( !OS_LoadSharedFontTable( pBuffer ) ) {
OS_TPrintf( "OS_LoadSharedTable failed.\n" );
return FALSE;
}
@ -89,16 +89,16 @@ void LoadSharedFontThread( void *arg )
{
#pragma unused(arg)
BOOL retval = TRUE;
SFONT_Index i;
OSSharedFontIndex i;
for( i = SHARED_FONT_WW_S; i < SHARED_FONT_MAX; i++ ) {
for( i = OS_SHARED_FONT_WW_S; i < OS_SHARED_FONT_MAX; i++ ) {
int size;
OS_TPrintf( "%s read.\n", SFONT_GetFontName( i ) );
OS_TPrintf( "%s read.\n", OS_GetSharedFontName( i ) );
size = SFONT_GetFontSize( i );
size = OS_GetSharedFontSize( i );
if( size < 0 ) {
OS_TPrintf( "SFONT_GetFontSize failed.\n" );
OS_TPrintf( "OS_GetSharedFontSize failed.\n" );
retval = FALSE;
break;
}
@ -113,8 +113,8 @@ void LoadSharedFontThread( void *arg )
break;
}
if( !SFONT_LoadFont( i, s_pFontBuffer[ i ] ) ) {
OS_TPrintf( "SFONT_LoadFont failed.\n" );
if( !OS_LoadSharedFont( i, s_pFontBuffer[ i ] ) ) {
OS_TPrintf( "OS_LoadSharedFont failed.\n" );
retval = FALSE;
break;
}

View File

@ -19,6 +19,7 @@
#define __LOAD_SHARED_FONT_H__
#include <twl.h>
#include <twl/os/common/sharedFont.h>
#include <sysmenu.h>
#ifdef __cplusplus

View File

@ -162,7 +162,7 @@ void TwlMain( void )
if( !LoadSharedFontInit() ) { // 共有フォントのロード
SYSM_SetFatalError( TRUE );
}
timestamp = SFONT_GetFontTimestamp();
timestamp = OS_GetSharedFontTimestamp();
if( timestamp > 0 ) OS_TPrintf( "SharedFont timestamp : %08x\n", timestamp );
}