mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
TWL本体設定データのフォーマット変更。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@204 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
abb45dbaa7
commit
f30feddbf5
@ -28,6 +28,7 @@
|
||||
#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 );
|
||||
@ -58,6 +59,19 @@ static const u16 s_validLangBitmapList[] = {
|
||||
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-----------------------------------------------
|
||||
|
||||
// TWL設定データのライト
|
||||
@ -67,6 +81,7 @@ BOOL TSD_WriteSettings( void )
|
||||
}
|
||||
|
||||
|
||||
// TWL設定データのダイレクトライト
|
||||
static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
|
||||
{
|
||||
FSFile file;
|
||||
@ -76,17 +91,16 @@ static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
|
||||
return FALSE;
|
||||
}
|
||||
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->digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
|
||||
// ダイジェスト算出(自分のバージョンのデータサイズで算出)
|
||||
SVC_CalcSHA1( pTSDStore->header.digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
|
||||
|
||||
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モードで開くと、既存ファイルを残したまま更新。
|
||||
OS_TPrintf( " TSD[%d] : file open error.\n" );
|
||||
@ -125,6 +139,9 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
|
||||
u8 enableTSDFlag = 0;
|
||||
BOOL retval = FALSE;
|
||||
|
||||
// バージョン違いの場合を考慮して、先に全バッファをクリアしておく
|
||||
MI_CpuClearFast( pTempBuffer, sizeof(TWLSettingsData) * 2 );
|
||||
|
||||
#ifndef SDK_FINALROM
|
||||
s_pTSDStoreArray = pTempBuffer;
|
||||
OS_TPrintf( "TSDStoreBuff : %08x %08x\n", &(*s_pTSDStoreArray)[ 0 ], &(*s_pTSDStoreArray)[ 1 ] );
|
||||
@ -158,9 +175,17 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
|
||||
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) );
|
||||
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].digest ) ) {
|
||||
SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, pTSDStore[ i ].header.dataLength );
|
||||
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].header.digest ) ) {
|
||||
OS_TPrintf( "TSD[%d] : file digest error.\n", i );
|
||||
dataErrFlag |= 0x01 << i;
|
||||
goto NEXT;
|
||||
@ -178,7 +203,7 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
|
||||
// ファイルクローズ
|
||||
FS_CloseFile( &file );
|
||||
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 {
|
||||
OS_TPrintf("TSD[%d] invalid\n", i );
|
||||
}
|
||||
@ -188,8 +213,8 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
|
||||
if( enableTSDFlag ) {
|
||||
// どちらのTSDを使用するか判定
|
||||
if( enableTSDFlag == 0x03 ) {
|
||||
s_indexTSD = ( ( ( pTSDStore[ 0 ].tsd.saveCount + 1 ) & SAVE_COUNT_MASK ) ==
|
||||
pTSDStore[ 1 ].tsd.saveCount ) ? 1 : 0;
|
||||
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;
|
||||
@ -207,12 +232,33 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
|
||||
}
|
||||
|
||||
OS_TPrintf( "Use TSD[%d] : saveCount = %d\n",
|
||||
s_indexTSD, pTSDStore[ s_indexTSD ].tsd.saveCount );
|
||||
s_indexTSD, pTSDStore[ s_indexTSD ].header.saveCount );
|
||||
|
||||
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設定データファイルのリカバリ
|
||||
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) );
|
||||
// 初期値が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.day = 1;
|
||||
pTSD->valid_language_bitmap = s_validLangBitmapList[ pTSD->region ];
|
||||
// 対応言語ビットマップも本体設定データからなくなる予定
|
||||
}
|
||||
|
||||
|
||||
@ -561,6 +561,8 @@ void SYSM_SetBackLightBrightness( u8 brightness )
|
||||
}
|
||||
( void )PMi_WriteRegister( 0x20, (u16)brightness );
|
||||
TSD_SetBacklightBrightness( brightness );
|
||||
|
||||
// [TODO:] バックライト輝度は毎回セーブせずに、アプリ起動やリセット、電源OFF時に値が変わっていたらセーブするようにする。
|
||||
SYSM_WriteTWLSettingsFile();
|
||||
}
|
||||
|
||||
|
||||
@ -176,11 +176,17 @@ typedef struct TWLParentalControl {
|
||||
#define TWL_FREE_SOFT_BOX_COUNT_MAX 35 // NANDアプリの最大空きBox数, これ - freeSoftBoxCountでインストールSoft数
|
||||
|
||||
|
||||
// TWL設定データ
|
||||
typedef struct TWLSettingsData{
|
||||
// TWL設定データヘッダ
|
||||
typedef struct TWLSettingsHeader{
|
||||
u8 version;
|
||||
u8 saveCount;
|
||||
u8 rsv[ 2 ];
|
||||
u16 dataLength;
|
||||
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト CRC16で十分かもなあ。。。
|
||||
}TWLSettingsHeader;
|
||||
|
||||
|
||||
// TWL設定データ(基本、過去ver互換を考慮して、追加しかしない方針で。)
|
||||
typedef struct TWLSettingsData{
|
||||
struct flags {
|
||||
u32 initialSequence : 1;
|
||||
u32 isSetCountry : 1;
|
||||
@ -216,12 +222,11 @@ typedef struct TWLSettingsData{
|
||||
|
||||
// TWL設定データ保存フォーマット
|
||||
typedef struct TSDStore {
|
||||
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト
|
||||
TWLSettingsHeader header;
|
||||
TWLSettingsData tsd;
|
||||
}TSDStore;
|
||||
|
||||
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
|
||||
//=========================================================
|
||||
@ -241,12 +246,6 @@ extern BOOL TSD_WriteSettings( void ); //
|
||||
// データ取得(TSD_ReadSettingsで内部ワークに読み出した情報の取得)
|
||||
//=========================================================
|
||||
|
||||
// バージョンの取得。
|
||||
static inline u8 TSD_GetVerion( void )
|
||||
{
|
||||
return (u8)GetTSD()->version;
|
||||
}
|
||||
|
||||
// リージョンの取得。
|
||||
static inline u8 TSD_GetRegion( void )
|
||||
{
|
||||
@ -390,12 +389,6 @@ static inline BOOL TSD_IsGBUseTopLCD( void )
|
||||
// データセット(TSD_ReadSettingsで内部ワークに読み出した情報への値セット)
|
||||
//=========================================================
|
||||
|
||||
// バージョンのセット。
|
||||
static inline void TSD_SetVerion( u8 version )
|
||||
{
|
||||
GetTSD()->version = version;
|
||||
}
|
||||
|
||||
// リージョンのセット。
|
||||
static inline void TSD_SetRegion( u8 region )
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user