mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・本体設定データの整理。
・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:
parent
7ed96f4434
commit
c2ee48afc8
@ -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
|
||||
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@ -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 { // もう1つも有効なら、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; // リージョンは本体設定データからなくなる予定
|
||||
}
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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側が標準6言語の時、NSD側は、各リージョンの対応言語ビットマップのうち、標準6言語のものしか取りえない。
|
||||
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側が標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る)
|
||||
if( NSD_GetLanguage() != NTR_LANG_ENGLISH ) {
|
||||
isFailed = TRUE;
|
||||
if( TSD_GetLanguage() >= NTR_LANG_CODE_MAX_WW ) {
|
||||
// TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る)
|
||||
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側が標準6言語の時、TSD側 == NSD側
|
||||
if( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) {
|
||||
// TSD側がNTR標準6言語の時、TSD側 == NSD側
|
||||
NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() );
|
||||
}else {
|
||||
// TSD側が標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る)
|
||||
// TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る)
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -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 );
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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, ®ionSel );
|
||||
|
||||
@ -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 ) {
|
||||
|
||||
@ -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] = {
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@ -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) );
|
||||
}
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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 );
|
||||
|
||||
|
||||
@ -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ヘッダCRC16(ARM9側でコピーして使用する側)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user