・本体設定データの整理。

・HWNormalInfo, HWSecureInfo, TWLSettingsの3種類のファイルに分割。
  ・上記3つのファイルフォーマットを共通のTSFフォーマットにする。
・MachineSettingsで上記フォーマットに追随。
・HWInfoWriterも上記フォーマットに追随。
・Launcher
  ・OS_InitをSYSM_Init内に取り込んで、OS_SetMainArenaHiが有効になるようにする。
  ・SYSM_ReadParametersの処理を整理する。
  ・RTC補正値をセットするよう変更。
・hyena.TWL
  ・RTCリセット検出を行うようにする。
  ・SCFGレジスタ値をWRAMのシステム領域にコピーするよう変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@347 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-12-11 13:00:58 +00:00
parent 7ed96f4434
commit c2ee48afc8
23 changed files with 1065 additions and 818 deletions

View File

@ -23,12 +23,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
export TWL_ARCHGEN = ALL
SUBDIRS = \
$(TWLSDK_ROOT)/add-ins/NitroWireless \
$(TWLSDK_ROOT)/build/libraries/spi/ARM9.TWL \
$(TWLSDK_ROOT)/build/libraries/ese \
$(TWLSDK_ROOT)/build/libraries/nam \
$(TWLSDK_ROOT)/build/libraries/reboot \
$(TWLSDK_ROOT)/build/components/racoon.TWL \
$(TWLSYSTEM_ROOT) \
build

View File

@ -16,25 +16,26 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu/settings/common/TWLSettings.h>
#include <sysmenu/settings/common/TWLHWInfo.h>
// define data----------------------------------------------------------
//#define USE_SHA1_SIGNATURE // 署名内のハッシュにSHA1を使用未定義ならHMAC-SHA1を使用
// function's prototype-------------------------------------------------
static BOOL THWIi_CheckDigest( void *pTgt, u32 length, u8 *pDigest );
static BOOL THWIi_CheckNormalValue( const TWLHWNormalInfo *pSrcInfo );
static BOOL THWIi_CheckSignature( void *pTgt, u32 length, u8 *pSignature );
static BOOL THWIi_CheckSecureValue( const TWLHWSecureInfo *pSecure );
static BOOL THWi_CheckDigest( void *pTgt, u32 length, u8 *pDigest );
static BOOL THWi_CheckNormalInfoValue( const TWLHWNormalInfo *pSrcInfo );
static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature );
static BOOL THWi_CheckSecureInfoValue( const TWLHWSecureInfo *pSecure );
static void DEBUG_PrintDigest( u8 *pDigest );
static void DEBUG_Dump( u8 *pSrc, u32 len );
static void HMACSHA1( u8 *pDigest, u8 *pSrc, u32 len, u8 *pKey, u32 keyLen );
// static variables-----------------------------------------------------
TWLHWNormalInfo s_hwInfoN ATTRIBUTE_ALIGN(32);
TWLHWSecureInfo s_hwInfoS ATTRIBUTE_ALIGN(32);
static BOOL s_isReadNormal;
static BOOL s_isReadSecure;
static BOOL s_isSignCheck;
// global variables-----------------------------------------------------
@ -43,7 +44,7 @@ static BOOL s_isReadSecure;
// ノーマル情報 デフォルト値
static TWLHWNormalInfo s_normalDefault = {
0x5a,
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
{ 0x00 },
};
@ -56,16 +57,17 @@ static const TSFParam s_normalParam = {
sizeof(TWLHWNormalInfo),
TWL_HWINFO_FILE_LENGTH,
s_normalVersionList,
&s_normalDefault,
THWIi_CheckDigest,
(int (*)(void *))THWIi_CheckNormalValue,
(void (*)(void *))THW_ClearNormalInfoDirect,
THWi_CheckDigest,
(int (*)(void *))THWi_CheckNormalInfoValue,
};
// セキュア情報 デフォルト値
static TWLHWSecureInfo s_secureDefault = {
TWL_LANG_BITMAP_AMERICA,
TWL_REGION_AMERICA,
{ TWL_HWINFO_SERIALNO_LEN_AMERICA, "0123456789A" },
{ "0123456789A\0\0\0\0" },
};
@ -78,9 +80,9 @@ static const TSFParam s_secureParam = {
sizeof(TWLHWSecureInfo),
TWL_HWINFO_FILE_LENGTH,
s_secureVersionList,
&s_secureDefault,
THWIi_CheckSignature,
(int (*)(void *))THWIi_CheckSecureValue,
(void (*)(void *))THW_ClearSecureInfoDirect,
THWi_CheckSignature,
(int (*)(void *))THWi_CheckSecureInfoValue,
};
@ -105,7 +107,7 @@ static const u8 s_publicKey[ RSA_KEY_LENGTH ] = {
TSFReadResult THW_ReadNormalInfo( void )
{
s_isReadNormal = TRUE;
return TSF_ReadFile( (char *)TWL_HWINFO_NORMAL_PATH, &s_hwInfoN, &s_normalParam, NULL );
return TSF_ReadFile( (char *)TWL_HWINFO_NORMAL_PATH, GetHWN(), &s_normalParam, NULL );
}
@ -115,7 +117,7 @@ BOOL THW_WriteNormalInfo( void )
if( !s_isReadNormal ) {
return FALSE;
}
return THW_WriteNormalInfoDirect( &s_hwInfoN );
return THW_WriteNormalInfoDirect( GetHWN() );
}
@ -132,13 +134,13 @@ BOOL THW_WriteNormalInfoDirect( const TWLHWNormalInfo *pSrcInfo )
if( !TSF_WriteFile( (char *)TWL_HWINFO_NORMAL_PATH,
&header,
(const void *)pSrcInfo,
DISABLE_SAVE_COUNT ) ) {
NULL ) ) {
return FALSE;
}
// 未リード時、staticバッファへのコピーを行う
if( !s_isReadNormal ) {
s_isReadNormal = TRUE;
MI_CpuCopy8( pSrcInfo, &s_hwInfoN, sizeof(TWLHWNormalInfo) );
MI_CpuCopy8( pSrcInfo, GetHWN(), sizeof(TWLHWNormalInfo) );
}
return TRUE;
}
@ -153,7 +155,7 @@ BOOL THW_RecoveryNormalInfo( TSFReadResult err )
// ダイジェストチェック
static BOOL THWIi_CheckDigest( void *pTgt, u32 length, u8 *pDigest )
static BOOL THWi_CheckDigest( void *pTgt, u32 length, u8 *pDigest )
{
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
@ -163,7 +165,7 @@ static BOOL THWIi_CheckDigest( void *pTgt, u32 length, u8 *pDigest )
// 値チェック
static BOOL THWIi_CheckNormalValue( const TWLHWNormalInfo *pSrcInfo )
static BOOL THWi_CheckNormalInfoValue( const TWLHWNormalInfo *pSrcInfo )
{
#pragma unused(pSrcInfo)
return TRUE;
@ -171,12 +173,33 @@ static BOOL THWIi_CheckNormalValue( const TWLHWNormalInfo *pSrcInfo )
// 新しいデフォルト値のセット
void TWH_SetNormalDefaultValue( const TWLHWNormalInfo *pSrcInfo )
void THW_SetDefaultNormalInfo( const TWLHWNormalInfo *pSrcInfo )
{
MI_CpuCopy8( pSrcInfo, &s_normalDefault, sizeof(TWLHWNormalInfo) );
}
// 値のクリア
void THW_ClearNormalInfoDirect( TWLHWNormalInfo *pDstInfo )
{
MI_CpuCopy8( &s_normalDefault, pDstInfo, sizeof(TWLHWNormalInfo) );
}
// デフォルト値の取得
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void )
{
return &s_normalDefault;
}
// 現在値の取得
const TWLHWNormalInfo *THW_GetNormalInfo( void )
{
return GetHWN();
}
// ---------------------------------------------------------------------
// HWセキュア情報
// ---------------------------------------------------------------------
@ -185,10 +208,19 @@ void TWH_SetNormalDefaultValue( const TWLHWNormalInfo *pSrcInfo )
TSFReadResult THW_ReadSecureInfo( void )
{
s_isReadSecure = TRUE;
return TSF_ReadFile( (char *)TWL_HWINFO_SECURE_PATH, &s_hwInfoS, &s_secureParam, NULL );
s_isSignCheck = TRUE;
return TSF_ReadFile( (char *)TWL_HWINFO_SECURE_PATH, GetHWS(), &s_secureParam, NULL );
}
// 署名ノーチェックリード
TSFReadResult THW_ReadSecureInfo_NoCheck( void )
{
s_isReadSecure = TRUE;
s_isSignCheck = FALSE;
return TSF_ReadFile( (char *)TWL_HWINFO_SECURE_PATH, GetHWS(), &s_secureParam, NULL );
}
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
// ライト
BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER )
@ -196,7 +228,7 @@ BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER )
if( !s_isReadSecure ) {
return FALSE;
}
return THW_WriteSecureInfoDirect( &s_hwInfoS, pPrivKeyDER );
return THW_WriteSecureInfoDirect( GetHWS(), pPrivKeyDER );
}
@ -207,33 +239,43 @@ BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPriv
TSFHeader header;
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
u64 id = SCFG_ReadFuseData();
OSTick start = OS_GetTick();
MI_CpuClear8( &header, sizeof(TSFHeader) );
header.version = TWL_HWINFO_SECURE_VERSION;
header.bodyLength = sizeof( TWLHWSecureInfo );
#ifdef HW_SIGNATURE_ENABLE_
// 秘密鍵が指定されている場合のみ、署名作成
if( pPrivKeyDER ) {
#ifdef USE_SHA1_SIGNATURE
SVC_CalcSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo) );
SVC_CalcSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo) );
#else
// SVC_CalcHMACSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo), &id, sizeof(u64) );
HMACSHA1( digest, (unsigned char *)pSrcInfo, sizeof(TWLHWSecureInfo), (u8 *)&id, sizeof(u64) );
SVC_CalcHMACSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo), &id, sizeof(u64) );
#endif
if( !ACSign_Encrypto( header.digest.rsa,
pPrivKeyDER,
digest,
SVC_SHA1_DIGEST_SIZE ) ) {
return FALSE;
if( !ACSign_Encrypto( header.digest.rsa,
pPrivKeyDER,
digest,
SVC_SHA1_DIGEST_SIZE ) ) {
return FALSE;
}
}
#endif // HW_SIGNATURE_ENABLE_
// ライト
if( !TSF_WriteFile( (char *)TWL_HWINFO_SECURE_PATH,
&header,
(const void *)pSrcInfo,
DISABLE_SAVE_COUNT ) ) {
NULL ) ) {
return FALSE;
}
OS_TPrintf( "RSA sign encrypt time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
// 未リード時、staticバッファへのコピーを行う
if( !s_isReadSecure ) {
s_isReadSecure = TRUE;
MI_CpuCopy8( pSrcInfo, &s_hwInfoS, sizeof(TWLHWSecureInfo) );
MI_CpuCopy8( pSrcInfo, GetHWS(), sizeof(TWLHWSecureInfo) );
}
return TRUE;
}
@ -245,37 +287,43 @@ BOOL THW_RecoverySecureInfo( TSFReadResult err )
return TSF_RecoveryFile( err, (char *)TWL_HWINFO_SECURE_PATH, TWL_HWINFO_FILE_LENGTH );
}
#endif // HW_SECURE_INFO_WRITE_ENABLE_
// 署名チェック
static BOOL THWIi_CheckSignature( void *pTgt, u32 length, u8 *pSignature )
static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature )
{
static u32 heap[ 4096 / sizeof(u32) ];
SVCSignHeapContext acmemoryPool;
u8 digest_sign[ SVC_SHA1_DIGEST_SIZE ];
u8 digest_calc[ SVC_SHA1_DIGEST_SIZE ];
u64 id = SCFG_ReadFuseData();
OSTick start = OS_GetTick();
#ifdef USE_SHA1_SIGNATURE
SVC_CalcSHA1( digest_calc, pTgt, length );
#else
// SVC_CalcHMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) );
HMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) );
SVC_CalcHMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) );
#endif
SVC_InitSignHeap( &acmemoryPool, heap, 4096 );
SVC_DecryptSign( &acmemoryPool, digest_sign, pSignature, s_publicKey );
return SVC_CompareSHA1( digest_sign, digest_calc );
OS_TPrintf( "RSA sign decrypt time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
// ダイジェストチェック有効かどうかで返り値を変える。
{
BOOL retval = SVC_CompareSHA1( digest_sign, digest_calc );
return ( s_isSignCheck ) ? retval : TRUE;
}
}
// HW Secure情報 値チェック
static BOOL THWIi_CheckSecureValue( const TWLHWSecureInfo *pSrcInfo )
static BOOL THWi_CheckSecureInfoValue( const TWLHWSecureInfo *pSrcInfo )
{
int serialNoLen = STD_StrLen( (const char *)pSrcInfo->serialNo );
if(
( pSrcInfo->region >= TWL_REGION_MAX ) ||
( ( pSrcInfo->serialNo.length != TWL_HWINFO_SERIALNO_LEN_AMERICA ) &&
( pSrcInfo->serialNo.length != TWL_HWINFO_SERIALNO_LEN_OTHERS ) )
( serialNoLen < TWL_HWINFO_SERIALNO_LEN_AMERICA ) ||
( serialNoLen > TWL_HWINFO_SERIALNO_LEN_OTHERS )
) {
return FALSE;
}
@ -285,36 +333,36 @@ static BOOL THWIi_CheckSecureValue( const TWLHWSecureInfo *pSrcInfo )
// 新しいデフォルト値のセット
void TWH_SetSecureDefaultValue( const TWLHWSecureInfo *pSrcInfo )
void THW_SetDefaultSecureInfo( const TWLHWSecureInfo *pSrcInfo )
{
MI_CpuCopy8( pSrcInfo, &s_secureDefault, sizeof(TWLHWSecureInfo) );
}
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void );
const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void );
const TWLHWNormalInfo *THW_GetNormalInfo( void );
const TWLHWSecureInfo *THW_GetSecureInfo( void );
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void )
// 値のクリア
void THW_ClearSecureInfoDirect( TWLHWSecureInfo *pDstInfo )
{
return &s_normalDefault;
MI_CpuCopy8( &s_secureDefault, pDstInfo, sizeof(TWLHWSecureInfo) );
}
// デフォルト値の取得
const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void )
{
return &s_secureDefault;
}
const TWLHWNormalInfo *THW_GetNormalInfo( void )
{
return &s_hwInfoN;
}
// 現在値の取得
const TWLHWSecureInfo *THW_GetSecureInfo( void )
{
return &s_hwInfoS;
return GetHWS();
}
// ---------------------------------------------------------------------
// デバッグ
// ---------------------------------------------------------------------
static void DEBUG_PrintDigest( u8 *pDigest )
{
int i;
@ -336,13 +384,3 @@ static void DEBUG_Dump( u8 *pSrc, u32 len )
OS_TPrintf( "\n" );
}
// HMAC SHA-1算出現SDKではSVC_CalcHMACSHA1にバグがあるので、これを使用
static void HMACSHA1( u8 *pDigest, u8 *pSrc, u32 len, u8 *pKey, u32 keyLen )
{
static SVCHMACSHA1Context s_hmac;
SVC_HMACSHA1Init( &s_hmac, pKey, keyLen );
SVC_HMACSHA1Update( &s_hmac, pSrc, len );
SVC_HMACSHA1GetHash( &s_hmac, pDigest );
}

View File

