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 有効なものがないことを示す。
|
#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 ];
|
||||||
|
// 対応言語ビットマップも本体設定データからなくなる予定
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 )
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user