mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・HWNormalInfo, HWSecureInfo, TWLSettingsの3種類のファイルに分割。 ・上記3つのファイルフォーマットを共通のTSFフォーマットにする。 ・MachineSettingsで上記フォーマットに追随。 ・HWInfoWriterも上記フォーマットに追随。 ・Launcher ・OS_InitをSYSM_Init内に取り込んで、OS_SetMainArenaHiが有効になるようにする。 ・SYSM_ReadParametersの処理を整理する。 ・RTC補正値をセットするよう変更。 ・hyena.TWL ・RTCリセット検出を行うようにする。 ・SCFGレジスタ値をWRAMのシステム領域にコピーするよう変更。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@347 b08762b0-b915-fc4b-9d8c-17b2551a87ff
297 lines
9.7 KiB
C
297 lines
9.7 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlIPL
|
||
File: settingsAPI.c
|
||
|
||
Copyright 2007 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
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$
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <twl.h>
|
||
#include <sysmenu.h>
|
||
|
||
// define data----------------------------------------------------------
|
||
|
||
// function's prototype-------------------------------------------------
|
||
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-----------------------------------------------------------
|
||
#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;
|
||
// 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;
|
||
}
|
||
(void)NSD_ReadSettings( THW_GetRegion(), pTempBuffer );
|
||
SYSM_Free( pTempBuffer );
|
||
#ifndef SDK_FINALROM
|
||
(void)SYSMi_VerifyNTRSettings();
|
||
#endif
|
||
}
|
||
RETURN:
|
||
SYSM_SetValidTSD( retval );
|
||
return retval;
|
||
}
|
||
|
||
|
||
// TWL設定データファイルへのライト
|
||
BOOL SYSM_WriteTWLSettingsFile( void )
|
||
{
|
||
BOOL retval;
|
||
// TWL設定データのライト
|
||
retval = TSD_WriteSettings();
|
||
// ライト成功なら、NVRAMのNTR設定データに値を反映
|
||
if( retval ) {
|
||
SYSM_SetValidTSD( TRUE );
|
||
SYSMi_ConvertTWL2NTRSettings();
|
||
NSD_WriteSettings( THW_GetRegion() );
|
||
#ifndef SDK_FINALROM
|
||
(void)SYSM_VerifyAndRecoveryNTRSettings(); // ※デバッグ用 ベリファイして、NGならリカバリ
|
||
#endif
|
||
}
|
||
return retval;
|
||
}
|
||
|
||
|
||
// NTR設定とTWL設定をベリファイして、不一致があれば、NTR設定を更新
|
||
void SYSM_VerifyAndRecoveryNTRSettings( void )
|
||
{
|
||
BOOL isRecovery = FALSE;
|
||
NSDStoreEx (*pTempBuffer)[2] = SYSM_Alloc( NSD_TEMP_BUFFER_SIZE );
|
||
|
||
// NVRAMからNTR設定データをロードして、TWL設定データとベリファイ
|
||
if( pTempBuffer == NULL ) {
|
||
OS_Panic( "%s : malloc error.\n", __FUNCTION__ );
|
||
}
|
||
if( !NSD_ReadSettings( THW_GetRegion(), pTempBuffer ) ||
|
||
!SYSMi_VerifyNTRSettings()
|
||
) {
|
||
// ロード or ベリファイ失敗なら、TWL設定データからNTR設定データを生成して、書き込み
|
||
SYSMi_ConvertTWL2NTRSettings();
|
||
NSD_WriteSettings( THW_GetRegion() );
|
||
}
|
||
SYSM_Free( pTempBuffer );
|
||
}
|
||
|
||
|
||
// NTR設定とTWL設定をベリファイ
|
||
BOOL SYSMi_VerifyNTRSettings( void )
|
||
{
|
||
BOOL isFailed = FALSE;
|
||
// NTRAlarm zeroAlarm; // TWLでアラームをなくす場合は、ゼロ値アラームと比較させる。
|
||
// MI_CpuClear( &zeroAlarm, sizeof(NTRAlarm) );
|
||
|
||
// 値が一致する必要があるもの
|
||
if( // NTR設定データバージョン
|
||
( NSD_GetVersion() != NTR_SETTINGS_DATA_VERSION ) ||
|
||
( NSD_GetExVersion() != NTR_SETTINGS_DATA_EX_VERSION ) ||
|
||
// オーナー情報
|
||
( NSD_GetUserColor() != TSD_GetUserColor() ) ||
|
||
!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_GetAlarmDataPtr(), TSD_GetAlarmDataPtr(), sizeof(NTRAlarm) ) ||
|
||
// TP情報
|
||
!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_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;
|
||
}
|
||
|
||
// オプション
|
||
// "0"であるべきものチェック
|
||
if( (
|
||
NSD_IsGBUseTopLCD() |
|
||
NSD_IsAutoBoot() |
|
||
NSD_IsBacklightOff() |
|
||
NSD_IsInitialSequence() |
|
||
NSD_GetRTCLastSetYear() |
|
||
NSD_GetRTCClockAdjust()
|
||
) != 0 ) {
|
||
isFailed = TRUE;
|
||
}
|
||
|
||
// "1"であるべきものチェック"
|
||
if( ( NSD_IsSetBirthday() &
|
||
NSD_IsSetUserColor() &
|
||
NSD_IsSetTP() &
|
||
NSD_IsSetLanguage() &
|
||
NSD_IsSetDateTime() &
|
||
NSD_IsSetNickname()
|
||
) == 0 ) {
|
||
isFailed = TRUE;
|
||
}
|
||
|
||
// 値が一致する必要があるもの
|
||
if( ( NSD_GetRTCOffset() != TSD_GetRTCOffset() ) ||
|
||
( NSD_GetLanguageEx() != TSD_GetLanguage() )
|
||
// || ( NSD_GetLanguageBitmap() != TSD_GetLanguageBitmap() )
|
||
) {
|
||
isFailed = TRUE;
|
||
}
|
||
|
||
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
||
{
|
||
NTRLangCode language = ( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) ?
|
||
NSD_GetLanguage() : NSD_GetLanguageEx();
|
||
// NSD側は、各リージョンの対応言語ビットマップのものしか取りえない。
|
||
if( ( THW_GetValidLanguageBitmap() & ( 0x0001 << language ) ) == 0 ) {
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 値が何でも問題ないもの
|
||
// NSD_GetBacklightBrightness();
|
||
|
||
OS_TPrintf( "TSD & NSD verify %s.\n", isFailed ? "NG" : "OK" );
|
||
|
||
return !isFailed;
|
||
}
|
||
|
||
|
||
// 指定サイズのベリファイ
|
||
static BOOL VerifyData( const void *pTgt1, const void *pTgt2, u32 size )
|
||
{
|
||
u8 *p1 = (u8 *)pTgt1;
|
||
u8 *p2 = (u8 *)pTgt2;
|
||
|
||
while( size-- ) {
|
||
if( *p1++ != *p2++ ) {
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
// TWL設定データ -> NTR設定データのコンバート
|
||
void SYSMi_ConvertTWL2NTRSettings( void )
|
||
{
|
||
SVC_CpuClearFast( 0x0000, GetNSD(), sizeof(NTRSettingsData) );
|
||
SVC_CpuClearFast( 0x0000, GetNSDEx(), sizeof(NTRSettingsDataEx) );
|
||
|
||
// NTR設定データバージョン
|
||
NSD_SetVersion ( NTR_SETTINGS_DATA_VERSION );
|
||
NSD_SetExVersion( NTR_SETTINGS_DATA_EX_VERSION );
|
||
// オーナー情報
|
||
NSD_SetUserColor( TSD_GetUserColor() );
|
||
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() );
|
||
// アラーム
|
||
NSD_SetAlarmData( TSD_GetAlarmDataPtr() );
|
||
// TPキャリブレーション
|
||
NSD_SetTPCalibration( &TSD_GetTPCalibrationPtr()->data );
|
||
|
||
// オプション
|
||
// "0"であるべきもの
|
||
NSD_SetFlagGBUseTopLCD( FALSE );
|
||
NSD_SetFlagAutoBoot( FALSE );
|
||
NSD_SetFlagBacklightOff( FALSE );
|
||
NSD_SetFlagInitialSequence( FALSE );
|
||
NSD_SetRTCLastSetYear( 0 );
|
||
NSD_SetRTCClockAdjust( 0 );
|
||
|
||
// "1"であるべきもの
|
||
NSD_SetFlagBirthday( TRUE );
|
||
NSD_SetFlagUserColor( TRUE );
|
||
NSD_SetFlagTP( TRUE );
|
||
NSD_SetFlagLanguage( TRUE );
|
||
NSD_SetFlagDateTime( TRUE );
|
||
NSD_SetFlagNickname( TRUE );
|
||
|
||
// 値が一致する必要があるもの
|
||
NSD_SetRTCOffset( TSD_GetRTCOffset() );
|
||
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
|
||
// NSD_SetLanguageBitmap( TSD_GetLanguageBitmap() );
|
||
|
||
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
||
if( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) {
|
||
// TSD側がNTR標準6言語の時、TSD側 == NSD側
|
||
NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() );
|
||
}else {
|
||
// TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る)
|
||
NSD_SetLanguage( NTR_LANG_ENGLISH );
|
||
}
|
||
|
||
// 値が何でも問題ないもの
|
||
// ※※※※ TWL側のバックライト輝度レベルが4段階でない時は、変換が必要。※※※※
|
||
NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() );
|
||
}
|
||
|
||
|
||
// UTF16の文字列長のチェック
|
||
static u8 MY_StrLen( const u16 *pStr )
|
||
{
|
||
u8 len = 0;
|
||
while( *pStr++ ) {
|
||
++len;
|
||
if( len == 255 ) {
|
||
break;
|
||
}
|
||
}
|
||
return len;
|
||
}
|