TWL本体設定データのフォーマット変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@204 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-16 09:56:20 +00:00
parent abb45dbaa7
commit f30feddbf5
3 changed files with 74 additions and 32 deletions

View File

@ -28,6 +28,7 @@
#define TSD_NOT_CORRECT 0x00ff // TSD設定データが読み出されていない or 有効なものがないことを示す。 #define TSD_NOT_CORRECT 0x00ff // TSD設定データが読み出されていない or 有効なものがないことを示す。
// function's prototype------------------------------------------------- // function's prototype-------------------------------------------------
static BOOL TSDi_CheckVersionCompatible( u8 tgtVersion );
static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore ); static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore );
static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag ); static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag );
static BOOL TSDi_CheckSettingsValue( TWLSettingsData *pTSD ); static BOOL TSDi_CheckSettingsValue( TWLSettingsData *pTSD );
@ -58,6 +59,19 @@ static const u16 s_validLangBitmapList[] = {
TWL_LANG_BITMAP_KOREA, TWL_LANG_BITMAP_KOREA,
}; };
// 各バージョンにおける過去バージョン互換リスト
static const u8 s_verCompatible_v0[] = { 0xff };
//static const u8 s_verCompatible_v1[] = { 0, 0xff };
//static const u8 s_verCompatible_v2[] = { 0, 1, 0xff };
// 過去バージョン互換リストまとめ
static const u8 *s_verCompatibleList[ TWL_SETTINGS_DATA_VERSION + 1 ] = {
s_verCompatible_v0,
// s_verCompatible_v1,
// s_verCompatible_v2,
};
// function's description----------------------------------------------- // function's description-----------------------------------------------
// TWL設定データのライト // TWL設定データのライト
@ -67,6 +81,7 @@ BOOL TSD_WriteSettings( void )
} }
// TWL設定データのダイレクトライト
static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore ) static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
{ {
FSFile file; FSFile file;
@ -76,17 +91,16 @@ static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
return FALSE; return FALSE;
} }
s_indexTSD ^= 0x01; s_indexTSD ^= 0x01;
pTSDStore->tsd.saveCount = (u8)( ( pTSDStore->tsd.saveCount + 1 ) & SAVE_COUNT_MASK ); pTSDStore->header.saveCount = (u8)( ( pTSDStore->header.saveCount + 1 ) & SAVE_COUNT_MASK );
pTSDStore->header.version = TWL_SETTINGS_DATA_VERSION;
pTSDStore->header.dataLength = sizeof(TWLSettingsData);
// 対応言語ビットマップの設定 // ダイジェスト算出(自分のバージョンのデータサイズで算出)
pTSDStore->tsd.valid_language_bitmap = s_validLangBitmapList[ pTSDStore->tsd.region ]; SVC_CalcSHA1( pTSDStore->header.digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
// ダイジェスト算出
SVC_CalcSHA1( pTSDStore->digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
FS_InitFile( &file ); FS_InitFile( &file );
OS_TPrintf( "Write TSD > %s : 0x%02x\n", s_TSDPath[ s_indexTSD ], pTSDStore->tsd.saveCount ); 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モードで開くと、既存ファイルを残したまま更新。 if( !FS_OpenFileEx( &file, s_TSDPath[ s_indexTSD ], FS_FILEMODE_R | FS_FILEMODE_W ) ) { // R|Wモードで開くと、既存ファイルを残したまま更新。
OS_TPrintf( " TSD[%d] : file open error.\n" ); OS_TPrintf( " TSD[%d] : file open error.\n" );
@ -125,6 +139,9 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
u8 enableTSDFlag = 0; u8 enableTSDFlag = 0;
BOOL retval = FALSE; BOOL retval = FALSE;
// バージョン違いの場合を考慮して、先に全バッファをクリアしておく
MI_CpuClearFast( pTempBuffer, sizeof(TWLSettingsData) * 2 );
#ifndef SDK_FINALROM #ifndef SDK_FINALROM
s_pTSDStoreArray = pTempBuffer; s_pTSDStoreArray = pTempBuffer;
OS_TPrintf( "TSDStoreBuff : %08x %08x\n", &(*s_pTSDStoreArray)[ 0 ], &(*s_pTSDStoreArray)[ 1 ] ); OS_TPrintf( "TSDStoreBuff : %08x %08x\n", &(*s_pTSDStoreArray)[ 0 ], &(*s_pTSDStoreArray)[ 1 ] );
@ -158,9 +175,17 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
goto NEXT; 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;
}
// データのダイジェストチェック // データのダイジェストチェック
SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, sizeof(TWLSettingsData) ); SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, pTSDStore[ i ].header.dataLength );
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].digest ) ) { if( !SVC_CompareSHA1( digest, pTSDStore[ i ].header.digest ) ) {
OS_TPrintf( "TSD[%d] : file digest error.\n", i ); OS_TPrintf( "TSD[%d] : file digest error.\n", i );
dataErrFlag |= 0x01 << i; dataErrFlag |= 0x01 << i;
goto NEXT; goto NEXT;
@ -178,7 +203,7 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
// ファイルクローズ // ファイルクローズ
FS_CloseFile( &file ); FS_CloseFile( &file );
if( enableTSDFlag & ( 0x01 << i ) ) { if( enableTSDFlag & ( 0x01 << i ) ) {
OS_TPrintf("TSD[%d] valid : saveCount = %d\n", i, pTSDStore[ i ].tsd.saveCount ); OS_TPrintf("TSD[%d] valid : saveCount = %d\n", i, pTSDStore[ i ].header.saveCount );
}else { }else {
OS_TPrintf("TSD[%d] invalid\n", i ); OS_TPrintf("TSD[%d] invalid\n", i );
} }
@ -188,8 +213,8 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
if( enableTSDFlag ) { if( enableTSDFlag ) {
// どちらのTSDを使用するか判定 // どちらのTSDを使用するか判定
if( enableTSDFlag == 0x03 ) { if( enableTSDFlag == 0x03 ) {
s_indexTSD = ( ( ( pTSDStore[ 0 ].tsd.saveCount + 1 ) & SAVE_COUNT_MASK ) == s_indexTSD = ( ( ( pTSDStore[ 0 ].header.saveCount + 1 ) & SAVE_COUNT_MASK ) ==
pTSDStore[ 1 ].tsd.saveCount ) ? 1 : 0; pTSDStore[ 1 ].header.saveCount ) ? 1 : 0;
} }
MI_CpuCopyFast( &pTSDStore[ s_indexTSD ], &s_TSDStore, sizeof(TSDStore) ); MI_CpuCopyFast( &pTSDStore[ s_indexTSD ], &s_TSDStore, sizeof(TSDStore) );
retval = TRUE; retval = TRUE;
@ -207,12 +232,33 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
} }
OS_TPrintf( "Use TSD[%d] : saveCount = %d\n", OS_TPrintf( "Use TSD[%d] : saveCount = %d\n",
s_indexTSD, pTSDStore[ s_indexTSD ].tsd.saveCount ); s_indexTSD, pTSDStore[ s_indexTSD ].header.saveCount );
return retval; return retval;
} }
// バージョン間の互換チェック
static BOOL TSDi_CheckVersionCompatible( u8 tgtVersion )
{
if( TWL_SETTINGS_DATA_VERSION < tgtVersion ) {
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 FALSE;
}
// TWL設定データファイルのリカバリ // TWL設定データファイルのリカバリ
static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag ) static int TSDi_RecoveryTSDFile( TSDStore *pTSDStoreOrg, u8 existErrFlag, u8 lengthErrFlag, u8 dataErrFlag )
{ {
@ -292,9 +338,10 @@ static void TSDi_ClearSettings( TWLSettingsData *pTSD )
{ {
MI_CpuClearFast( pTSD, sizeof(TWLSettingsData) ); MI_CpuClearFast( pTSD, sizeof(TWLSettingsData) );
// 初期値が0以外のもの // 初期値が0以外のもの
pTSD->version = TWL_SETTINGS_DATA_VERSION; pTSD->region = TWL_DEFAULT_REGION; // リージョンは本体設定データからなくなる予定
pTSD->region = TWL_DEFAULT_REGION; // リージョンは本体設定からなくなる予定
pTSD->owner.birthday.month = 1; pTSD->owner.birthday.month = 1;
pTSD->owner.birthday.day = 1; pTSD->owner.birthday.day = 1;
pTSD->valid_language_bitmap = s_validLangBitmapList[ pTSD->region ];
// 対応言語ビットマップも本体設定データからなくなる予定
} }

View File

@ -561,6 +561,8 @@ void SYSM_SetBackLightBrightness( u8 brightness )
} }
( void )PMi_WriteRegister( 0x20, (u16)brightness ); ( void )PMi_WriteRegister( 0x20, (u16)brightness );
TSD_SetBacklightBrightness( brightness ); TSD_SetBacklightBrightness( brightness );
// [TODO:] バックライト輝度は毎回セーブせずに、アプリ起動やリセット、電源OFF時に値が変わっていたらセーブするようにする。
SYSM_WriteTWLSettingsFile(); SYSM_WriteTWLSettingsFile();
} }

