diff --git a/Makefile.full b/Makefile.full index 6c2db8c7..6f2854ae 100644 --- a/Makefile.full +++ b/Makefile.full @@ -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 diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c index e7b1edec..3695441d 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c @@ -16,25 +16,26 @@ *---------------------------------------------------------------------------*/ #include +#include #include // 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 ); -} - diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c index d9d48d9a..816ee339 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c @@ -18,31 +18,27 @@ #include #include #include +#include // 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; // リージョンは本体設定データからなくなる予定 -} - diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c index 32f863a8..90d68ec8 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c @@ -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: diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c index 48548f60..bd614bf8 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c @@ -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; +} diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index d6461969..3a60f395 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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(); } } diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile b/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile index d196db2a..891171e6 100644 --- a/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile @@ -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 #---------------------------------------------------------------------------- diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c index 67e20a4f..4917757c 100644 --- a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c @@ -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; diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index ac5b9bed..825ab5dd 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -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(); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/Makefile b/build/systemMenu_RED/MachineSettings/ARM9/Makefile index 8a12589c..e7e26a78 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/Makefile +++ b/build/systemMenu_RED/MachineSettings/ARM9/Makefile @@ -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 #---------------------------------------------------------------------------- diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h index a1c1f9a9..d9854c3a 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h @@ -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 ); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c index 1896930f..e4ef62d4 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c @@ -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, diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c index c99dd6b4..4957aaef 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -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(); } diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/selectCountry.c b/build/systemMenu_RED/MachineSettings/ARM9/src/selectCountry.c index 61f9a164..ab117cf9 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/selectCountry.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/selectCountry.c @@ -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 { diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c index 81b93bfb..6f678cfe 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c @@ -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 { diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/selectRegion.c b/build/systemMenu_RED/MachineSettings/ARM9/src/selectRegion.c index d3f97572..1c3f1e68 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/selectRegion.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/selectRegion.c @@ -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 ) { diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c index 4c10d8d4..9cd5bba5 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c @@ -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] = { }, }; + diff --git a/build/systemMenu_RED/misc/src/misc.c b/build/systemMenu_RED/misc/src/misc.c index bc932388..ba358cfd 100644 --- a/build/systemMenu_RED/misc/src/misc.c +++ b/build/systemMenu_RED/misc/src/misc.c @@ -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 ); } diff --git a/include/sysmenu/settings/common/NTRSettings.h b/include/sysmenu/settings/common/NTRSettings.h index e4423617..b240a033 100644 --- a/include/sysmenu/settings/common/NTRSettings.h +++ b/include/sysmenu/settings/common/NTRSettings.h @@ -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) ); } diff --git a/include/sysmenu/settings/common/TWLHWInfo.h b/include/sysmenu/settings/common/TWLHWInfo.h index d14b0cc0..eae49130 100644 --- a/include/sysmenu/settings/common/TWLHWInfo.h +++ b/include/sysmenu/settings/common/TWLHWInfo.h @@ -20,14 +20,14 @@ #define TWL_HW_INFO_H_ -#define HW_SECURE_INFO_WRITE_ENABLE_ // HWセキュア情報のライト許可コンパイルスイッチ +#define HW_SIGNATURE_ENABLE_ // HWセキュア情報の署名処理有効コンパイルスイッチ #include #include -#ifdef HW_SECURE_INFO_WRITE_ENABLE_ +#ifdef HW_SIGNATURE_ENABLE_ #include -#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 ); } diff --git a/include/sysmenu/settings/common/TWLSettings.h b/include/sysmenu/settings/common/TWLSettings.h index ca68470d..c397a19b 100644 --- a/include/sysmenu/settings/common/TWLSettings.h +++ b/include/sysmenu/settings/common/TWLSettings.h @@ -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 diff --git a/include/sysmenu/settings/common/TWLStoreFile.h b/include/sysmenu/settings/common/TWLStoreFile.h index 41b53738..9405dc55 100644 --- a/include/sysmenu/settings/common/TWLStoreFile.h +++ b/include/sysmenu/settings/common/TWLStoreFile.h @@ -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 ); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 4009c84b..27918985 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -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側でコピーして使用する側)