@ -18,31 +18,27 @@
#include <twl.h>
#include <sysmenu/settings/common/NTRSettings.h>
#include <sysmenu/settings/common/TWLSettings.h>
#include <sysmenu/settings/common/TWLHWInfo.h>
// define data----------------------------------------------------------
#define DEFAULT_TSD_FILE_LENGTH ( 16 * 1024 )
#define TSD_FILE_MIRROR_NUM 2
#define SAVE_COUNT_MAX 0x0080 // TWLSettingsData.saveCountの最大値
#define SAVE_COUNT_MASK 0x007f // TWLSettingsData.saveCountの値の範囲をマスクする。(0x00-0x7f
#define TSD_NOT_CORRECT 0x00ff // TSD設定データが読み出されていない or 有効なものがないことを示す。
// function's prototype-------------------------------------------------
static BOOL TSDi_CheckVersionCompatible( u8 tgtVersion );
static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore );
static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag );
static BOOL TSDi_CheckSettingsValue( TWLSettingsData *pTSD );
static void TSDi_ClearSettings( TWLSettingsData *pTSD );
static BOOL TSDi_RecoveryFile( TSFReadResult err, char *pFilePath );
static BOOL TSDi_CheckDigest( void *pTgt, u32 length, u8 *pDigest );
static BOOL TSDi_CheckValue( const TWLSettingsData *pSecure );
static void TSDi_ClearSettingsDirect( TWLSettingsData *pTSD );
static BOOL TSDi_CheckDate( u8 month, u8 day );
static BOOL TSDi_CheckTime( u8 hour, u8 minute );
static BOOL TSDi_CheckString( const u16 *pStr, u8 maxLength );
// static variables-----------------------------------------------------
static TSDStore s_TSDStore ATTRIBUTE_ALIGN(32);
TWLSettingsData s_settings ATTRIBUTE_ALIGN(32);
static int s_indexTSD = TSD_NOT_CORRECT;
static u8 s_saveCount;
#ifndef SDK_FINALROM
static TSDStore (*s_pTSDStoreArray)[2];
#endif
// global variables-----------------------------------------------------
TWLSettingsData *g_pTSD = &s_TSDStore.tsd;
// const data-----------------------------------------------------------
static const char *s_TSDPath[ TSD_FILE_MIRROR_NUM ] = {
@ -51,284 +47,270 @@ static const char *s_TSDPath[ TSD_FILE_MIRROR_NUM ] = {
};
// function's description-----------------------------------------------
// バージョン互換リスト
static const u8 s_settingsVersionList[] = { 1, TSF_VERSION_TERMINATOR };
// TWL設定データのライト
BOOL TSD_WriteSettings( void )
// TSFリードパラメータ
static const TSFParam s_settingsParam = {
sizeof(TWLSettingsData),
TWL_SETTINGS_FILE_LENGTH,
s_settingsVersionList,
(void (*)(void *))TSDi_ClearSettingsDirect,
TSDi_CheckDigest,
(int (*)(void *))TSDi_CheckValue,
};
// 各リージョンでの国コード範囲リスト
static const u32 s_regionCountryList[ TWL_REGION_MAX ] = {
TWL_COUNTRY_MAPPING_JAPAN,
TWL_COUNTRY_MAPPING_AMERICA,
TWL_COUNTRY_MAPPING_EUROPE,
TWL_COUNTRY_MAPPING_AUSTRALIA,
TWL_COUNTRY_MAPPING_CHINA,
TWL_COUNTRY_MAPPING_KOREA,
};
// ---------------------------------------------------------------------
// TWL本体設定データ
// ---------------------------------------------------------------------
// ファイルから内部変数にリード
BOOL TSD_ReadSettings( void )
{
return TSDi_WriteSettingsDirect( &s_TSDStore );
int i;
u8 saveCount[ TSD_FILE_MIRROR_NUM ];
TWLSettingsData settings[ TSD_FILE_MIRROR_NUM ];
BOOL retval = FALSE;
// リード
s_saveCount = 0;
s_indexTSD = TSD_NOT_CORRECT;
for( i = 0; i < TSD_FILE_MIRROR_NUM; i++ ) {
TSFReadResult rdResult = TSF_ReadFile( (char *)s_TSDPath[ i ],
&settings[ i ],
&s_settingsParam,
&saveCount[ i ] );
OS_TPrintf( "TSD[%d] saveCount = %d : ", i, saveCount[ i ] );
if( rdResult == TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "enable.\n" );
// どちらのTSDを使用するか判定
if( s_indexTSD == TSD_NOT_CORRECT ) { // 最初に有効なTSDがあったら、まずはそれを使用することに。
s_indexTSD = i;
s_saveCount = saveCount[ i ];
}else { // もうつも有効なら、saveCount値を比較して選択。
if( ( ( saveCount[ 0 ] + 1 ) & SAVE_COUNT_MASK ) == saveCount[ 1 ] ) {
s_indexTSD = 1;
s_saveCount = saveCount[ 1 ];
}
}
}else {
OS_TPrintf( "disable.\n" );
// リードに失敗した場合はファイルリカバリ
(void)TSDi_RecoveryFile( rdResult, (char *)s_TSDPath[ i ] );
(void)TSD_WriteSettingsDirect( &settings[ i ] );
}
}
// 有効なTSDを静的バッファにコピー
if( s_indexTSD != TSD_NOT_CORRECT ) {
MI_CpuCopyFast( &settings[ s_indexTSD ], GetTSD(), sizeof(TWLSettingsData) );
retval = TRUE;
}else {
// 有効なTSDがないなら静的バッファを初期化
TSDi_ClearSettingsDirect( GetTSD() );
s_indexTSD = 1;
}
OS_TPrintf( "TSD[%d] saveCount = %d : Use.\n", s_indexTSD, s_saveCount );
return retval;
}
// TWL設定データのダイレクトライト
static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
// 内部変数の値をファイルにライト
BOOL TSD_WriteSettings( void )
{
FSFile file;
if( !TSD_IsReadSettings() ) {
OS_TPrintf( "ERROR: Need call TSD_ReadSetting.\n" );
if( s_indexTSD == TSD_NOT_CORRECT ) {
return FALSE;
}
return TSD_WriteSettingsDirect( GetTSD() );
}
// 指定データの値をファイルに直接ライト
BOOL TSD_WriteSettingsDirect( const TWLSettingsData *pSrcInfo )
{
// ヘッダの作成
TSFHeader header;
MI_CpuClear8( &header, sizeof(TSFHeader) );
header.version = TWL_SETTINGS_DATA_VERSION;
header.bodyLength = sizeof(TWLSettingsData);
SVC_CalcSHA1( header.digest.sha1, pSrcInfo, sizeof(TWLSettingsData) );
// まだ一度もリードされていないなら、staticバッファへのコピーを行う
if( s_indexTSD == TSD_NOT_CORRECT ) {
s_saveCount = 0;
s_indexTSD = 1;
MI_CpuCopy8( pSrcInfo, GetTSD(), sizeof(TWLSettingsData) );
}
// ファイルにライト
s_indexTSD ^= 0x01;
pTSDStore->header.saveCount = (u8)( ( pTSDStore->header.saveCount + 1 ) & SAVE_COUNT_MASK );
pTSDStore->header.version = TWL_SETTINGS_DATA_VERSION;
pTSDStore->header.dataLength = sizeof(TWLSettingsData);
if( !TSF_WriteFile( (char *)s_TSDPath[ s_indexTSD ],
&header,
(const void *)pSrcInfo,
&s_saveCount ) ) {
return FALSE;
}
return TRUE;
}
// ファイルのリカバリ
static BOOL TSDi_RecoveryFile( TSFReadResult err, char *pFilePath )
{
return TSF_RecoveryFile( err, pFilePath, TWL_HWINFO_FILE_LENGTH );
}
// ダイジェストチェック
static BOOL TSDi_CheckDigest( void *pTgt, u32 length, u8 *pDigest )
{
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
// ダイジェスト算出(自分のバージョンのデータサイズで算出)
SVC_CalcSHA1( pTSDStore->digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
FS_InitFile( &file );
OS_TPrintf( "Write TSD > %s : 0x%02x\n", s_TSDPath[ s_indexTSD ], pTSDStore->header.saveCount );
// ファイルオープン
if( !FS_OpenFileEx( &file, s_TSDPath[ s_indexTSD ], FS_FILEMODE_R | FS_FILEMODE_W ) ) { // R|Wモードで開くと、既存ファイルを残したまま更新。
OS_TPrintf( " TSD[%d] : file open error.\n" );
SVC_CalcSHA1( digest, pTgt, length );
return SVC_CompareSHA1( digest, pDigest );
}
// TWL設定データのクリア
void TSD_ClearSettings( void )
{
TSDi_ClearSettingsDirect( GetTSD() );
}
// TWL設定データの直接クリア
static void TSDi_ClearSettingsDirect( TWLSettingsData *pTSD )
{
int i;
MI_CpuClearFast( pTSD, sizeof(TWLSettingsData) );
// 初期値が"0"以外のもの
pTSD->backLightBrightness = TWL_BACKLIGHT_LEVEL_MAX;
pTSD->owner.birthday.month = 1;
pTSD->owner.birthday.day = 1;
// 言語コードはHW情報の言語ビットマップから算出
for( i = 0; i < TWL_LANG_CODE_MAX; i++ ) {
if( THW_GetValidLanguageBitmap() & ( 0x0001 << i ) ) {
pTSD->language = (TWLLangCode)i;
break;
}
}
}
// ---------------------------------------------------------------------
// 値チェック
// ---------------------------------------------------------------------
// 値チェック
static BOOL TSDi_CheckValue( const TWLSettingsData *pSrc )
{
// 国コード
if( TSD_IsSetCountry() ) {
u32 countryStart = (u32)( s_regionCountryList[ THW_GetRegion() ] >> 16 );
u32 countryEnd = (u32)( s_regionCountryList[ THW_GetRegion() ] & 0x0000ffff );
if( ( pSrc->country < countryStart ) ||
( pSrc->country > countryEnd ) ) {
return FALSE;
}
}else if( pSrc->country != TWL_COUNTRY_UNDEFINED ) {
return FALSE;
}
// TSDStoreのライト
if( FS_WriteFile( &file, pTSDStore, sizeof(TSDStore) ) < sizeof(TSDStore) ) {
OS_TPrintf( " TSD[%d] : file read error.\n" );
// 言語コード
if( TSD_IsSetLanguage() &&
( THW_GetValidLanguageBitmap() & ( 0x0001 << pSrc->language ) )
) {
return FALSE;
}
FS_CloseFile( &file );
// バックライト輝度
if( pSrc->backLightBrightness > TWL_BACKLIGHT_LEVEL_MAX ) {
return FALSE;
}
// u8 rtcLastSetYear; // RTCの前回設定年チェックの必要なし
// s64 rtcOffset; // RTC設定時のオフセット値チェックの必要なし
// オーナー情報
if( !TSDi_CheckDate( pSrc->owner.birthday.month, pSrc->owner.birthday.day ) ||
!TSDi_CheckString( pSrc->owner.nickname, TWL_NICKNAME_LENGTH ) ||
!TSDi_CheckString( pSrc->owner.comment, TWL_COMMENT_LENGTH ) ) {
return FALSE;
}
// アラーム
if( !TSDi_CheckTime( pSrc->alarm.hour, pSrc->alarm.minute ) ) {
return FALSE;
}
// TWLTPCalibData tp; // TP補正データチェックの必要なし。確認済み。
// パレンタルコントロール
if( ( pSrc->parental.ogn >= TWL_RATING_OGN_MAX ) ||
( pSrc->parental.ratingAge > TWL_PARENTAL_CONTROL_RATING_AGE_MAX ) ||
// ( pSrc->parental.secretQuestion > TWL_PARENTAL_CONTROL_SECRET_QUESTION_MAX ) ||
// ( pSrc->parental.secretAnswerLength > TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MAX ) ||
( STD_StrLen( pSrc->parental.password ) > TWL_PARENTAL_CONTROL_PASSWORD_LENGTH ) ||
!TSDi_CheckString( pSrc->parental.secretAnswer, TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MAX ) ) {
return FALSE;
}
// インストール可能なNANDアプリ個数
if( pSrc->freeSoftBoxCount > TWL_FREE_SOFT_BOX_COUNT_MAX ) {
return FALSE;
}
return TRUE;
}
// TWL設定データ読み出し済み
BOOL TSD_IsReadSettings( void )
// 日付が正しいかチェック
static BOOL TSDi_CheckDate( u8 month, u8 day )
{
return ( s_indexTSD != TSD_NOT_CORRECT );
}
// TWL設定データの読み出し
BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
{
int i;
FSFile file;
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
TSDStore *pTSDStore = (TSDStore *)pTempBuffer;
u8 existErrFlag = 0;
u8 lengthErrFlag = 0;
u8 dataErrFlag = 0;
u8 enableTSDFlag = 0;
BOOL retval = FALSE;
static const u8 dayNumList[ 12 ] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// バージョン違いの場合を考慮して、先に全バッファをクリアしておく
MI_CpuClearFast( pTempBuffer, sizeof(TWLSettingsData) * 2 );
#ifndef SDK_FINALROM
s_pTSDStoreArray = pTempBuffer;
OS_TPrintf( "TSDStoreBuff : %08x %08x\n", &(*s_pTSDStoreArray)[ 0 ], &(*s_pTSDStoreArray)[ 1 ] );
#endif
FS_InitFile( &file );
s_indexTSD = 0;
enableTSDFlag = 0;
// TSDファイルチェック
for( i = 0; i < TSD_FILE_MIRROR_NUM; i++ ) {
// ファイルオープン
if( !FS_OpenFileEx( &file, s_TSDPath[ i ], FS_FILEMODE_R ) ) {
OS_TPrintf( "TSD[%d] : file open error.\n", i );
existErrFlag |= 0x01 << i;
continue;
}
// ファイル長チェック
if( FS_GetFileLength( &file ) != DEFAULT_TSD_FILE_LENGTH ) {
OS_TPrintf( "TSD[%d] : file length error. : length = %d\n", i, FS_GetFileLength( &file ) );
lengthErrFlag |= 0x01 << i;
goto NEXT;
}
// TSDStoreのリード
if( FS_ReadFile( &file, &pTSDStore[ i ], sizeof(TSDStore) ) < sizeof(TSDStore) ) {
OS_TPrintf( "TSD[%d] : file read error.\n", i );
dataErrFlag |= 0x01 << i;
goto NEXT;
}
// ヘッダチェック
if( !TSDi_CheckVersionCompatible( pTSDStore[ i ].header.version ) ||
( pTSDStore[ i ].header.dataLength > sizeof(TSDStore) ) ) {
OS_TPrintf( "TSD[%d] : file header error.\n", i );
dataErrFlag |= 0x01 << i;
goto NEXT;
}
// データのダイジェストチェックSHA1とCRC16の時間を計測したが、数十us差しかなかったので、SHA1のままでいく。
SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, pTSDStore[ i ].header.dataLength );
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].digest ) ) {
OS_TPrintf( "TSD[%d] : file digest error.\n", i );
dataErrFlag |= 0x01 << i;
goto NEXT;
}
// データの値チェック
if( !TSDi_CheckSettingsValue( &pTSDStore[ i ].tsd ) ) {
OS_TPrintf( "TSD[%d] : file format error.\n", i );
dataErrFlag |= 0x01 << i;
goto NEXT;
}
enableTSDFlag |= 0x01 << i;
s_indexTSD = i;
NEXT:
// ファイルクローズ
FS_CloseFile( &file );
if( enableTSDFlag & ( 0x01 << i ) ) {
OS_TPrintf("TSD[%d] valid : saveCount = %d\n", i, pTSDStore[ i ].header.saveCount );
}else {
OS_TPrintf("TSD[%d] invalid\n", i );
}
}
// 静的バッファに有効なTSDをコピー
if( enableTSDFlag ) {
// どちらのTSDを使用するか判定
if( enableTSDFlag == 0x03 ) {
s_indexTSD = ( ( ( pTSDStore[ 0 ].header.saveCount + 1 ) & SAVE_COUNT_MASK ) ==
pTSDStore[ 1 ].header.saveCount ) ? 1 : 0;
}
MI_CpuCopyFast( &pTSDStore[ s_indexTSD ], &s_TSDStore, sizeof(TSDStore) );
retval = TRUE;
}else {
// TSDをクリア
OS_TPrintf( "TSD clear.\n" );
TSDi_ClearSettings( &s_TSDStore.tsd );
retval = FALSE;
}
// 正常に読み込めなかったファイルがあるなら、リカバリ
if( enableTSDFlag != 0x03 ) {
TSDStore *pOrg = ( enableTSDFlag ) ? &pTSDStore[ s_indexTSD ] : NULL;
enableTSDFlag |= TSDi_RecoveryTSDFile( pOrg, existErrFlag, lengthErrFlag, dataErrFlag );
}
OS_TPrintf( "Use TSD[%d] : saveCount = %d\n",
s_indexTSD, pTSDStore[ s_indexTSD ].header.saveCount );
return retval;
}
// バージョン間の互換チェック
static BOOL TSDi_CheckVersionCompatible( u8 tgtVersion )
{
// 各バージョンにおける過去バージョン互換リスト
static const u8 s_verCompatible_v0[] = { 0xff };
static const u8 s_verCompatible_v1[] = { 0, 0xff };
// 過去バージョン互換リストまとめ
static const u8 *s_verCompatibleList[ TWL_SETTINGS_DATA_VERSION + 1 ] = {
s_verCompatible_v0,
s_verCompatible_v1,
};
if( TWL_SETTINGS_DATA_VERSION < tgtVersion ) {
if( ( month < 1 ) ||
( month > 12 ) ||
( day < 1 ) ||
( day > dayNumList[ month - 1 ] ) ) {
return FALSE;
}else if( TWL_SETTINGS_DATA_VERSION == tgtVersion ) {
return TRUE;
}else {
// 今のバージョンがターゲットのバージョンと互換性があるかどうかをチェック
const u8 *pList = s_verCompatibleList[ TWL_SETTINGS_DATA_VERSION ];
while( *pList != 0xff ) {
if( *pList++ == tgtVersion ) {
return TRUE;
}
}
return TRUE;
}
// 時刻が正しいかチェック
static BOOL TSDi_CheckTime( u8 hour, u8 minute )
{
if( ( hour > 23 ) ||
( minute > 59 ) ) {
return FALSE;
}
return TRUE;
}
// 文字列長が正しいかチェック
static BOOL TSDi_CheckString( const u16 *pStr, u8 maxLength )
{
while( maxLength-- ) {
if( *pStr++ == 0 ) {
return TRUE;
}
}
return FALSE;
}
// TWL設定データファイルのリカバリ
static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag )
{
int i;
FSFile file;
FS_InitFile( &file );
OS_TPrintf( "existErr = %02x lengthErr = %02x dataErr = %02x\n", existErrFlag, lengthErrFlag, dataErrFlag );
// 大本がエラーのファイルは後段階の部分もエラーとする
lengthErrFlag |= existErrFlag;
dataErrFlag |= lengthErrFlag;
// ファイルリカバリ
for( i = 0; i < TSD_FILE_MIRROR_NUM; i++ ) {
// ファイル生成
if( existErrFlag & ( 0x01 << i ) ) {
if( !FS_CreateFile( s_TSDPath[ i ], FS_PERMIT_R | FS_PERMIT_W ) ) {
OS_TPrintf( " TSD[%d] : create file error.\n", i );
continue;
}
existErrFlag ^= 0x01 << i;
}
// ファイルオープン
if( !FS_OpenFileEx( &file, s_TSDPath[ i ], FS_FILEMODE_R | FS_FILEMODE_W ) ) {
OS_TPrintf( " TSD[%d] : file open error.\n", i );
continue;
}
// ファイル長変更
if( lengthErrFlag & ( 0x01 << i ) ) {
if( FS_SetFileLength( &file, DEFAULT_TSD_FILE_LENGTH ) != FS_RESULT_SUCCESS ) {
OS_TPrintf( " TSD[%d] : set file length error.\n", i );
goto NEXT;
}
lengthErrFlag ^= 0x01 << i;
}
// データ復旧
if( dataErrFlag & ( 0x01 << i ) ) {
if( pTSDStoreOrg ) {
if( FS_WriteFile( &file, pTSDStoreOrg, sizeof(TSDStore) ) != sizeof(TSDStore) ) {
OS_TPrintf( " TSD[%d] : write file length error.\n", i );
goto NEXT;
}
}else {
// デフォルト値を書き込み。
TSDStore tempTSDS;
TSDi_ClearSettings( &tempTSDS.tsd );
s_indexTSD = i ^ 0x01;
TSDi_WriteSettingsDirect( &tempTSDS );
}
dataErrFlag ^= 0x01 << i;
}
NEXT:
// ファイルクローズ
FS_CloseFile( &file );
}
return ( existErrFlag | lengthErrFlag | dataErrFlag ) ^ 0x03;
}
// TWL設定データのチェック
static BOOL TSDi_CheckSettingsValue( TWLSettingsData *pTSD )
{
#pragma unused( pTSD )
return TRUE;
}
// TWL設定データのクリア
static void TSDi_ClearSettings( TWLSettingsData *pTSD )
{
MI_CpuClearFast( pTSD, sizeof(TWLSettingsData) );
// 初期値が0以外のもの
pTSD->backLightBrightness = TWL_BACKLIGHT_LEVEL_MAX;
pTSD->owner.birthday.month = 1;
pTSD->owner.birthday.day = 1;
pTSD->language = TWL_LANG_ENGLISH;
pTSD->region = TWL_DEFAULT_REGION; // リージョンは本体設定データからなくなる予定
}

View File

@ -27,7 +27,7 @@
// function's description-----------------------------------------------
// TSFファイルの読み出し
TSFReadResult TSF_ReadFile( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pDstSaveCount )
TSFReadResult TSF_ReadFile( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pSaveCount )
{
TSFHeader header;
TSFReadResult retval;
@ -38,9 +38,9 @@ TSFReadResult TSF_ReadFile( char *pPath, void *pDstBody, const TSFParam *pParam,
MI_CpuClear8( &header, sizeof(TSFHeader) );
// ボディ用バッファのクリア
if( pParam->pDefaultValue ) {
// デフォルト指定ありの時は、バージョン下位互換の場合を考慮して、デフォルト値をコピーしておく
MI_CpuCopy8( pParam->pDefaultValue, pDstBody, pParam->dataLength );
if( pParam->pClearFunc ) {
// クリア用関数ありの時は、バージョン下位互換の場合を考慮して、デフォルト値をセットしておく
pParam->pClearFunc( pDstBody );
}else {
// そうでない場合は、リードバッファをクリア
MI_CpuClear8( pDstBody, pParam->dataLength );
@ -111,8 +111,8 @@ TSFReadResult TSF_ReadFile( char *pPath, void *pDstBody, const TSFParam *pParam,
}
}
if( pDstSaveCount ) {
*pDstSaveCount = header.saveCount;
if( pSaveCount ) {
*pSaveCount = header.saveCount;
}
retval = TSF_READ_RESULT_SUCCEEDED;
END:
@ -122,9 +122,9 @@ END2:
if( retval != TSF_READ_RESULT_SUCCEEDED ) {
// ボディ用バッファのクリア
if( pParam->pDefaultValue ) {
// バージョン下位互換の場合を考慮して、デフォルト値をコピーしておく
MI_CpuCopy8( pParam->pDefaultValue, pDstBody, pParam->dataLength );
if( pParam->pClearFunc ) {
// クリア用関数ありの時は、バージョン下位互換の場合を考慮して、デフォルト値をセットしておく
pParam->pClearFunc( pDstBody );
}else {
// そうでない場合は、リードバッファをクリア
MI_CpuClear8( pDstBody, pParam->dataLength );
@ -136,14 +136,15 @@ END2:
// TWLファイルのライト
BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 saveCount )
BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 *pSaveCount )
{
BOOL retval = FALSE;
FSFile file;
FS_InitFile( &file );
if( saveCount != DISABLE_SAVE_COUNT ) {
pHeader->saveCount = (u8)( ( saveCount + 1 ) & SAVE_COUNT_MASK );
if( pSaveCount ) {
*pSaveCount = (u8)( ( *pSaveCount + 1 ) & SAVE_COUNT_MASK );
pHeader->saveCount = *pSaveCount;
}else {
pHeader->saveCount = 0;
}
@ -183,6 +184,7 @@ BOOL TSF_RecoveryFile( TSFReadResult err, char *pPath, u32 fileLength )
u32 buffer[ READ_SIZE / sizeof(u32) ];
u32 length;
BOOL retval = FALSE;
BOOL isWrite = FALSE;
FSFile file;
FS_InitFile( &file );
@ -213,33 +215,36 @@ BOOL TSF_RecoveryFile( TSFReadResult err, char *pPath, u32 fileLength )
}
}
// ファイル内データ初期化0xff埋め
// データベリファイ
MI_CpuFillFast( buffer, INITIAL_DATA_PATTERN, sizeof(buffer) );
length = fileLength;
while( length ) {
u32 wrSize = ( length > READ_SIZE ) ? READ_SIZE : length;
if( FS_WriteFile( &file, buffer, (s32)wrSize ) < wrSize ) {
OS_TPrintf( "Recovery : write error. %s\n", pPath );
goto END;
}
length -= wrSize;
}
// ベリファイ
FS_SeekFile( &file, 0, FS_SEEK_SET );
length = fileLength;
while( length ) {
int i;
u32 rdSize = ( length > READ_SIZE ) ? READ_SIZE : length;
FS_ReadFile( &file, buffer, (s32)rdSize );
for( i = 0; i < rdSize / sizeof(u32); i++ ) {
if( buffer[ i ] != INITIAL_DATA_PATTERN ) {
OS_TPrintf( "Recovery : verify error. %s\n", pPath );
goto END;
isWrite = TRUE;
goto NEXT;
}
}
length -= rdSize;
}
NEXT:
// ベリファイエラーの場合は、ファイル内データ初期化0xff埋め
if( isWrite ) {
FS_SeekFile( &file, 0, FS_SEEK_SET );
length = fileLength;
while( length ) {
u32 wrSize = ( length > READ_SIZE ) ? READ_SIZE : length;
if( FS_WriteFile( &file, buffer, (s32)wrSize ) < wrSize ) {
OS_TPrintf( "Recovery : write error. %s\n", pPath );
goto END;
}
length -= wrSize;
}
}
retval = TRUE;
END:

View File

@ -21,46 +21,48 @@
// define data----------------------------------------------------------
// function's prototype-------------------------------------------------
static BOOL SYSMi_VerifyNTRSettings( void );
static BOOL VerifyData( void *pTgt1, void *pTgt2, u32 size );
static void SYSMi_ConvertTWL2NTRSettings( void );
BOOL SYSMi_VerifyNTRSettings( void );
static BOOL VerifyData( const void *pTgt1, const void *pTgt2, u32 size );
void SYSMi_ConvertTWL2NTRSettings( void );
static u8 MY_StrLen( const u16 *pStr );
// global variables-----------------------------------------------------
// static variables-----------------------------------------------------
// const data-----------------------------------------------------------
static const u16 s_validLangBitmapList[] = {
NTR_LANG_BITMAP_WW,
NTR_LANG_BITMAP_CHINA,
NTR_LANG_BITMAP_KOREA,
#if 0
// TWL言語->NTR 言語への対応マップ
const u8 s_langCodeMapFromTWLtoNTR[ TWL_LANG_CODE_MAX ] = {
NTR_LANG_JAPANESE // TWL_LANG_JAPANESE
NTR_LANG_ENGLISH // TWL_LANG_ENGLISH
NTR_LANG_FRENCH // TWL_LANG_FRENCH
NTR_LANG_GERMAN // TWL_LANG_GERMAN
NTR_LANG_ITALIAN // TWL_LANG_ITALIAN
NTR_LANG_SPANISH // TWL_LANG_SPANISH
NTR_LANG_CHINESE // TWL_LANG_SIMP_CHINESE
NTR_LANG_KOREAN // TWL_LANG_KOREAN
// NTR_LANG_ENGLISH // TWL_LANG_DUTCH
// NTR_LANG_CHINESE // TWL_LANG_TRAD_CHINESE
};
#endif
// function's description-----------------------------------------------
// TWL設定データファイルのリード
BOOL SYSM_ReadTWLSettingsFile( void )
{
BOOL retval = FALSE;;
{
TSDStore (*pTempBuffer)[2] = SYSM_Alloc( TSD_TEMP_BUFFER_SIZE );
if( pTempBuffer == NULL ) {
OS_TPrintf( "%s : malloc failed.\n", __FUNCTION__ );
goto RETURN;
}
MI_CpuFill32( pTempBuffer, 0xffffffff, TSD_TEMP_BUFFER_SIZE );
retval = TSD_ReadSettings( pTempBuffer );
SYSM_Free( pTempBuffer );
}
BOOL retval;
// TWL設定データのリード
retval = TSD_ReadSettings();
// NTR設定データのリード
if( !NSD_IsReadSettings() ) {
NSDStoreEx (*pTempBuffer)[2] = SYSM_Alloc( NSD_TEMP_BUFFER_SIZE );
if( pTempBuffer == NULL ) {
OS_TPrintf( "%s : malloc failed.\n", __FUNCTION__ );
goto RETURN;
}
MI_CpuFill32( pTempBuffer, 0xffffffff, NSD_TEMP_BUFFER_SIZE );
retval = NSD_ReadSettings( TSD_GetRegion(), pTempBuffer );
(void)NSD_ReadSettings( THW_GetRegion(), pTempBuffer );
SYSM_Free( pTempBuffer );
#ifndef SDK_FINALROM
(void)SYSMi_VerifyNTRSettings();
@ -76,11 +78,13 @@ RETURN:
BOOL SYSM_WriteTWLSettingsFile( void )
{
BOOL retval;
// TWL設定データのライト
retval = TSD_WriteSettings();
if( retval ) { // ライト成功なら、TSDをNSDに変換して、NVRAMにも書き込み
// ライト成功なら、NVRAMのNTR設定データに値を反映
if( retval ) {
SYSM_SetValidTSD( TRUE );
SYSMi_ConvertTWL2NTRSettings();
NSD_WriteSettings( TSD_GetRegion() );
NSD_WriteSettings( THW_GetRegion() );
#ifndef SDK_FINALROM
(void)SYSM_VerifyAndRecoveryNTRSettings(); // ※デバッグ用 ベリファイして、NGならリカバリ
#endif
@ -99,19 +103,19 @@ void SYSM_VerifyAndRecoveryNTRSettings( void )
if( pTempBuffer == NULL ) {
OS_Panic( "%s : malloc error.\n", __FUNCTION__ );
}
if( !NSD_ReadSettings( TSD_GetRegion(), pTempBuffer ) ||
if( !NSD_ReadSettings( THW_GetRegion(), pTempBuffer ) ||
!SYSMi_VerifyNTRSettings()
) {
// ロード or ベリファイ失敗なら、TWL設定データからNTR設定データを生成して、書き込み
SYSMi_ConvertTWL2NTRSettings();
NSD_WriteSettings( TSD_GetRegion() );
NSD_WriteSettings( THW_GetRegion() );
}
SYSM_Free( pTempBuffer );
}
// NTR設定とTWL設定をベリファイ
static BOOL SYSMi_VerifyNTRSettings( void )
BOOL SYSMi_VerifyNTRSettings( void )
{
BOOL isFailed = FALSE;
// NTRAlarm zeroAlarm; // TWLでアラームをなくす場合は、ゼロ値アラームと比較させる。
@ -123,27 +127,27 @@ static BOOL SYSMi_VerifyNTRSettings( void )
( NSD_GetExVersion() != NTR_SETTINGS_DATA_EX_VERSION ) ||
// オーナー情報
( NSD_GetUserColor() != TSD_GetUserColor() ) ||
!VerifyData( NSD_GetBirthday(), TSD_GetBirthday(), sizeof(NTRDate) ) ||
!VerifyData( NSD_GetNickname()->buffer, TSD_GetNickname()->buffer, NTR_NICKNAME_LENGTH ) ||
( NSD_GetNickname()->length != TSD_GetNickname()->length ) ||
!VerifyData( NSD_GetComment()->buffer, TSD_GetComment()->buffer, NTR_COMMENT_LENGTH ) ||
( NSD_GetComment()->length != TSD_GetComment()->length ) ||
!VerifyData( NSD_GetBirthdayPtr(), TSD_GetBirthdayPtr(), sizeof(NTRDate) ) ||
!VerifyData( NSD_GetNicknamePtr()->buffer, TSD_GetNicknamePtr(), NTR_NICKNAME_LENGTH ) ||
( NSD_GetNicknamePtr()->length != MY_StrLen( TSD_GetNicknamePtr() ) ) ||
!VerifyData( NSD_GetCommentPtr()->buffer, TSD_GetCommentPtr(), NTR_COMMENT_LENGTH ) ||
( NSD_GetCommentPtr()->length != MY_StrLen( TSD_GetCommentPtr() ) ) ||
// アラーム
!VerifyData( NSD_GetAlarmData(), TSD_GetAlarmData(), sizeof(NTRAlarm) ) ||
!VerifyData( NSD_GetAlarmDataPtr(), TSD_GetAlarmDataPtr(), sizeof(NTRAlarm) ) ||
// TP情報
!VerifyData( NSD_GetTPCalibration(), &TSD_GetTPCalibration()->data, sizeof(NTRTPCalibData) )
!VerifyData( NSD_GetTPCalibrationPtr(), TSD_GetTPCalibrationPtr(), sizeof(NTRTPCalibData) )
) {
OS_TPrintf( "VERSION : %d\n", ( NSD_GetVersion() != NTR_SETTINGS_DATA_VERSION ) );
OS_TPrintf( "VERSION EX: %d\n", ( NSD_GetExVersion() != NTR_SETTINGS_DATA_EX_VERSION ) );
OS_TPrintf( "UserColor : %d\n", ( NSD_GetUserColor() != TSD_GetUserColor() ) );
OS_TPrintf( "Birthday : %d\n", !VerifyData( NSD_GetBirthday(), TSD_GetBirthday(), sizeof(NTRDate) ) );
OS_TPrintf( "Nickname : %d\n", !VerifyData( NSD_GetNickname()->buffer, TSD_GetNickname()->buffer, NTR_NICKNAME_LENGTH ) );
OS_TPrintf( " length : %d\n", ( NSD_GetNickname()->length != TSD_GetNickname()->length ) );
OS_TPrintf( "Comment : %d\n", !VerifyData( NSD_GetComment()->buffer, TSD_GetComment()->buffer, NTR_COMMENT_LENGTH ) );
OS_TPrintf( " length : %d\n", ( NSD_GetComment()->length != TSD_GetComment()->length ) );
OS_TPrintf( "Alarm : %d\n", !VerifyData( NSD_GetAlarmData(), TSD_GetAlarmData(), sizeof(NTRAlarm) ) );
OS_TPrintf( "TP : %d\n", !VerifyData( NSD_GetTPCalibration(), &TSD_GetTPCalibration()->data, sizeof(NTRTPCalibData) ) );
OS_TPrintf( "Birthday : %d\n", !VerifyData( NSD_GetBirthdayPtr(), TSD_GetBirthdayPtr(), sizeof(NTRDate) ) );
OS_TPrintf( "Nickname : %d\n", !VerifyData( NSD_GetNicknamePtr()->buffer, TSD_GetNicknamePtr(), NTR_NICKNAME_LENGTH ) );
OS_TPrintf( " length : %d\n", ( NSD_GetNicknamePtr()->length != MY_StrLen( TSD_GetNicknamePtr() ) ) );
OS_TPrintf( "Comment : %d\n", !VerifyData( NSD_GetCommentPtr()->buffer, TSD_GetCommentPtr(), NTR_COMMENT_LENGTH ) );
OS_TPrintf( " length : %d\n", ( NSD_GetCommentPtr()->length != MY_StrLen( TSD_GetCommentPtr() ) ) );
OS_TPrintf( "Alarm : %d\n", !VerifyData( NSD_GetAlarmDataPtr(), TSD_GetAlarmDataPtr(), sizeof(NTRAlarm) ) );
OS_TPrintf( "TP : %d\n", !VerifyData( NSD_GetTPCalibrationPtr(), TSD_GetTPCalibrationPtr(), sizeof(NTRTPCalibData) ) );
isFailed = TRUE;
}
@ -181,16 +185,18 @@ static BOOL SYSMi_VerifyNTRSettings( void )
}
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
if( TSD_GetLanguage() < TWL_LANG_CODE_MAX_WW ) {
// TSD側が標準言語の時、NSD側は、各リージョンの対応言語ビットマップのうち、標準言語のものしか取りえない。
u16 defaultLangBitmap = (u16)( s_validLangBitmapList[ TSD_GetRegion() & 0x03 ] & NTR_LANG_BITMAP_WW );
if( ( defaultLangBitmap & ( 0x0001 << NSD_GetLanguage() ) ) == 0 ) {
{
NTRLangCode language = ( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) ?
NSD_GetLanguage() : NSD_GetLanguageEx();
// NSD側は、各リージョンの対応言語ビットマップのものしか取りえない。
if( ( THW_GetValidLanguageBitmap() & ( 0x0001 << language ) ) == 0 ) {
isFailed = TRUE;
}
}else {
// TSD側が標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
if( NSD_GetLanguage() != NTR_LANG_ENGLISH ) {
isFailed = TRUE;
if( TSD_GetLanguage() >= NTR_LANG_CODE_MAX_WW ) {
// TSD側がNTR標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
if( NSD_GetLanguage() != NTR_LANG_ENGLISH ) {
isFailed = TRUE;
}
}
}
@ -204,7 +210,7 @@ static BOOL SYSMi_VerifyNTRSettings( void )
// 指定サイズのベリファイ
static BOOL VerifyData( void *pTgt1, void *pTgt2, u32 size )
static BOOL VerifyData( const void *pTgt1, const void *pTgt2, u32 size )
{
u8 *p1 = (u8 *)pTgt1;
u8 *p2 = (u8 *)pTgt2;
@ -219,7 +225,7 @@ static BOOL VerifyData( void *pTgt1, void *pTgt2, u32 size )
// TWL設定データ -> NTR設定データのコンバート
static void SYSMi_ConvertTWL2NTRSettings( void )
void SYSMi_ConvertTWL2NTRSettings( void )
{
SVC_CpuClearFast( 0x0000, GetNSD(), sizeof(NTRSettingsData) );
SVC_CpuClearFast( 0x0000, GetNSDEx(), sizeof(NTRSettingsDataEx) );
@ -229,15 +235,15 @@ static void SYSMi_ConvertTWL2NTRSettings( void )
NSD_SetExVersion( NTR_SETTINGS_DATA_EX_VERSION );
// オーナー情報
NSD_SetUserColor( TSD_GetUserColor() );
MI_CpuCopy8 ( TSD_GetBirthday(), NSD_GetBirthday(), sizeof(NTRDate) );
MI_CpuCopy16( TSD_GetNickname()->buffer, NSD_GetNickname()->buffer, NTR_NICKNAME_BUFFERSIZE );
NSD_GetNickname()->length = TSD_GetNickname()->length;
MI_CpuCopy16( TSD_GetComment()->buffer, NSD_GetComment()->buffer, NTR_COMMENT_BUFFERSIZE );
NSD_GetNickname()->length = TSD_GetNickname()->length;
NSD_SetBirthday( TSD_GetBirthdayPtr() );
MI_CpuCopy16( TSD_GetNicknamePtr(), NSD_GetNicknamePtr()->buffer, NTR_NICKNAME_BUFFERSIZE );
NSD_GetNicknamePtr()->length = MY_StrLen( TSD_GetNicknamePtr() );
MI_CpuCopy16( TSD_GetCommentPtr(), NSD_GetCommentPtr()->buffer, NTR_COMMENT_BUFFERSIZE );
NSD_GetCommentPtr()->length = MY_StrLen( TSD_GetCommentPtr() );
// アラーム
MI_CpuCopy16( TSD_GetAlarmData(), NSD_GetAlarmData(), sizeof(NTRAlarm) );
NSD_SetAlarmData( TSD_GetAlarmDataPtr() );
// TPキャリブレーション
MI_CpuCopy16( &TSD_GetTPCalibration()->data, NSD_GetTPCalibration(), sizeof(NTRTPCalibData) );
NSD_SetTPCalibration( &TSD_GetTPCalibrationPtr()->data );
// オプション
// "0"であるべきもの
@ -262,11 +268,11 @@ static void SYSMi_ConvertTWL2NTRSettings( void )
// NSD_SetLanguageBitmap( TSD_GetLanguageBitmap() );
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
if( TSD_GetLanguage() < TWL_LANG_CODE_MAX_WW ) {
// TSD側が標準言語の時、TSD側 == NSD側
if( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) {
// TSD側がNTR標準言語の時、TSD側 == NSD側
NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() );
}else {
// TSD側が標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
// TSD側がNTR標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
NSD_SetLanguage( NTR_LANG_ENGLISH );
}
@ -275,3 +281,16 @@ static void SYSMi_ConvertTWL2NTRSettings( void )
NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() );
}
// UTF16の文字列長のチェック
static u8 MY_StrLen( const u16 *pStr )
{
u8 len = 0;
while( *pStr++ ) {
++len;
if( len == 255 ) {
break;
}
}
return len;
}

View File

@ -164,6 +164,8 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
// ランチャーのマウント情報セット
SYSMi_SetLauncherMountInfo();
OS_Init();
// ARM7コンポーネント用プロテクションユニット領域変更
OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB );
@ -198,12 +200,14 @@ void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
TitleProperty *SYSM_ReadParameters( void )
{
TitleProperty *pBootTitle = NULL;
u8 brightness = TWL_BACKLIGHT_LEVEL_MAX;
// ARM7のリセットパラメータ取得が完了するのを待つ
while( !SYSMi_GetWork()->isARM9Start ) {
SVC_WaitByLoop( 0x1000 );
}
#ifdef DEBUG_USED_CARD_SLOT_B_
// ARM7のカードチェック完了を待つ
while( !SYSMi_GetWork()->is1stCardChecked ) {
SVC_WaitByLoop( 0x1000 );
}
@ -231,22 +235,40 @@ TitleProperty *SYSM_ReadParameters( void )
pBootTitle = SYSMi_CheckShortcutBoot();
}
//-----------------------------------------------------
// HW情報のリード
//-----------------------------------------------------
// ノーマル情報リード
if( THW_ReadNormalInfo() != TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Normal Info Broken!\n" );
SYSMi_GetWork()->isBrokenHWNormalInfo = TRUE;
}
// セキュア情報リード
if( THW_ReadSecureInfo() != TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Secure Info Broken!\n" );
SYSMi_GetWork()->isBrokenHWSecureInfo = TRUE;
}
//-----------------------------------------------------
// 本体設定データのリード
//-----------------------------------------------------
if( SYSM_ReadTWLSettingsFile() ) { // NANDからTWL本体設定データをリード
SYSM_SetBackLightBrightness( (u8)TSD_GetBacklightBrightness() ); // 読み出したTWL本体設定データをもとにバックライト輝度設定
SYSM_CaribrateTP(); // 読み出したTWL本体設定データをもとにTPキャリブレーション。
brightness = (u8)TSD_GetBacklightBrightness();
}
// SYSM_ReadHWInfo(); // NANDからHW情報をリード
SYSMi_WriteAdjustRTC(); // RTCクロック補正値をセット。
//-----------------------------------------------------
// 各種デバイス設定
//-----------------------------------------------------
// バックライト輝度設定
SYSM_SetBackLightBrightness( brightness );
// RTC補正
SYSMi_WriteAdjustRTC();
// RTC値のチェック
SYSMi_CheckRTC();
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
// SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
//NAMの初期化
//NAM_Init(AllocForNAM,FreeForNAM);
@ -490,7 +512,7 @@ void SYSM_SetLogoDemoSkip( BOOL skip )
// ロゴデモスキップか?
BOOL SYSM_IsLogoDemoSkip( void )
{
return SYSMi_GetWork()->isLogoSkip;
return (BOOL)SYSMi_GetWork()->isLogoSkip;
}
@ -533,7 +555,7 @@ void SYSM_SetValidTSD( BOOL valid )
// TSD有効
BOOL SYSM_IsValidTSD( void )
{
return SYSMi_GetWork()->isValidTSD;
return (BOOL)SYSMi_GetWork()->isValidTSD;
}
// ============================================================================
@ -894,38 +916,29 @@ void SYSM_SetBackLightBrightness( u8 brightness )
// タッチパネルキャリブレーション
void SYSM_CaribrateTP( void )
{
#ifndef __TP_OFF
TPCalibrateParam calibrate;
TWLTPCalibData store;
TPCalibrateParam calibParam;
( void )TP_CalcCalibrateParam( &calibrate, // タッチパネル初期化
GetTSD()->tp.data.raw_x1, GetTSD()->tp.data.raw_y1, (u16)GetTSD()->tp.data.dx1, (u16)GetTSD()->tp.data.dy1,
GetTSD()->tp.data.raw_x2, GetTSD()->tp.data.raw_y2, (u16)GetTSD()->tp.data.dx2, (u16)GetTSD()->tp.data.dy2 );
TP_SetCalibrateParam( &calibrate );
// 本体設定データからキャリブレーション情報を取得
TSD_GetTPCalibration( &store );
// TPキャリブレーション
( void )TP_CalcCalibrateParam( &calibParam, // タッチパネル初期化
store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1,
store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 );
TP_SetCalibrateParam( &calibParam );
OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n",
GetTSD()->tp.data.raw_x1, GetTSD()->tp.data.raw_y1, (u16)GetTSD()->tp.data.dx1, (u16)GetTSD()->tp.data.dy1,
GetTSD()->tp.data.raw_x2, GetTSD()->tp.data.raw_y2, (u16)GetTSD()->tp.data.dx2, (u16)GetTSD()->tp.data.dy2 );
#endif
store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1,
store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 );
}
// RTCクロック補正値をセット
static void SYSMi_WriteAdjustRTC( void )
{
// ※TWLの時は、NANDの"/sys/HWINFO.dat"ファイルから該当する情報を取得する。
#if 0
FS_OpenFile( "/sys/HWINFO.dat" );
FS_ReadFile( xxxx );
raw = xxxx.rtcRaw;
( void )RTCi_SetRegAdjust( &raw );
#endif
#ifndef __IS_DEBUGGER_BUILD // デバッガ用ビルド時は補正しない。
RTCRawAdjust raw;
raw.adjust = 0;
// raw.adjust = GetTSD()->rtcClockAdjust; // isValidTSD時にはrtcClockAdjustは
// 0クリアされているため補正機能は使用されない
raw.adjust = THW_GetRTCAdjust();
( void )RTCi_SetRegAdjust( &raw );
#endif /* __IS_DEBUGGER_BUILD */
}
@ -962,7 +975,7 @@ static BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner )
DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 );
MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) );
}
return SYSMi_GetWork()->isValidCardBanner;
return (BOOL)SYSMi_GetWork()->isValidCardBanner;
#endif
}
@ -1010,7 +1023,7 @@ static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner )
// 有効なTWL/NTRカードが差さっているか
BOOL SYSM_IsExistCard( void )
{
return SYSMi_GetWork()->isExistCard;
return (BOOL)SYSMi_GetWork()->isExistCard;
}
@ -1111,14 +1124,13 @@ static void SYSMi_CheckRTC( void )
!SYSM_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
||
( SYSMi_GetWork()->rtcStatus & 0x01 )
SYSMi_GetWork()->isResetRTC
#endif
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");
GetTSD()->flags.isSetDateTime = 0;
GetTSD()->rtcOffset = 0;
GetTSD()->rtcLastSetYear = 0;
// ※※ライトする?
TSD_SetFlagDateTime( FALSE );
TSD_SetRTCOffset( 0 );
TSD_SetRTCLastSetYear( 0 );
SYSM_WriteTWLSettingsFile();
}
}

View File

@ -1,6 +1,6 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# Project: TwlIPL - SystemMenuRED - HWInfoWriter
# File: Makefile
#
# Copyright 2007 Nintendo. All rights reserved.
@ -16,8 +16,9 @@
# $Author$
#----------------------------------------------------------------------------
SUBDIRS = ../../../libraries_sysmenu/acsign \
../../../libraries_sysmenu/settings
SUBDIRS = \
# ../../../libraries_sysmenu/sysmenu \
# ../../../libraries_sysmenu/settings
#----------------------------------------------------------------------------

View File

@ -32,6 +32,8 @@ const TWLHWNormalInfo *THW_GetNormalInfo( void );
const TWLHWSecureInfo *THW_GetSecureInfo( void );
// function's prototype declaration---------------------
static void ReadTWLSettings( void );
static void ModifyLanguage( u8 region );
static void ReadPrivateKey( void );
static void ReadHWInfoFile( void );
static void WriteHWInfoFile( u8 region );
@ -50,6 +52,8 @@ RTCDrawProperty g_rtcDraw = {
// static variable -------------------------------------
static u16 s_csr;
static u8 *s_pPrivKeyBuffer = NULL;
static TSFReadResult (*s_pReadSecureInfoFunc)( void );
static BOOL s_isReadTSD;
// const data -----------------------------------------
static const u16 *const s_pStrWriter[ WRITER_ELEMENT_NUM ] = {
@ -82,6 +86,27 @@ static const MenuParam s_writerParam = {
(const u16 **)&s_pStrWriter,
};
static const u32 s_langBitmapList[ TWL_REGION_MAX ] = {
TWL_LANG_BITMAP_JAPAN,
TWL_LANG_BITMAP_AMERICA,
TWL_LANG_BITMAP_EUROPE,
TWL_LANG_BITMAP_AUSTRALIA,
TWL_LANG_BITMAP_CHINA,
TWL_LANG_BITMAP_KOREA,
};
static char *strLanguage[] = {
(char *)"LANG_JAPANESE",
(char *)"LANG_ENGLISH",
(char *)"LANG_FRENCH",
(char *)"LANG_GERMAN",
(char *)"LANG_ITALIAN",
(char *)"LANG_SPANISH",
(char *)"LANG_CHINESE",
(char *)"LANG_KOREAN",
};
//======================================================
// HW情報ライター
//======================================================
@ -100,6 +125,7 @@ void HWInfoWriterInit( void )
GetAndDrawRTCData( &g_rtcDraw, TRUE );
ACSign_SetAllocFunc( Alloc, Free );
ReadTWLSettings();
ReadPrivateKey();
ReadHWInfoFile();
// VerifyHWInfo();
@ -145,12 +171,55 @@ void HWInfoWriterMain( void )
}
// TWL設定データのリード
static void ReadTWLSettings( void )
{
s_isReadTSD = TSD_ReadSettings();
if( s_isReadTSD ) {
OS_TPrintf( "TSD read succeeded.\n" );
}else {
OS_TPrintf( "TSD read failed.\n" );
}
}
// 言語コードをリージョン値に合わせて修正する。
static void ModifyLanguage( u8 region )
{
u32 langBitmap = s_langBitmapList[ region ];
u8 nowLanguage = TSD_GetLanguage();
// TSDが読み込めていないなら、何もせずリターン
if( !s_isReadTSD ) {
return;
}
if( langBitmap & ( 0x0001 << nowLanguage ) ) {
OS_TPrintf( "Language no change.\n" );
}else {
int i;
for( i = 0; i < TWL_LANG_CODE_MAX; i++ ) {
if( langBitmap & ( 0x0001 << i ) ) {
break;
}
}
TSD_SetLanguage( (TWLLangCode)i );
TSD_SetFlagCountry( FALSE ); // ※ついでに国コードもクリアしておく。
TSD_SetCountry( TWL_COUNTRY_UNDEFINED );
TSD_WriteSettings();
OS_TPrintf( "Language Change \"%s\" -> \"%s\"\n",
strLanguage[ nowLanguage ], strLanguage[ TSD_GetLanguage() ] );
}
}
// 秘密鍵のリード
static void ReadPrivateKey( void )
{
BOOL result = FALSE;
u32 keyLength;
FSFile file;
OSTick start = OS_GetTick();
FS_InitFile( &file );
if( !FS_OpenFileEx( &file, "rom:key/privKeyHWInfo.der", FS_FILEMODE_R ) ) {
@ -168,10 +237,21 @@ static void ReadPrivateKey( void )
}
FS_CloseFile( &file );
}
if( !result && s_pPrivKeyBuffer ) {
Free( s_pPrivKeyBuffer );
s_pPrivKeyBuffer = NULL;
}
OS_TPrintf( "PrivKey read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
if( s_pPrivKeyBuffer ) {
// 秘密鍵が有効なら、署名ありのアクセス
s_pReadSecureInfoFunc = THW_ReadSecureInfo;
}else {
// 秘密鍵が無効なら、署名なしのアクセス
s_pReadSecureInfoFunc = THW_ReadSecureInfo_NoCheck;
PutStringUTF16( 14 * 8, 0 * 8, TXT_COLOR_RED, (const u16 *)L"[No Signature MODE]" );
}
}
@ -179,20 +259,25 @@ static void ReadPrivateKey( void )
static void ReadHWInfoFile( void )
{
TSFReadResult retval;
OSTick start = OS_GetTick();
retval = THW_ReadNormalInfo();
if( retval == TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Normal Info Read succeeded.\n" );
OS_TPrintf( "HW Normal Info read succeeded.\n" );
}else {
OS_TPrintf( "HW Normal Info Read failed.\n" );
OS_TPrintf( "HW Normal Info read failed.\n" );
}
retval = THW_ReadSecureInfo();
OS_TPrintf( "HW Normal Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
start = OS_GetTick();
retval = s_pReadSecureInfoFunc();
if( retval == TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Secure Info Read succeeded.\n" );
OS_TPrintf( "HW Secure Info read succeeded.\n" );
}else {
OS_TPrintf( "HW Secure Info Read failed.\n" );
OS_TPrintf( "HW Secure Info read failed.\n" );
}
OS_TPrintf( "HW Secure Info read time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
}
@ -222,6 +307,8 @@ static void WriteHWInfoFile( u8 region )
(void)PutStringUTF16( ( MSG_X + 18 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_RED, pMsgFailed );
}
ModifyLanguage( region );
// メッセージを一定時間表示して消去
DispMessage( 0, 0, TXT_COLOR_NULL, NULL );
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
@ -257,14 +344,8 @@ static BOOL WriteHWSecureInfoFile( u8 region )
BOOL isWrite = TRUE;
TSFReadResult result;
// 秘密鍵が読み込めていないなら、エラー
if( s_pPrivKeyBuffer == NULL ) {
OS_TPrintf( "Private key not read.\n" );
return FALSE;
}
// ファイルのリード
result = THW_ReadSecureInfo();
result = s_pReadSecureInfoFunc();
// リードに失敗したらリカバリ
if( result != TSF_READ_RESULT_SUCCEEDED ) {
@ -277,6 +358,10 @@ static BOOL WriteHWSecureInfoFile( u8 region )
// リージョンのセット
THW_SetRegion( region );
// 対応言語ビットマップのセット
THW_SetValidLanguageBitmap( s_langBitmapList[ region ] );
// ライト
if( isWrite &&
!THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) {
isWrite = FALSE;

View File

@ -54,10 +54,9 @@ void TwlMain( void )
BOOL direct_boot = FALSE;
// システムメニュー初期化----------
SYSM_Init( Alloc, Free ); // OS_Initでコール。
SYSM_Init( Alloc, Free ); // OS_Initは、本関数内でコールしているのでコールする必要なし
// OS初期化------------------------
OS_Init();
OS_InitTick();
PM_Init();

View File

@ -1,6 +1,6 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# Project: TwlIPL - SystemMenuRED - MachineSettings
# File: Makefile
#
# Copyright 2007 Nintendo. All rights reserved.
@ -11,12 +11,14 @@
# 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: $
# $Date:: 2007-11-30#$
# $Rev: 2778 $
# $Author: terui $
#----------------------------------------------------------------------------
SUBDIRS =
SUBDIRS = \
# ../../../libraries_sysmenu/sysmenu \
# ../../../libraries_sysmenu/settings
#----------------------------------------------------------------------------

View File

@ -51,6 +51,7 @@ typedef struct InputNumParam {
extern NNSFndAllocator g_allocator;
extern BOOL g_initialSet;
extern int (*g_pNowProcess)( void );
extern BOOL g_isValidTSD;
// function-------------------------------------------------------------
extern void MachineSettingInit( void );

View File

@ -442,7 +442,7 @@ int TP_CalibrationMain( void )
// キャリブレーションを設定前の状態に戻す。
{
TPCalibrateParam calibrate;
MI_CpuCopy16( TSD_GetTPCalibration(), &s_pTPC->calibTemp, sizeof(TWLTPCalibData) );
TSD_GetTPCalibration( &s_pTPC->calibTemp );
(void)TP_CalcCalibrateParam(
&calibrate,
s_pTPC->calibTemp.data.raw_x1, s_pTPC->calibTemp.data.raw_y1, (u16)s_pTPC->calibTemp.data.dx1, (u16)s_pTPC->calibTemp.data.dy1,

View File

@ -28,6 +28,7 @@ static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
int (*g_pNowProcess)( void );
BOOL g_isValidTSD;
RTCDrawProperty g_rtcDraw = {
TRUE, RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y
};
@ -45,6 +46,7 @@ void TwlMain(void)
// 初期化----------------------------------
OS_Init();
OS_InitTick();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
@ -74,7 +76,9 @@ void TwlMain(void)
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み
// ::::::::::::::::::::::::::::::::::::::::::::::
if( SYSM_ReadTWLSettingsFile() ) {
(void)THW_ReadSecureInfo();
g_isValidTSD = SYSM_ReadTWLSettingsFile();
if( g_isValidTSD ) {
SYSM_CaribrateTP();
}

View File

@ -148,14 +148,9 @@ void SelectCountryInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// 設定済みリージョンと国名コードの取得
if( !SYSM_IsValidTSD() ||
( TSD_GetRegion() >= TWL_REGION_MAX ) ) {
s_regionCode = (TWLRegion)TWL_DEFAULT_REGION;
}else {
s_regionCode = (TWLRegion)TSD_GetRegion();
}
s_regionCode = (TWLRegion)THW_GetRegion();
if( !SYSM_IsValidTSD() ||
if( !g_isValidTSD ||
( TSD_GetCountry() >= TWL_COUNTRY_MAX ) ) {
s_countryCode = (TWLCountryCode)0;
}else {

View File

@ -107,15 +107,10 @@ void SelectLanguageInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// リージョンの取得
if( !SYSM_IsValidTSD() ||
( TSD_GetRegion() >= TWL_REGION_MAX ) ) {
s_regionCode = (TWLRegion)TWL_DEFAULT_REGION;
}else {
s_regionCode = (TWLRegion)TSD_GetRegion();
}
s_regionCode = (TWLRegion)THW_GetRegion();
// 言語の取得
if( !SYSM_IsValidTSD() ||
if( !g_isValidTSD ||
( TSD_GetLanguage() >= TWL_LANG_CODE_MAX ) ) {
temp_langCode = TWL_LANG_ENGLISH;
}else {

View File

@ -103,12 +103,7 @@ void SelectRegionInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// リージョンの取得
if( !SYSM_IsValidTSD() ||
( TSD_GetRegion() >= TWL_REGION_MAX ) ) {
s_regionCode = (TWLRegion)TWL_DEFAULT_REGION;
}else {
s_regionCode = (TWLRegion)TSD_GetRegion();
}
s_regionCode = (TWLRegion)THW_GetRegion();
DrawMenu( (u16)s_regionCode, &regionSel );
@ -151,17 +146,21 @@ int SelectRegionMain( void )
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_select ) { // メニュー項目への分岐
TSD_SetRegion( s_regionCode );
// TSD_SetFlagRegion( TRUE ); // Region入力フラグを立てる
// ::::::::::::::::::::::::::::::::::::::::::::::
// HWセキュア情報ファイルへの書き込み暗号化なし
// ::::::::::::::::::::::::::::::::::::::::::::::
THW_SetRegion( s_regionCode );
(void)THW_WriteSecureInfo( NULL );
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
TSD_SetLanguage( default_lang_list[s_regionCode] ); // デフォルト言語に強制設定
TSD_SetCountry( default_country_list[s_regionCode] ); // デフォルト国に強制設定
TSD_SetFlagLanguage( TRUE ); // Language入力フラグを立てる
//TSD_SetFlagCountry( TRUE ); // Country入力フラグを立てる
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)SYSM_WriteTWLSettingsFile();
MachineSettingInit();
return 0;
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) {

View File

@ -86,6 +86,7 @@ static void SetUserColorInit( void );
static int SetUserColorMain( void );
static void SetCommentInit( void );
static int SetCommentMain( void );
static u8 MY_StrLen( const u16 *pStr );
// static variable------------------------------
// 一時的にしか使わない物をstaticにしているので
@ -97,8 +98,10 @@ static u16 s_key_csr = 0;
static u8 s_color_csr = 0;
static BOOL s_birth_csr = FALSE;
static TWLDate s_temp_birthday;
static TWLNickname s_temp_name;
static TWLComment s_temp_comment;
static u16 s_temp_name[ TWL_NICKNAME_LENGTH + 1 ];
static u16 s_temp_comment[ TWL_NICKNAME_LENGTH + 1 ];
static u8 s_temp_name_length;
static u8 s_temp_comment_length;
// const data-----------------------------------
static const u16 char_tbl[CHAR_LIST_MODE_NUM][CHAR_LIST_CHAR_NUM];
@ -229,16 +232,16 @@ static void DrawOwnerInfoMenuScene( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得して表示
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// ニックネーム
PutStringUTF16( 128 , 8*8, TXT_UCOLOR_G0, TSD_GetNickname()->buffer );
PutStringUTF16( 128 , 8*8, TXT_UCOLOR_G0, TSD_GetNicknamePtr() );
// 誕生日
PrintfSJIS( 128, 10*8, TXT_UCOLOR_G0, "%d%d", TSD_GetBirthday()->month, TSD_GetBirthday()->day);
PrintfSJIS( 128, 10*8, TXT_UCOLOR_G0, "%d%d", TSD_GetBirthdayPtr()->month, TSD_GetBirthdayPtr()->day);
// カラー
color = TSD_GetUserColor();
PutStringUTF16( 128 , 12*8, TXT_UCOLOR_G0, L"" );
// コメント
SVC_CpuCopy( TSD_GetComment()->buffer, tempbuf, 13 * 2, 16 );
SVC_CpuCopy( TSD_GetCommentPtr(), tempbuf, 13 * 2, 16 );
*(tempbuf+13)='\n';
SVC_CpuCopy( TSD_GetComment()->buffer+13, tempbuf+14, 13 * 2, 16 );
SVC_CpuCopy( TSD_GetCommentPtr()+13, tempbuf+14, 13 * 2, 16 );
*(tempbuf+TWL_COMMENT_LENGTH+1)=0;
PutStringUTF16( 128-78 , 16*8 , TXT_UCOLOR_G0, tempbuf );
}
@ -361,12 +364,12 @@ static void DeleteACharacter( NameOrComment noc )
u8 *length;
if(noc == NOC_NAME)
{
buf = s_temp_name.buffer;
length = &s_temp_name.length;
buf = s_temp_name;
length = &s_temp_name_length;
}else if(noc == NOC_COMMENT)
{
buf = s_temp_comment.buffer;
length = &s_temp_comment.length;
buf = s_temp_comment;
length = &s_temp_comment_length;
}else
{
//unknown
@ -376,29 +379,24 @@ static void DeleteACharacter( NameOrComment noc )
if(*length > 0) buf[--(*length)] = CHAR_USCORE;
}
// 選択中文字キー・特殊キーで決定した時の挙動
static void PushKeys( u16 code, NameOrComment noc )
{
u16 *buf;
u8 *length;
u16 *dest;
u8 *destlength;
u16 max_length;
void (*setflag)(BOOL);
void (*setflag)(BOOL) = NULL;
if(noc == NOC_NAME)
{
buf = s_temp_name.buffer;
length = &s_temp_name.length;
dest = TSD_GetNickname()->buffer;
destlength = &TSD_GetNickname()->length;
buf = s_temp_name;
length = &s_temp_name_length;
max_length = TWL_NICKNAME_LENGTH;
setflag = TSD_SetFlagNickname;
}else if(noc == NOC_COMMENT)
{
buf = s_temp_comment.buffer;
length = &s_temp_comment.length;
dest = TSD_GetComment()->buffer;
destlength = &TSD_GetComment()->length;
buf = s_temp_comment;
length = &s_temp_comment_length;
max_length = TWL_COMMENT_LENGTH;
// setflag = TSD_SetFlagComment;
setflag = NULL;
@ -425,9 +423,12 @@ static void PushKeys( u16 code, NameOrComment noc )
break;
case OK_BUTTON_:
if(setflag) setflag(TRUE);// 設定完了フラグを立てておく
SVC_CpuClear(0, dest, (max_length + 1) * 2, 16);// ゼロクリア
*destlength = *length;// 長さコピー
SVC_CpuCopy( buf, dest, (*length) * 2, 16 );// 内容コピー
SVC_CpuClear(0, buf + *length, (max_length - *length) * 2, 16);// ゼロクリア
if(noc == NOC_NAME) {
TSD_SetNickname( buf );
}else if(noc == NOC_COMMENT) {
TSD_SetComment( buf );
}
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
@ -565,7 +566,7 @@ static void DrawSetNicknameScene( void )
{
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"NICKNAME" );
PutStringUTF16( 128-60 , 21 , TXT_UCOLOR_G0, s_temp_name.buffer );
PutStringUTF16( 128-60 , 21 , TXT_UCOLOR_G0, s_temp_name );
DrawCharKeys();
}
@ -579,10 +580,12 @@ static void SetNicknameInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// ニックネーム用テンポラリバッファの初期化
s_temp_name.length = TSD_GetNickname()->length;
SVC_CpuClear(CHAR_USCORE, s_temp_name.buffer, TWL_NICKNAME_LENGTH * 2, 16);
SVC_CpuCopy( TSD_GetNickname()->buffer, s_temp_name.buffer, s_temp_name.length * 2, 16 );
s_temp_name.buffer[TWL_NICKNAME_LENGTH] = 0;
TSD_GetNickname( s_temp_name );
s_temp_name_length = MY_StrLen( s_temp_name );
if( s_temp_name_length < TWL_NICKNAME_LENGTH ) {
SVC_CpuClear(CHAR_USCORE, &s_temp_name[ s_temp_name_length ],
( TWL_NICKNAME_LENGTH - s_temp_name_length ) * 2, 16);
}
DrawSetNicknameScene();
@ -648,8 +651,7 @@ static void SetBirthdayInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// 誕生日
s_temp_birthday.month = TSD_GetBirthday()->month;
s_temp_birthday.day = TSD_GetBirthday()->day;
TSD_GetBirthday( &s_temp_birthday );
// BGデータのロード処理
GX_LoadBG1Char(bg_char_data, 0, sizeof(bg_char_data));
@ -910,9 +912,9 @@ static void DrawSetCommentScene( void )
u16 tempbuf[TWL_COMMENT_LENGTH+2];
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"COMMENT" );
SVC_CpuCopy( s_temp_comment.buffer, tempbuf, 13 * 2, 16 );
SVC_CpuCopy( s_temp_comment, tempbuf, 13 * 2, 16 );
*(tempbuf+13)='\n';
SVC_CpuCopy( s_temp_comment.buffer+13, tempbuf+14, 13 * 2, 16 );
SVC_CpuCopy( s_temp_comment+13, tempbuf+14, 13 * 2, 16 );
*(tempbuf+TWL_COMMENT_LENGTH+1)=0;
PutStringUTF16( 128-78 , 15 , TXT_UCOLOR_G0, tempbuf );
DrawCharKeys();
@ -928,10 +930,12 @@ static void SetCommentInit( void )
// あらかじめTWL設定データファイルから読み込み済みの設定を取得
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// コメント用テンポラリバッファの初期化
s_temp_comment.length = TSD_GetComment()->length;
SVC_CpuClear(CHAR_USCORE, s_temp_comment.buffer, TWL_COMMENT_LENGTH * 2, 16);
SVC_CpuCopy( TSD_GetComment()->buffer, s_temp_comment.buffer, s_temp_comment.length * 2, 16 );
s_temp_comment.buffer[TWL_COMMENT_LENGTH] = 0;
TSD_GetComment( s_temp_comment );
s_temp_comment_length = MY_StrLen( s_temp_comment );
if( s_temp_comment_length < TWL_COMMENT_LENGTH ) {
SVC_CpuClear(CHAR_USCORE, &s_temp_comment[ s_temp_comment_length ],
( TWL_COMMENT_LENGTH - s_temp_comment_length ) * 2, 16);
}
DrawSetCommentScene();
@ -954,6 +958,20 @@ static int SetCommentMain( void )
return 0;
}
// UTF16の文字列長算出
static u8 MY_StrLen( const u16 *pStr )
{
u8 len = 0;
while( *pStr++ ) {
++len;
if( len == 255 ) {
break;
}
}
return len;
}
//======================================================
// ソフトウェアキーボード用キャラテーブル
//======================================================
@ -1044,3 +1062,4 @@ static const u16 char_tbl[CHAR_LIST_MODE_NUM][CHAR_LIST_CHAR_NUM] = {
},
};

View File

@ -163,11 +163,9 @@ void InitAllocator( void )
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
MI_CpuClear16( (void *)arenaLow, heapSize);
heapHandle = NNS_FndCreateExpHeap( heapMemory, heapSize );
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap( pAllocator, heapHandle, 32 );
}

View File

@ -223,48 +223,84 @@ static inline u8 NSD_GetExVersion( void )
return (u8)GetNSDEx()->version;
}
// オーナー情報全体の取得。
static inline NTROwnerInfo *NSD_GetOwnerInfo( void )
// オーナー情報全体へのポインタの取得。
static inline NTROwnerInfo *NSD_GetOwnerInfoPtr( void )
{
return &GetNSD()->owner;
}
// オーナー情報全体の取得。
static inline void NSD_GetOwnerInfo( NTROwnerInfo *pDst )
{
MI_CpuCopy8( &GetNSD()->owner, pDst, sizeof(NTROwnerInfo) );
}
// ユーザーカラーの取得。
static inline u8 NSD_GetUserColor( void )
{
return (u8)GetNSD()->owner.userColor;
}
// 誕生日の取得。
static inline NTRDate *NSD_GetBirthday( void )
// 誕生日へのポインタの取得。
static inline NTRDate *NSD_GetBirthdayPtr( void )
{
return &GetNSD()->owner.birthday;
}
// ニックネームの取得。
static inline NTRNickname *NSD_GetNickname( void )
// 誕生日の取得。
static inline void NSD_GetBirthday( NTRDate *pDst )
{
MI_CpuCopy8( &GetNSD()->owner.birthday, pDst, sizeof(NTRDate) );
}
// ニックネームへのポインタの取得。
static inline NTRNickname *NSD_GetNicknamePtr( void )
{
return &GetNSD()->owner.nickname;
}
// コメントの取得。
static inline NTRComment *NSD_GetComment( void )
// ニックネームの取得。
static inline void NSD_GetNickname( NTRNickname *pDst )
{
MI_CpuCopy8( &GetNSD()->owner.nickname, pDst, sizeof(NTRNickname) );
}
// コメントへのポインタの取得。
static inline NTRComment *NSD_GetCommentPtr( void )
{
return &GetNSD()->owner.comment;
}
// アラーム情報の取得。
static inline NTRAlarm *NSD_GetAlarmData( void )
// コメントの取得。
static inline void NSD_GetComment( NTRComment *pDst )
{
MI_CpuCopy8( &GetNSD()->owner.comment, pDst, sizeof(NTRComment) );
}
// アラーム情報へのポインタの取得。
static inline NTRAlarm *NSD_GetAlarmDataPtr( void )
{
return &GetNSD()->alarm;
}
// タッチパネルキャリブレーションデータの取得。
static inline NTRTPCalibData *NSD_GetTPCalibration( void )
// アラーム情報の取得。
static inline void NSD_GetAlarmData( NTRAlarm *pDst )
{
MI_CpuCopy8( &GetNSD()->alarm, pDst, sizeof(NTRAlarm) );
}
// タッチパネルキャリブレーションデータへのポインタの取得。
static inline NTRTPCalibData *NSD_GetTPCalibrationPtr( void )
{
return &GetNSD()->tp;
}
// タッチパネルキャリブレーションデータの取得。
static inline void NSD_GetTPCalibration( NTRTPCalibData *pDst )
{
MI_CpuCopy8( &GetNSD()->tp, pDst, sizeof(NTRTPCalibData) );
}
// 言語コードの取得
static inline NTRLangCode NSD_GetLanguage( void )
{
@ -386,7 +422,7 @@ static inline void NSD_SetExVersion( u8 version )
extern void NSD_ClearOwnerInfo( void );
// オーナー情報全体のセット。
static inline void NSD_SetOwnerInfo( NTROwnerInfo *pOwner )
static inline void NSD_SetOwnerInfo( const NTROwnerInfo *pOwner )
{
MI_CpuCopy16( pOwner, &GetNSD()->owner, sizeof(NTROwnerInfo) );
}
@ -398,32 +434,32 @@ static inline void NSD_SetUserColor( u8 userColor )
}
// 誕生日のセット。
static inline void NSD_SetBirthday( NTRDate *pBirthday )
static inline void NSD_SetBirthday( const NTRDate *pBirthday )
{
GetNSD()->owner.birthday.month = pBirthday->month;
GetNSD()->owner.birthday.day = pBirthday->day;
}
// ニックネームのセット。
static inline void NSD_SetNickname( NTRNickname *pName )
static inline void NSD_SetNickname( const NTRNickname *pName )
{
MI_CpuCopy16( pName, &GetNSD()->owner.nickname, sizeof(NTRNickname) );
}
// コメントのセット。
static inline void NSD_SetComment( NTRComment *pComment )
static inline void NSD_SetComment( const NTRComment *pComment )
{
MI_CpuCopy16( pComment, &GetNSD()->owner.comment, sizeof(NTRComment) );
}
// アラーム情報のセット。
static inline void NSD_SetAlarmData( NTRAlarm *pAlarm )
static inline void NSD_SetAlarmData( const NTRAlarm *pAlarm )
{
MI_CpuCopy16( pAlarm, &GetNSD()->alarm, sizeof(NTRAlarm) );
}
// タッチパネルキャリブレーションデータのセット。
static inline void NSD_SetTPCalibration( NTRTPCalibData *pTPCalib )
static inline void NSD_SetTPCalibration( const NTRTPCalibData *pTPCalib )
{
MI_CpuCopy16( pTPCalib, &GetNSD()->tp, sizeof(NTRTPCalibData) );
}

View File

@ -20,14 +20,14 @@
#define TWL_HW_INFO_H_
#define HW_SECURE_INFO_WRITE_ENABLE_ // HWセキュア情報のライト許可コンパイルスイッチ
#define HW_SIGNATURE_ENABLE_ // HWセキュア情報の署名処理有効コンパイルスイッチ
#include <twl.h>
#include <sysmenu/settings/common/TWLStoreFile.h>
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
#ifdef HW_SIGNATURE_ENABLE_
#include <sysmenu/acsign.h>
#endif // HW_SECURE_INFO_WRITE_ENABLE_
#endif // HW_SIGNATURE_ENABLE_
#ifdef __cplusplus
extern "C" {
@ -43,7 +43,7 @@ extern "C" {
#define TWL_HWINFO_SECURE_VERSION 1 // HW情報フォーマットバージョン(開始No.:1)
#define TWL_HWINFO_SERIALNO_LEN_AMERICA 11 // 本体シリアルNo.長Max北米向けは11桁
#define TWL_HWINFO_SERIALNO_LEN_OTHERS 12 // 本体シリアルNo.長Max
#define TWL_HWINFO_SERIALNO_LEN_MAX 16 // 本体シリアルNo.長Max
#define TWL_HWINFO_SERIALNO_LEN_MAX 15 // 本体シリアルNo.長Max(終端付きなので、14bytesまで拡張可)
#define TWL_HWINFO_CAMERA_LEN 1024 // カメラ情報 [TODO]サイズ未定
@ -58,20 +58,18 @@ typedef enum TWLRegionCode {
TWL_REGION_MAX
}TWLRegion;
// 本体シリアルNo.
typedef struct TWLSerialNo {
u8 length; // シリアルNo.長
u8 no[ TWL_HWINFO_SERIALNO_LEN_MAX ]; // シリアルNo.ASCII文字列
}TWLSerialNo;
// TWL_HWセキュア情報設定データ署名で改ざん保護する必要があるもの
// ※基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLHWSecureInfo{
u8 region; // リージョン
TWLSerialNo serialNo; // 本体シリアルNo.
}TWLHWSecureInfo; // 18bytes
#define TWL_LANG_BITMAP_JAPAN ( ( 0x0001 << TWL_LANG_JAPANESE ) ) // JPN版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AMERICA ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // AME版での対応言語ビットマップ
#define TWL_LANG_BITMAP_EUROPE ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_GERMAN ) | \
( 0x0001 << TWL_LANG_ITALIAN ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // EUR版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AUSTRALIA ( ( 0x0001 << TWL_LANG_ENGLISH ) ) // AUS版での対応言語ビットマップ
#define TWL_LANG_BITMAP_CHINA ( ( 0x0001 << TWL_LANG_SIMP_CHINESE ) ) // CHI版での対応言語ビットマップ
#define TWL_LANG_BITMAP_KOREA ( ( 0x0001 << TWL_LANG_KOREAN ) ) // KOR版での対応言語ビットマップ
// TWL_HWーマル情報設定データ署名で改ざん保護する必要がないもの
@ -82,6 +80,16 @@ typedef struct TWLHWNormalInfo{
}TWLHWNormalInfo; // 1025byte
// TWL_HWセキュア情報設定データ署名で改ざん保護する必要があるもの
// ※基本、過去ver互換を考慮して、追加しかしない方針で。
// ※SystemShared領域にリードしているので、サイズが変わった時は注意する。
typedef struct TWLHWSecureInfo{
u32 validLanguageBitmap; // 本体で有効な言語コードをビット列で表現
u8 region; // リージョン
u8 serialNo[ TWL_HWINFO_SERIALNO_LEN_MAX ]; // シリアルNo.終端付きASCII文字列
}TWLHWSecureInfo; // 20bytes
#ifdef SDK_ARM9
@ -89,32 +97,37 @@ typedef struct TWLHWNormalInfo{
// HW情報リードライト関数
//=========================================================
// Normal情報
// 内部変数へのリードfs
// 内部変数へのリード
extern TSFReadResult THW_ReadNormalInfo( void );
// 内部変数の値のライト
// 内部変数の値をライト(先にリードしておく必要がある)
extern BOOL THW_WriteNormalInfo( void );
// 直接値を指定してのライト(開発用)
extern BOOL THW_WriteNormalInfoDirect( const TWLHWNormalInfo *pSrcInfo );
// ファイルリカバリー
extern BOOL THW_RecoveryNormalInfo( TSFReadResult err );
// 上記Read,Write関数で使用されるデフォルト値のセット開発用
extern void TWH_SetNormalDefaultValue( const TWLHWNormalInfo *pSrcInfo );
extern void THW_SetDefaultNormalInfo( const TWLHWNormalInfo *pSrcInfo );
extern void THW_ClearNormalInfoDirect( TWLHWNormalInfo *pDstInfo );
extern const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void );
extern const TWLHWNormalInfo *THW_GetNormalInfo( void );
// Secure情報
// リード
// 内部変数へのリード
extern TSFReadResult THW_ReadSecureInfo( void );
// 下記コンパイルスイッチ定義時のみ有効
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
// ライト
extern BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER );
extern TSFReadResult THW_ReadSecureInfo_NoCheck( void ); // 署名ノーチェックでリード
// 内部変数の値をライト(先にリードしておく必要がある)
extern BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER ); // pPrivKeyDERがNULLなら署名なしでライト
// 直接値を指定してのライト(開発用)
extern BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPrivKeyDER );
extern BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPrivKeyDER ); // pPrivKeyDERがNULLなら署名なしでライト
// ファイルリカバリー
extern BOOL THW_RecoverySecureInfo( TSFReadResult err );
#endif // HW_SECURE_INFO_WRITE_ENABLE_
// 上記Read,Write関数で使用されるデフォルト値のセット開発用
extern void TWH_SetSecureDefaultValue( const TWLHWSecureInfo *pSrcInfo );
extern void THW_SetDefaultSecureInfo( const TWLHWSecureInfo *pSrcInfo );
extern void THW_ClearSecureInfoDirect( TWLHWSecureInfo *pDstInfo );
extern const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void );
extern const TWLHWSecureInfo *THW_GetSecureInfo( void );
//=========================================================
// 下記アクセス関数が使用するstatic変数
@ -143,6 +156,20 @@ static inline void THW_GetCameraInfo( u8 *pDst )
}
// カメラ情報へのポインタの取得
static inline const u8 *THW_GetCameraInfoPtr( void )
{
return (const u8 *)GetHWN()->camera;
}
// 言語ビットマップ値の取得
static inline u32 THW_GetValidLanguageBitmap( void )
{
return GetHWS()->validLanguageBitmap;
}
// リージョンの取得。
static inline u8 THW_GetRegion( void )
{
@ -151,9 +178,16 @@ static inline u8 THW_GetRegion( void )
// 本体シリアルNo.の取得
static inline void THW_GetSerialNo( TWLSerialNo *pDst )
static inline void THW_GetSerialNo( u8 *pDst )
{
MI_CpuCopy8( &GetHWS()->serialNo, pDst, sizeof(TWLSerialNo) );
MI_CpuCopy8( &GetHWS()->serialNo, pDst, TWL_HWINFO_SERIALNO_LEN_MAX );
}
// 本体シリアルNo.へのポインタの取得
static inline const u8 *THW_GetSerialNoPtr( void )
{
return (const u8 *)&GetHWS()->serialNo;
}
@ -169,12 +203,19 @@ static inline void THW_SetRTCAdjust( u8 adjust )
// カメラ情報のセット
static inline void THW_SetCameraInfo( u8 *pCamera )
static inline void THW_SetCameraInfo( const u8 *pCamera )
{
MI_CpuCopy8( pCamera, GetHWN()->camera, TWL_HWINFO_CAMERA_LEN );
}
// 言語ビットマップ値のセット
static inline void THW_SetValidLanguageBitmap( u32 langBitmap )
{
GetHWS()->validLanguageBitmap = langBitmap;
}
// リージョンのセット。
static inline void THW_SetRegion( u8 region )
{
@ -182,9 +223,9 @@ static inline void THW_SetRegion( u8 region )
}
// 本体シリアルNo.のセット
static inline void THW_SetSerialNo( TWLSerialNo *pSrc )
static inline void THW_SetSerialNo( const u8 *pSrc )
{
MI_CpuCopy8( pSrc, &GetHWS()->serialNo, sizeof(TWLSerialNo) );
MI_CpuCopy8( pSrc, &GetHWS()->serialNo, TWL_HWINFO_SERIALNO_LEN_MAX );
}

View File

@ -31,15 +31,24 @@ extern "C" {
// define data ------------------------------------
#define TWL_DEFAULT_REGION 0 // デフォルトのリージョン いる??
#define TWL_SETTINGS_DATA_VERSION 1 // TWL設定データフォーマットバージョン(開始No.:1)
#define TWL_NICKNAME_LENGTH NTR_NICKNAME_LENGTH // ニックネーム長
#define TWL_NICKNAME_BUFFERSIZE ( ( TWL_NICKNAME_LENGTH + 1 ) * 2 ) // ニックネームバッファサイズ
#define TWL_COMMENT_LENGTH NTR_COMMENT_LENGTH // コメント長
#define TWL_COMMENT_BUFFERSIZE ( ( TWL_COMMENT_LENGTH + 1 ) * 2 ) // コメントバッファサイズ
#define TWL_FAVORITE_COLOR_MAX_NUM NTR_FAVORITE_COLOR_MAX_NUM // 好きな色の最大数
#define TWL_BACKLIGHT_LEVEL_MAX 22 // TWLバックライト最大輝度レベル
#define TSD_TEMP_BUFFER_SIZE ( sizeof(TSDStore) * 2 ) // TSD_ReadTWLSettingsで必要なTempBufferサイズ
#define TWL_SETTINGS_FILE_LENGTH ( 16 * 1024 )
#define TWL_SETTINGS_DATA_VERSION 1 // TWL設定データフォーマットバージョン(開始No.:1)
// オーナー情報
#define TWL_NICKNAME_LENGTH NTR_NICKNAME_LENGTH // ニックネーム長
#define TWL_NICKNAME_BUFFERSIZE ( ( TWL_NICKNAME_LENGTH + 1 ) * 2 ) // ニックネームバッファサイズ
#define TWL_COMMENT_LENGTH NTR_COMMENT_LENGTH // コメント長
#define TWL_COMMENT_BUFFERSIZE ( ( TWL_COMMENT_LENGTH + 1 ) * 2 ) // コメントバッファサイズ
#define TWL_FAVORITE_COLOR_MAX_NUM NTR_FAVORITE_COLOR_MAX_NUM // 好きな色の最大数
// バックライト輝度
#define TWL_BACKLIGHT_LEVEL_MAX 22 // TWLバックライト最大輝度レベル
// ペアレンタルコントロール
#define TWL_PARENTAL_CONTROL_RATING_AGE_MAX 31
#define TWL_PARENTAL_CONTROL_PASSWORD_LENGTH 4 // 暗証番号の桁数
#define TWL_PARENTAL_CONTROL_PASSWORD_DEFAULT "0000" // デフォルト暗証番号
#define TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MIN 6 // 秘密の質問の回答、UTF-16で最小 MIN 文字
#define TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MAX 32 // 秘密の質問の回答、UTF-16で最大 MAX 文字
// インストール・ソフト数
#define TWL_FREE_SOFT_BOX_COUNT_MAX 35 // NANDアプリの最大空きBox数, これ - freeSoftBoxCountでインストールSoft数
// 言語コード
@ -59,80 +68,32 @@ typedef enum TWLLangCode{
TWL_LANG_CODE_MAX
}TWLLangCode;
#define TWL_LANG_CODE_MAX_WW TWL_LANG_SPANISH
// NTR 言語との対応マップ
#if 0
const u8 LangCodeMapFromTWLtoNTR[][ 2 ] = {
{ TWL_LANG_JAPANESE, NTR_LANG_JAPANESE },
{ TWL_LANG_ENGLISH, NTR_LANG_ENGLISH },
{ TWL_LANG_FRENCH, NTR_LANG_FRENCH },
{ TWL_LANG_GERMAN, NTR_LANG_GERMAN },
{ TWL_LANG_ITALIAN, NTR_LANG_ITALIAN },
{ TWL_LANG_SPANISH, NTR_LANG_SPANISH },
{ TWL_LANG_SIMP_CHINESE, NTR_LANG_CHINESE },
{ TWL_LANG_KOREAN, NTR_LANG_KOREAN },
// { TWL_LANG_DUTCH, NTR_LANG_ENGLISH },
// { TWL_LANG_TRAD_CHINESE, NTR_LANG_CHINESE }
};
#endif
#define TWL_LANG_BITMAP_JAPAN ( ( 0x0001 << TWL_LANG_JAPANESE ) ) // JPN版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AMERICA ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // AME版での対応言語ビットマップ
#define TWL_LANG_BITMAP_EUROPE ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_GERMAN ) | \
( 0x0001 << TWL_LANG_ITALIAN ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // EUR版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AUSTRALIA ( ( 0x0001 << TWL_LANG_ENGLISH ) ) // AUS版での対応言語ビットマップ
#define TWL_LANG_BITMAP_CHINA ( ( 0x0001 << TWL_LANG_SIMP_CHINESE ) ) // CHI版での対応言語ビットマップ
#define TWL_LANG_BITMAP_KOREA ( ( 0x0001 << TWL_LANG_KOREAN ) ) // KOR版での対応言語ビットマップ
// 日付
#define TWLDate NTRDate
// アラーム
#define TWLAlarm NTRAlarm
// TPキャリブレーションNTRとの違いは、予約領域あり
typedef struct TWLTPCalibData {
NTRTPCalibData data; // TPキャリブレーションデータ
u8 rsv[ 8 ];
}TWLTPCalibData;
// ニックネームNTRとの違いは、文字列に終端あり
typedef struct TWLNickname{
u16 buffer[ TWL_NICKNAME_LENGTH + 1 ]; // ニックネームUnicode(UTF16)で最大10文字、終端コードあり
u8 length; // 文字数
u8 rsv;
}TWLNickname; // 24byte
// コメントNTRとの違いは、文字列に終端あり
typedef struct TWLComment{
u16 buffer[ TWL_COMMENT_LENGTH + 1 ]; //コメントUnicode(UTF16)で最大26文字、終端コードあり
u8 length; // 文字数
u8 rsv;
}TWLComment; // 54byte
// オーナー情報
typedef struct TWLOwnerInfo{
u8 userColor : 4; // 好きな色
u8 rsv : 4; // 予約。
u8 pad; // パディング
TWLDate birthday; // 生年月日
u8 pad;
TWLNickname nickname; // ニックネーム
TWLComment comment; // コメント
u16 nickname[ TWL_NICKNAME_LENGTH + 1 ]; // ニックネーム(終端あり)
u16 comment[ TWL_COMMENT_LENGTH + 1 ]; // コメント(終端あり)
}TWLOwnerInfo; // 80byte
// ペアレンタルコントロール
#define TWL_PARENTAL_CONTROL_PASSWORD_LENGTH 4 // 暗証番号の桁数
#define TWL_PARENTAL_CONTROL_PASSWORD_DEFAULT "0000" // デフォルト暗証番号
#define TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MIN 6 // 秘密の質問の回答、UTF-16で最小 MIN 文字
#define TWL_PARENTAL_CONTROL_SECRET_ANSWER_LENGTH_MAX 32 // 秘密の質問の回答、UTF-16で最大 MAX 文字
// 審査団体
typedef enum TWLRatingOgn {
TWL_RATING_OGN_CERO = 0, // 日本
@ -147,10 +108,11 @@ typedef enum TWLRatingOgn {
TWL_RATING_OGN_MAX = 8
}TWLRatingOgn;
// データ
typedef struct TWLParentalControl {
TWLRatingOgn ogn; // 審査団体
// u8 flags; // Wiiでは、PARENTAL_CONTROL_USEフラグのみ --> isSetParentalControl があるので現状必要なし
u8 rating; // レーティング(年齢)値
u8 ratingAge; // レーティング(年齢)値
char password[ TWL_PARENTAL_CONTROL_PASSWORD_LENGTH + 1 ]; // 暗証番号、終端コードあり
u8 secretQuestion; // 秘密の質問文 ID
u8 rsv_A;
@ -160,18 +122,6 @@ typedef struct TWLParentalControl {
}TWLParentalControl;
// インストール・ソフト数
#define TWL_FREE_SOFT_BOX_COUNT_MAX 35 // NANDアプリの最大空きBox数, これ - freeSoftBoxCountでインストールSoft数
// TWL設定データヘッダ
typedef struct TWLSettingsHeader{
u8 version; // データver.
u8 saveCount; // セーブカウント数
u16 dataLength; // データ長
}TWLSettingsHeader;
// TWL設定データ基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLSettingsData{
struct flags {
@ -192,42 +142,40 @@ typedef struct TWLSettingsData{
u32 isAvailableBatteryExtension : 1; // バッテリエクステンションモードの有効化/無効化
u32 rsv : 19;
}flags;
u8 region;
TWLCountryCode country; // 国コード
u8 rsv2[ 3 ]; // 予約
u8 country; // 国コード
u8 language; // 言語(NTRとの違いは、データサイズ8bit)
u8 backLightBrightness; // バックライト輝度(NTRとの違いは、データサイズ8bit)
u8 freeSoftBoxCount; // インストール可能なNANDアプリ個数
u8 rtcLastSetYear; // RTCの前回設定年
s64 rtcOffset; // RTC設定時のオフセット値ユーザーがRTC設定を変更する度にその値に応じて増減します。
TWLOwnerInfo owner; // オーナー情報
TWLAlarm alarm; // アラーム
TWLTPCalibData tp; // タッチパネルキャリブレーションデータ
TWLParentalControl parental;
u8 freeSoftBoxCount; // インストール可能なNANDアプリ個数
}TWLSettingsData; // xxbyte
// TWL設定データ保存フォーマット
typedef struct TSDStore {
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト
TWLSettingsHeader header;
TWLSettingsData tsd;
}TSDStore;
#ifdef SDK_ARM9
//=========================================================
// グローバル変数
//=========================================================
extern TWLSettingsData *g_pTSD;
#define GetTSD() ( g_pTSD )
extern TWLSettingsData s_settings;
#define GetTSD() ( &s_settings )
//=========================================================
// NANDファイルへのリードライト関数
//=========================================================
extern BOOL TSD_IsReadSettings( void );
extern BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] ); // TSD_TEMP_BUFFER_SIZEのpTempBufferが必要。
extern BOOL TSD_WriteSettings( void ); // 先にNSD_ReadSettingsを実行しておく必要がある。
// 内部変数へのリード
extern BOOL TSD_ReadSettings( void );
// 内部変数の値のライト(先にリードしておく必要がある)
extern BOOL TSD_WriteSettings( void );
// 直接値を指定してのライト(開発用)
extern BOOL TSD_WriteSettingsDirect( const TWLSettingsData *pSrc );
// 内部変数の値のクリア
extern void TSD_ClearSettings( void );
//=========================================================
// データ取得TSD_ReadSettingsで内部ワークに読み出した情報の取得
@ -236,19 +184,49 @@ extern BOOL TSD_WriteSettings( void ); //
// 国コードの取得。
static inline TWLCountryCode TSD_GetCountry( void )
{
return GetTSD()->country;
return (TWLCountryCode)GetTSD()->country;
}
// リージョンの取得。
static inline u8 TSD_GetRegion( void )
// 言語コードの取得
static inline TWLLangCode TSD_GetLanguage( void )
{
return (u8)GetTSD()->region;
return (TWLLangCode)GetTSD()->language;
}
// バックライト輝度取得
static inline int TSD_GetBacklightBrightness( void )
{
return (int)GetTSD()->backLightBrightness;
}
// フリーソフトBOX数の取得
static inline u8 TSD_GetFreeSoftBoxCount( void )
{
return GetTSD()->freeSoftBoxCount;
}
// RTCの前回セットした年の取得
static inline u8 TSD_GetRTCLastSetYear( void )
{
return GetTSD()->rtcLastSetYear;
}
// RTCオフセット値の取得
static inline s64 TSD_GetRTCOffset( void )
{
return GetTSD()->rtcOffset;
}
// オーナー情報全体の取得。
static inline TWLOwnerInfo *TSD_GetOwnerInfo( void )
static inline void TSD_GetOwnerInfo( TWLOwnerInfo *pDst )
{
return &GetTSD()->owner;
MI_CpuCopy8( &GetTSD()->owner, pDst, sizeof(TWLOwnerInfo) );
}
// オーナー情報全体へのポインタの取得。
static inline const TWLOwnerInfo *TSD_GetOwnerInfoPtr( void )
{
return (const TWLOwnerInfo *)&GetTSD()->owner;
}
// 好きな色の取得。
@ -258,57 +236,63 @@ static inline u8 TSD_GetUserColor( void )
}
// 誕生日の取得。
static inline TWLDate *TSD_GetBirthday( void )
static inline void TSD_GetBirthday( TWLDate *pDst )
{
return &GetTSD()->owner.birthday;
MI_CpuCopy8( &GetTSD()->owner.birthday, pDst, sizeof(TWLDate) );
}
// 誕生日へのポインタの取得。
static inline const TWLDate *TSD_GetBirthdayPtr( void )
{
return (const TWLDate *)&GetTSD()->owner.birthday;
}
// ニックネームの取得。
static inline TWLNickname *TSD_GetNickname( void )
static inline void TSD_GetNickname( u16 *pDst )
{
return &GetTSD()->owner.nickname;
MI_CpuCopy16( GetTSD()->owner.nickname, pDst, TWL_NICKNAME_BUFFERSIZE );
}
// ニックネームへのポインタの取得。
static inline const u16 *TSD_GetNicknamePtr( void )
{
return (const u16 *)&GetTSD()->owner.nickname;
}
// コメントの取得。
static inline TWLComment *TSD_GetComment( void )
static inline void TSD_GetComment( u16 *pDst )
{
return &GetTSD()->owner.comment;
MI_CpuCopy16( GetTSD()->owner.comment, pDst, TWL_COMMENT_BUFFERSIZE );
}
// コメントへのポインタの取得。
static inline const u16 *TSD_GetCommentPtr( void )
{
return (const u16 *)&GetTSD()->owner.comment;
}
// アラーム情報の取得。
static inline TWLAlarm *TSD_GetAlarmData( void )
static inline void TSD_GetAlarmData( TWLAlarm *pAlarm )
{
return &GetTSD()->alarm;
MI_CpuCopy8( &GetTSD()->alarm, pAlarm, sizeof(TWLAlarm) );
}
// アラーム情報へのポインタの取得。
static inline const TWLAlarm *TSD_GetAlarmDataPtr( void )
{
return (const TWLAlarm *)&GetTSD()->alarm;
}
// タッチパネルキャリブレーションデータの取得。
static inline TWLTPCalibData *TSD_GetTPCalibration( void )
static inline void TSD_GetTPCalibration( TWLTPCalibData *pDst )
{
return &GetTSD()->tp;
MI_CpuCopy8( &GetTSD()->tp, pDst, sizeof(TWLTPCalibData) );
}
// 言語コードの取得
static inline TWLLangCode TSD_GetLanguage( void )
// タッチパネルキャリブレーションデータへのポインタの取得。
static inline const TWLTPCalibData *TSD_GetTPCalibrationPtr( void )
{
return (TWLLangCode)GetTSD()->language;
}
// RTCオフセット値の取得
static inline s64 TSD_GetRTCOffset( void )
{
return GetTSD()->rtcOffset;
}
// RTCの前回セットした年の取得
static inline u8 TSD_GetRTCLastSetYear( void )
{
return GetTSD()->rtcLastSetYear;
}
// バックライト輝度取得
static inline int TSD_GetBacklightBrightness( void )
{
return (int)GetTSD()->backLightBrightness;
return (const TWLTPCalibData *)&GetTSD()->tp;
}
// 初回起動シーケンス中?
@ -317,22 +301,10 @@ static inline BOOL TSD_IsInitialSequence( void )
return (BOOL)GetTSD()->flags.initialSequence;
}
// 誕生日入力済み?
static inline BOOL TSD_IsSetBirthday( void )
// 国コード入力済み?
static inline BOOL TSD_IsSetCountry( void )
{
return (BOOL)GetTSD()->flags.isSetBirthday;
}
// ユーザーカラー入力済み?
static inline BOOL TSD_IsSetUserColor( void )
{
return (BOOL)GetTSD()->flags.isSetUserColor;
}
// TPキャリブレーションデータ入力済み
static inline BOOL TSD_IsSetTP( void )
{
return (BOOL)GetTSD()->flags.isSetTP;
return (BOOL)GetTSD()->flags.isSetCountry;
}
// 言語コード入力済み?
@ -353,6 +325,24 @@ static inline BOOL TSD_IsSetNickname( void )
return (BOOL)GetTSD()->flags.isSetNickname;
}
// ユーザーカラー入力済み?
static inline BOOL TSD_IsSetUserColor( void )
{
return (BOOL)GetTSD()->flags.isSetUserColor;
}
// 誕生日入力済み?
static inline BOOL TSD_IsSetBirthday( void )
{
return (BOOL)GetTSD()->flags.isSetBirthday;
}
// TPキャリブレーションデータ入力済み
static inline BOOL TSD_IsSetTP( void )
{
return (BOOL)GetTSD()->flags.isSetTP;
}
// パレンタルコントロール入力済み?
static inline BOOL TSD_IsSetParentalControl( void )
{
@ -371,6 +361,18 @@ static inline BOOL TSD_IsGBUseTopLCD( void )
return (BOOL)GetTSD()->flags.isGBUseTopLCD;
}
// 無線使用可能?
static inline BOOL TSD_IsAvailableWireless( void )
{
return (BOOL)GetTSD()->flags.isAvailableWireless;
}
// バッテリエクステンションモード有効?
static inline BOOL TSD_IsAvailableBatteryExtension( void )
{
return (BOOL)GetTSD()->flags.isAvailableBatteryExtension;
}
//=========================================================
// データセットTSD_ReadSettingsで内部ワークに読み出した情報への値セット
@ -379,17 +381,41 @@ static inline BOOL TSD_IsGBUseTopLCD( void )
// 国コードのセット。
static inline void TSD_SetCountry( TWLCountryCode country )
{
GetTSD()->country = country;
GetTSD()->country = (u8)country;
}
// リージョンのセット。
static inline void TSD_SetRegion( u8 region )
// 言語コードのセット
static inline void TSD_SetLanguage( TWLLangCode language )
{
GetTSD()->region = region;
GetTSD()->language = language;
}
// バックライト輝度情報をセット。
static inline void TSD_SetBacklightBrightness( u8 backLightBrightness )
{
GetTSD()->backLightBrightness = backLightBrightness;
}
// フリーソフトBOX数のセット
static inline void TSD_SetFreeSoftBoxCount( u8 count )
{
GetTSD()->freeSoftBoxCount = count;
}
// RTCのLastSetYearへのセット
static inline void TSD_SetRTCLastSetYear( u8 rtcLastSetYear )
{
GetTSD()->rtcLastSetYear = rtcLastSetYear;
}
// RTCオフセット値のセット
static inline void TSD_SetRTCOffset( s64 rtcOffset )
{
GetTSD()->rtcOffset = rtcOffset;
}
// オーナー情報全体のセット。
static inline void TSD_SetOwnerInfo( TWLOwnerInfo *pOwner )
static inline void TSD_SetOwnerInfo( const TWLOwnerInfo *pOwner )
{
MI_CpuCopy16( pOwner, &GetTSD()->owner, sizeof(TWLOwnerInfo) );
}
@ -401,82 +427,45 @@ static inline void TSD_SetUserColor( u8 userColor )
}
// 誕生日のセット。
static inline void TSD_SetBirthday( TWLDate *pBirth )
static inline void TSD_SetBirthday( const TWLDate *pSrc )
{
GetTSD()->owner.birthday.month = pBirth->month;
GetTSD()->owner.birthday.day = pBirth->day;
MI_CpuCopy8( pSrc, &GetTSD()->owner.birthday, sizeof(TWLDate) );
}
// ニックネームのセット。
static inline void TSD_SetNickname( TWLNickname *pNickname )
static inline void TSD_SetNickname( const u16 *pSrc )
{
MI_CpuCopy16( pNickname, &GetTSD()->owner.nickname, sizeof(TWLNickname) );
MI_CpuCopy16( pSrc, GetTSD()->owner.nickname, TWL_NICKNAME_BUFFERSIZE );
}
// コメントのセット。
static inline void TSD_SetComment( TWLComment *pComment )
static inline void TSD_SetComment( const u16 *pSrc )
{
MI_CpuCopy16( pComment, &GetTSD()->owner.comment, sizeof(TWLComment) );
MI_CpuCopy16( pSrc, GetTSD()->owner.comment, TWL_COMMENT_BUFFERSIZE );
}
// アラーム情報のセット。
static inline void TSD_SetAlarmData( TWLAlarm *pAlarm )
static inline void TSD_SetAlarmData( const TWLAlarm *pAlarm )
{
MI_CpuCopy16( pAlarm, &GetTSD()->alarm, sizeof(TWLAlarm) );
}
// タッチパネルキャリブレーションデータのセット。
static inline void TSD_SetTPCalibration( TWLTPCalibData *pTPCalib )
static inline void TSD_SetTPCalibration( const TWLTPCalibData *pTPCalib )
{
MI_CpuCopy16( pTPCalib, &GetTSD()->tp, sizeof(TWLTPCalibData) );
}
// 言語コードのセット
static inline void TSD_SetLanguage( TWLLangCode language )
{
GetTSD()->language = language;
}
// RTCオフセット値のセット
static inline void TSD_SetRTCOffset( s64 rtcOffset )
{
GetTSD()->rtcOffset = rtcOffset;
}
// RTCのLastSetYearへのセット
static inline void TSD_SetRTCLastSetYear( u8 rtcLastSetYear )
{
GetTSD()->rtcLastSetYear = rtcLastSetYear;
}
// バックライト輝度情報をセット。
static inline void TSD_SetBacklightBrightness( u8 backLightBrightness )
{
GetTSD()->backLightBrightness = backLightBrightness;
}
// フラッシュ壊れシーケンス中かどうかのフラグセット。
// 初回起動シーケンス中かどうかのフラグセット。
static inline void TSD_SetFlagInitialSequence( BOOL initialSequence )
{
GetTSD()->flags.initialSequence = (u32)initialSequence;
}
// 誕生日データの入力済みフラグセット。
static inline void TSD_SetFlagBirthday( BOOL set )
// 国コードの入力済みフラグセット。
static inline void TSD_SetFlagCountry( BOOL set )
{
GetTSD()->flags.isSetBirthday = (u32)set;
}
// ユーザーカラーの入力済みフラグセット。
static inline void TSD_SetFlagUserColor( BOOL set )
{
GetTSD()->flags.isSetUserColor = (u32)set;
}
// TPキャリブレーションの入力済みフラグセット。
static inline void TSD_SetFlagTP( BOOL set )
{
GetTSD()->flags.isSetTP = (u32)set;
GetTSD()->flags.isSetCountry = (u32)set;
}
// 言語コードの入力済みフラグセット。
@ -497,6 +486,24 @@ static inline void TSD_SetFlagNickname( BOOL set )
GetTSD()->flags.isSetNickname = (u32)set;
}
// ユーザーカラーの入力済みフラグセット。
static inline void TSD_SetFlagUserColor( BOOL set )
{
GetTSD()->flags.isSetUserColor = (u32)set;
}
// 誕生日データの入力済みフラグセット。
static inline void TSD_SetFlagBirthday( BOOL set )
{
GetTSD()->flags.isSetBirthday = (u32)set;
}
// TPキャリブレーションの入力済みフラグセット。
static inline void TSD_SetFlagTP( BOOL set )
{
GetTSD()->flags.isSetTP = (u32)set;
}
// パレンタルコントロールの入力済みフラグセット。
static inline void TSD_SetFlagParentalControl( BOOL set )
{
@ -515,6 +522,18 @@ static inline void TSD_SetFlagGBUseTopLCD( BOOL set )
GetTSD()->flags.isGBUseTopLCD = (u32)set;
}
// 無線使用可否フラグをセット
static inline void TSD_SetFlagAvailableWireless( BOOL set )
{
GetTSD()->flags.isAvailableWireless = set;
}
// バッテリエクステンションモード有効/無効フラグをセット
static inline void TSD_SetFlagAvailableBatteryExtension( BOOL set )
{
GetTSD()->flags.isAvailableBatteryExtension = set;
}
#endif // SDK_ARM9

View File

@ -33,7 +33,6 @@ extern "C" {
#define TSF_VERSION_TERMINATOR 0xff // version終端
#define SAVE_COUNT_MAX 0x80 // saveCountの最大値
#define SAVE_COUNT_MASK 0x7f // saveCountの値の範囲をマスクする。(0x00-0x7f
#define DISABLE_SAVE_COUNT 0xff // saveCount無効
// TSFリード結果
typedef enum TSFReadResult {
@ -49,7 +48,7 @@ typedef struct TSFParam { // TSF ( TWL Store File )
u32 dataLength; // 保存するデータ長
u32 fileLength; // 保存するファイル長
const u8 *conpatibleVerList; // 過去ver.の互換ver.リスト。TSF_VERSION_TERMINATORで終端。
const void *pDefaultValue; // 保存するデータのデフォルト値
void (*pClearFunc)( void *pDst ); // 保存するデータの値クリア関数
BOOL (*pCheckDigestFunc)( void *pTgt, u32 len, u8 *pDigest ); // ダイジェストチェック関数へのポインタ
BOOL (*pCheckValueFunc)( void *pTgt ); // 値チェック関数へのポインタ
}TSFParam;
@ -77,9 +76,9 @@ typedef struct TSFHeader{
//=========================================================
// TSFフォーマットのファイルのリード
extern TSFReadResult TSF_ReadFile ( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pDstSaveCount );
// TSFフォーマットのファイルのライトsaveCountにDISABLE_SAVE_COUNTを与えた場合は、saveCountを"0"固定にします。)
extern BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 saveCount );
extern TSFReadResult TSF_ReadFile ( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pSaveCount );
// TSFフォーマットのファイルのライトpSaveCountにNULLを与えた場合は、saveCountを"0"固定にします。)
extern BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 *pSaveCount );
// TSFフォーマットのファイルのリカバリ
extern BOOL TSF_RecoveryFile( TSFReadResult err, char *pPath, u32 fileLength );

View File

@ -62,22 +62,25 @@ typedef struct Relocate_Info
// SYSM共有ワーク構造体
typedef struct SYSM_work {
Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報arm9,arm7それぞれltdとflxで最大4つ
vu16 isARM9Start :1; // ARM9スタートフラグ
vu16 isHotStart :1; // Hot/Coldスタート判定
vu16 isValidResetParam :1; // リセットパラメータ有効
vu16 isValidTSD :1; // NITRO設定データ無効フラグ
vu16 isLogoSkip :1; // ロゴデモスキップ
vu16 isOnDebugger :1; // デバッガ動作か?
vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu16 isCardStateChanged :1; // カード状態更新フラグ
vu16 isLoadSucceeded :1; // アプリロード完了?
vu16 isCardBoot :1; // カードブートか?
vu32 isARM9Start :1; // ARM9スタートフラグ
vu32 isHotStart :1; // Hot/Coldスタート判定
vu32 isValidResetParam :1; // リセットパラメータ有効
vu32 isValidTSD :1; // NITRO設定データ無効フラグ
vu32 isLogoSkip :1; // ロゴデモスキップ
vu32 isOnDebugger :1; // デバッガ動作か?
vu32 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu32 isCardStateChanged :1; // カード状態更新フラグ
vu32 isLoadSucceeded :1; // アプリロード完了?
vu32 isCardBoot :1; // カードブートか?
vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。
vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。
vu32 isResetRTC :1; // RTCリセット発生
#ifdef DEBUG_USED_CARD_SLOT_B_
vu16 isValidCardBanner :1;
vu16 is1stCardChecked :1;
vu16 rsv :4;
vu32 isValidCardBanner :1;
vu32 is1stCardChecked :1;
vu32 rsv :18;
#else
vu16 rsv :6;
vu32 rsv :20;
#endif
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側