View File

@ -176,11 +176,17 @@ typedef struct TWLParentalControl {
#define TWL_FREE_SOFT_BOX_COUNT_MAX 35 // NANDアプリの最大空きBox数, これ - freeSoftBoxCountでインストールSoft数 #define TWL_FREE_SOFT_BOX_COUNT_MAX 35 // NANDアプリの最大空きBox数, これ - freeSoftBoxCountでインストールSoft数
// TWL設定データ // TWL設定データヘッダ
typedef struct TWLSettingsData{ typedef struct TWLSettingsHeader{
u8 version; u8 version;
u8 saveCount; u8 saveCount;
u8 rsv[ 2 ]; u16 dataLength;
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト  CRC16で十分かもなあ。。。
}TWLSettingsHeader;
// TWL設定データ基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLSettingsData{
struct flags { struct flags {
u32 initialSequence : 1; u32 initialSequence : 1;
u32 isSetCountry : 1; u32 isSetCountry : 1;
@ -216,12 +222,11 @@ typedef struct TWLSettingsData{
// TWL設定データ保存フォーマット // TWL設定データ保存フォーマット
typedef struct TSDStore { typedef struct TSDStore {
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト TWLSettingsHeader header;
TWLSettingsData tsd; TWLSettingsData tsd;
}TSDStore; }TSDStore;
#ifdef SDK_ARM9 #ifdef SDK_ARM9
//========================================================= //=========================================================
@ -241,12 +246,6 @@ extern BOOL TSD_WriteSettings( void ); //
// データ取得TSD_ReadSettingsで内部ワークに読み出した情報の取得 // データ取得TSD_ReadSettingsで内部ワークに読み出した情報の取得
//========================================================= //=========================================================
// バージョンの取得。
static inline u8 TSD_GetVerion( void )
{
return (u8)GetTSD()->version;
}
// リージョンの取得。 // リージョンの取得。
static inline u8 TSD_GetRegion( void ) static inline u8 TSD_GetRegion( void )
{ {
@ -390,12 +389,6 @@ static inline BOOL TSD_IsGBUseTopLCD( void )
// データセットTSD_ReadSettingsで内部ワークに読み出した情報への値セット // データセットTSD_ReadSettingsで内部ワークに読み出した情報への値セット
//========================================================= //=========================================================
// バージョンのセット。
static inline void TSD_SetVerion( u8 version )
{
GetTSD()->version = version;
}
// リージョンのセット。 // リージョンのセット。
static inline void TSD_SetRegion( u8 region ) static inline void TSD_SetRegion( u8 region )
{ {