From d1e6f438a470bca7a4186d20e75b70e9fa10faef Mon Sep 17 00:00:00 2001 From: yosiokat Date: Tue, 6 Nov 2007 08:18:12 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=83=BB?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E6=95=B4=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@104 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/buildtools/commondefs.sysmenu | 1 + build/libraries_sysmenu/Makefile | 2 +- .../libraries_sysmenu/settings/ARM9/Makefile | 50 ++ .../settings/ARM9/src/NTRSettings.c | 537 ++++++++++++++++++ .../settings/ARM9/src/TWLSettings.c | 297 ++++++++++ build/libraries_sysmenu/settings/Makefile | 33 ++ build/libraries_sysmenu/sysmenu/ARM9/Makefile | 2 +- .../sysmenu/ARM9/src/settingsAPI.c | 274 +++++++++ include/sysmenu.h | 2 +- .../sysmenu/{machineSettings.h => settings.h} | 6 +- .../common/NTRSettings.h} | 0 include/sysmenu/settings/common/TWLSettings.h | 478 ++++++++++++++++ .../sysmenu/sysmenu_lib/ARM9/sysmenu_api.h | 2 +- 13 files changed, 1677 insertions(+), 7 deletions(-) create mode 100644 build/libraries_sysmenu/settings/ARM9/Makefile create mode 100644 build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c create mode 100644 build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c create mode 100644 build/libraries_sysmenu/settings/Makefile create mode 100644 build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c rename include/sysmenu/{machineSettings.h => settings.h} (82%) rename include/sysmenu/{machineSettings/common/nitroSettings.h => settings/common/NTRSettings.h} (100%) create mode 100644 include/sysmenu/settings/common/TWLSettings.h diff --git a/build/buildtools/commondefs.sysmenu b/build/buildtools/commondefs.sysmenu index 64dd0dc9..ac341074 100644 --- a/build/buildtools/commondefs.sysmenu +++ b/build/buildtools/commondefs.sysmenu @@ -55,6 +55,7 @@ ifeq ($(CODEGEN_PROC),ARM9) SYSMENU_LIBS ?= \ libsysmenu$(TWL_LIBSUFFIX).a \ + libsettings$(TWL_LIBSUFFIX).a \ libmbloader$(TWL_LIBSUFFIX).a \ libacsign$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/Makefile b/build/libraries_sysmenu/Makefile index 28431155..e8ab200e 100644 --- a/build/libraries_sysmenu/Makefile +++ b/build/libraries_sysmenu/Makefile @@ -22,7 +22,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS = sysmenu mb_loader acsign +SUBDIRS = sysmenu settings mb_loader acsign #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/settings/ARM9/Makefile b/build/libraries_sysmenu/settings/ARM9/Makefile new file mode 100644 index 00000000..44d16e43 --- /dev/null +++ b/build/libraries_sysmenu/settings/ARM9/Makefile @@ -0,0 +1,50 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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:: 2007-10-03#$ +# $Rev: 1319 $ +# $Author: kitase_hirotake $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +MYSUBDIRS = ./ + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +#TWL_ARCHGEN = LIMITED +TWL_PROC = ARM9 + +SRCS = NTRSettings.c TWLSettings.c + +TARGET_LIB = libsettings$(TWL_LIBSUFFIX).a + +include $(TWLIPL_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +LINCLUDES = $(TWLSDK_ROOT)/build/libraries/spi/ARM9/include \ + +#---------------------------------------------------------------------------- + +do-build: $(MYSUBDIRS) $(TARGETS) + +include $(TWLIPL_ROOT)/build/buildtools/modulerules + + +$(MYSUBDIRS):: +# $(MAKE) -C $@ -f MakeCrt0 + +#===== End of Makefile ===== diff --git a/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c b/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c new file mode 100644 index 00000000..39296cf7 --- /dev/null +++ b/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c @@ -0,0 +1,537 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: NTRSettings.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 +#include +#include "spi.h" + +// define data---------------------------------------------------------- +#if 0 +#define DEBUG_Printf OS_TPrintf +#else +#define DEBUG_Printf(...) ((void)0) +#endif + +#define SAVE_COUNT_MAX 0x0080 // NTRSettingsData.saveCountの最大値 +#define SAVE_COUNT_MASK 0x007f // NTRSettingsData.saveCountの値の範囲をマスクする。(0x00-0x7f) +#define NSD_NOT_CORRECT 0x00ff // NTR設定データが読み出されていない or 有効なものがないことを示す。 +#define NVRAM_RETRY_NUM 8 // NVRAMリトライ回数 + +// NVRAMステータスレジスタ値 +#define SR_WIP 0x01 // 0:READY 1:ライト、イレース中 +#define SR_WEN 0x02 // 0:ライト禁止 1:ライト許可 +#define SR_EER 0x20 // 1:イレースエラー発生(SANYO製FLASHのみ) + +#define READ_IPL2_HEADER_ADDR 0x18 // IPL2ヘッダのうち、読み込みが必要な部分の先頭アドレス +#define READ_IPL2_HEADER_SIZE 0x0a // IPL2ヘッダのうち、読み込みが必要なサイズ +#define NSD_ROM_ADDR_SHIFT 3 + +// NVRAM関連送信コマンドステート +static enum NvramCommState{ + COMM_READY = 0, + COMM_RD, + COMM_WE, + COMM_WR, + COMM_RDSR_WE, + COMM_RDSR_WR, + COMM_SRST +}NvramCommState; + + +// IPL2ヘッダの一部(0x18からのデータ) +typedef struct IPL2HeaderPart { + struct { + u8 timestamp[5]; // NTR-IPL2タイムスタンプ [0]:分,[1]:時,[2]:日,[3]:月,[4]:年 + u8 ipl2_type; // NTR-IPL2タイプ + u8 rsv[2]; + } version; + + u16 nsd_rom_addr; + + u8 pad[ 0x16 ]; // ※キャッシュラインに合わせるためのパディング。本来は必要なし。 +} IPL2HeaderPart; // 0x20bytes + + +// function's prototype------------------------------------------------- +u32 NSD_GetNSDRomAddr( void ); // NTRSettingデータのNVRAM格納アドレスを取得 +u8 NSD_GetIPL2Type( void ); // NTR-IPL2タイプを取得 +const u8 *NSD_GetIPL2Timestamp( void ); // NTR-IPL2のタイムスタンプを取得 + +static void NSDi_ReadIPL2Header( void ); +static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ); +static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStore, u8 region ); +static BOOL NVRAMm_ExecuteCommand( int nvState, u32 addr, u16 size, u8 *pSrc ); +static void Callback_NVRAM( PXIFifoTag tag, u32 data, BOOL err ); + +// static variables----------------------------------------------------- +static NSDStoreEx s_NSDStoreEx ATTRIBUTE_ALIGN(32); +static IPL2HeaderPart s_IPL2Header ATTRIBUTE_ALIGN(32); +static BOOL s_isReadIPL2H = FALSE; +static volatile BOOL s_nvCbOccurred; +static volatile u16 s_nvResult; +static int s_indexNSD = NSD_NOT_CORRECT; + +#ifndef SDK_FINALROM +static NSDStoreEx (*s_pNSDStoreExArray)[2]; +#endif +// global variables----------------------------------------------------- +NTRSettingsData *g_pNSD = &s_NSDStoreEx.nsd; +NTRSettingsDataEx *g_pNSDEx = &s_NSDStoreEx.nsd_ex; + +// const data----------------------------------------------------------- +static const u16 s_validLangBitmapList[] = { + NTR_LANG_BITMAP_WW, + NTR_LANG_BITMAP_CHINA, + NTR_LANG_BITMAP_KOREA, +}; + + +// function's description----------------------------------------------- + +//---------------------------------------------------------------------- +// IPL2ヘッダ情報の読み出し +//---------------------------------------------------------------------- +// コンポーネント上での使用時 + +// IPL2ヘッダの読み出し +static void NSDi_ReadIPL2Header( void ) +{ + if( !s_isReadIPL2H ) { + OS_TPrintf( "IPL2Header:%x\n", sizeof(IPL2HeaderPart) ); + DC_InvalidateRange( &s_IPL2Header, sizeof(IPL2HeaderPart) ); + while( !NVRAMm_ExecuteCommand( COMM_RD, READ_IPL2_HEADER_ADDR, READ_IPL2_HEADER_SIZE, (u8 *)&s_IPL2Header ) ) {} + s_isReadIPL2H = TRUE; + } +} + +// IPL2タイプの取得 +u8 NSD_GetIPL2Type( void ) +{ + NSDi_ReadIPL2Header(); + return s_IPL2Header.version.ipl2_type; +} + +// IPL2タイムスタンプの取得 +const u8 *NSD_GetIPL2Timestamp( void ) +{ + NSDi_ReadIPL2Header(); + return s_IPL2Header.version.timestamp; +} + +// NSD格納ROMアドレスの取得 +u32 NSD_GetNSDRomAddr( void ) +{ + NSDi_ReadIPL2Header(); + return (u32)( s_IPL2Header.nsd_rom_addr << NSD_ROM_ADDR_SHIFT ); +} + +//---------------------------------------------------------------------- +// NTR設定データのリード +//---------------------------------------------------------------------- + +// NTR設定データリード済み +BOOL NSD_IsReadSettings( void ) +{ + return ( s_indexNSD != NSD_NOT_CORRECT ); +} + + +BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ) +{ + NSDStoreEx *pNSDStoreEx = (NSDStoreEx *)pTempBuffer; +#ifndef SDK_FINALROM + s_pNSDStoreExArray = pTempBuffer; + OS_TPrintf( "NSDStoreBuff : %08x %08x\n", &(*s_pNSDStoreExArray)[ 0 ], &(*s_pNSDStoreExArray)[ 1 ] ); +#endif + + DC_InvalidateRange( pNSDStoreEx, sizeof(NSDStoreEx) * 2 ); + + // フラッシュからニ重化されているNTR設定データを読み出す。 + while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr(), sizeof(NSDStoreEx), (u8 *)&pNSDStoreEx[ 0 ] ) ) {} + while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr() + SPI_NVRAM_PAGE_SIZE, sizeof(NSDStoreEx), (u8 *)&pNSDStoreEx[ 1 ] ) ) {} + OS_TPrintf("NSD read addr=%08x\n", NSD_GetNSDRomAddr() ); + + // 読み出したデータのどちらが有効かを判定する。 + if( NSDi_CheckCorrectNSD( pTempBuffer, region ) ) { + // 有効なNTR設定データを静的バッファに転送 + MI_CpuCopyFast( (void *)&pNSDStoreEx[ s_indexNSD ], (void *)&s_NSDStoreEx, sizeof(NSDStoreEx) ); + }else { + // 有効なデータがないなら、バッファをクリアする + OS_TPrintf( "NSD clear.\n" ); + NSD_ClearSettings(); + return FALSE; + } + + OS_TPrintf("Use NSD[%d] : saveCount = %d\n", s_indexNSD, s_NSDStoreEx.saveCount); + + return TRUE; +} + + +//---------------------------------------------------------------------- +// NTR設定データのライト +//---------------------------------------------------------------------- +BOOL NSD_WriteSettings( u8 region ) +{ + int retry; + u32 nvramAddr; + + // まだNTR設定データがリードされていなければ、リードを行って必要な情報を取得する。 + if( !NSD_IsReadSettings() ) { + OS_TPrintf( "ERROR: Need call NSD_ReadSetting.\n" ); + return FALSE; + } + + // NSD のCRC、セーブカウント値、ライトアドレスの算出。 + s_NSDStoreEx.nsd.version = NTR_SETTINGS_DATA_VERSION; // バージョンを現在のものに設定。 + s_NSDStoreEx.crc16 = SVC_GetCRC16( 0xffff, (const void *)&s_NSDStoreEx.nsd, sizeof(NTRSettingsData) ); + s_NSDStoreEx.saveCount = (u8)( ( s_NSDStoreEx.saveCount + 1 ) & SAVE_COUNT_MASK ); + + // NSD_EXのCRC算出。 + s_NSDStoreEx.nsd_ex.version = NTR_SETTINGS_DATA_EX_VERSION; // バージョンを現在のものに設定。 + s_NSDStoreEx.nsd_ex.valid_language_bitmap = s_validLangBitmapList[ region & 0x03 ]; // ※WW,中,韓の3つのみにとりあえず対応 + s_NSDStoreEx.crc16_ex = SVC_GetCRC16( 0xffff, (const void *)&s_NSDStoreEx.nsd_ex, sizeof(NTRSettingsDataEx) ); + + // NTR設定データのライト + DC_FlushRange( &s_NSDStoreEx, sizeof(NSDStoreEx) ); + retry = NVRAM_RETRY_NUM; + while( retry-- ) { + s_indexNSD ^= 0x01; // リトライの度に書き込みアドレスを切り替える。 + nvramAddr = NSD_GetNSDRomAddr() + s_indexNSD * SPI_NVRAM_PAGE_SIZE; + OS_TPrintf("NSD write addr=%08x\n", nvramAddr ); + + if( NVRAMm_ExecuteCommand( COMM_WE, nvramAddr, sizeof(NSDStoreEx), (u8 *)&s_NSDStoreEx ) ) { + OS_TPrintf("NVRAM Write succeeded.\n"); + break; + } + SVC_WaitByLoop( 0x4000 ); + OS_TPrintf("NVRAM Write retry = %d.\n", NVRAM_RETRY_NUM - retry ); + } + return TRUE; +} + + +//---------------------------------------------------------------------- +// ミラーリングされているNTR設定データのどちらが有効かを判定 +//---------------------------------------------------------------------- + +static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ) +{ + NSDStoreEx *pNSDStoreEx = (NSDStoreEx *)pNSDStoreExArray; + u16 i; + u16 nsd_valid = 0; + + // 各ミラーデータのCRC & saveCount正当性チェック + for( i = 0; i < 2; i++ ) { + u16 crc; + BOOL isInvalid = FALSE; + + // NSD のCRCチェックを行う。 + crc = SVC_GetCRC16( 0xffff, (const void *)&pNSDStoreEx[i].nsd, sizeof(NTRSettingsData) ); + + if( ( pNSDStoreEx[ i ].crc16 != crc ) // CRCが正しく、saveCount値が0x80以下で、かつバージョンが一致するデータを正当と判断。 + || ( pNSDStoreEx[ i ].nsd.version != NTR_SETTINGS_DATA_VERSION ) + || ( pNSDStoreEx[ i ].saveCount >= SAVE_COUNT_MAX ) ) { + OS_TPrintf("NSD crc error.\n"); + isInvalid = TRUE; + } + + // NSDEx のCRCチェックを行う。 + crc = SVC_GetCRC16( 0xffff, (const void *)&pNSDStoreEx[i].nsd_ex, sizeof(NTRSettingsDataEx) ); + + if( ( pNSDStoreEx[ i ].crc16_ex != crc ) + || ( pNSDStoreEx[ i ].nsd_ex.version != NTR_SETTINGS_DATA_EX_VERSION ) ) { + OS_TPrintf("NSDEx crc error.\n"); + isInvalid = TRUE; + } + + // NSD, NSDExのCRCが正しいなら、データの中身をチェック。 + if( !isInvalid ) { + if( NSDi_CheckDataValue( &pNSDStoreEx[ i ], region ) ) { // データがおかしい値でないかもチェック。 + nsd_valid |= 0x01 << i; // "有効"フラグをセット + s_indexNSD = i; // NCDのインデックスも切り替え。 + }else { + isInvalid = TRUE; + } + } + + if( nsd_valid & ( 0x01 << i ) ) { + OS_TPrintf("NSD[%d] valid : saveCount = %d\n", i, pNSDStoreEx[i].saveCount); + }else { + OS_TPrintf("NSD[%d] invalid.\n", i); + } + } + + + if( nsd_valid == 0 ) { + s_indexNSD = 1; // 最初のWrite時に"0"になるように"1"にしておく + return FALSE; + }else if( nsd_valid == 0x03 ) { + // ミラーリングされたNSDが両方ともに正当な場合、セーブカウント値が大きい方を有効とする。 + u16 saveCount = (u8)( ( pNSDStoreEx[ 0 ].saveCount + 1 ) & SAVE_COUNT_MASK ); + s_indexNSD = ( saveCount == pNSDStoreEx[ 1 ].saveCount ) ? (u16)1 : (u16)0; + } + return TRUE; +} + + +// NTR設定データの値が正しい値かチェック。 // FALSE:正しくない。TRUE:正しい。 +static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStoreEx, u8 region ) +{ + NTRSettingsData *pNSD = &pNSDStoreEx->nsd; + NTRSettingsDataEx *pNSDEx = &pNSDStoreEx->nsd_ex; + u16 validLangBitmap = s_validLangBitmapList[ region & 0x03 ]; // ※WW,中,韓の3つのみにとりあえず対応 + + //pNSD->option; + // NSDのlanguageチェック( NSD側のlanguageは、日・英・独・仏・伊・西の6言語のうちの、対応言語のみの値となる。) + if( ~( NTR_LANG_BITMAP_WW & validLangBitmap ) & ( 0x0001 << pNSD->option.language ) ) { + OS_TPrintf("NSD: invalid language : org:%02d ex:%02d bitmap:%04x\n", + pNSD->option.language, pNSDEx->language, pNSDEx->valid_language_bitmap ); + return FALSE; + } + + // NSDExのlanguageチェック(こちらには、中・韓も入る) + if( ( ~validLangBitmap & ( 0x0001 << pNSDEx->language ) ) || + ( pNSDEx->valid_language_bitmap != validLangBitmap ) ) { + OS_TPrintf("NSDEx: invalid language : org:%02d ex:%02d bitmap:%04x\n", + pNSD->option.language, pNSDEx->language, pNSDEx->valid_language_bitmap ); + return FALSE; + } + + //pNSD->owner; + // favoriteColorは4bitなので範囲外はない。 + + // birthday + if( pNSD->option.isSetBirthday ) { + if( ( pNSD->owner.birthday.month > 12 ) || ( pNSD->owner.birthday.day > 31 ) ) { + OS_TPrintf("NSD: invalid birthday : %02d/%02d\n", pNSD->owner.birthday.month, pNSD->owner.birthday.day ); + return FALSE; + } + } + + // nickname + if( pNSD->option.isSetNickname ) { + if( pNSD->owner.nickname.length > NTR_NICKNAME_LENGTH ) { + OS_TPrintf("NSD: invalid nickname length : %02d\n", pNSD->owner.nickname.length ); + return FALSE; + } + } + + // comment + if( pNSD->owner.comment.length > NTR_COMMENT_LENGTH ) { + OS_TPrintf("NSD: invalid comment length : %02d\n", pNSD->owner.comment.length ); + return FALSE; + } + + //pNSD->alarm; + if( ( pNSD->alarm.hour > 23 ) || ( pNSD->alarm.minute > 59 ) ) { + OS_TPrintf("NSD: invalid alarm time : %02d:%02d\n", pNSD->alarm.hour, pNSD->alarm.minute ); + return FALSE; + } + + //pNSD->tp; + // TPキャリブレーション値は、TP_CalcCalibrateParamで値のチェックをしているので、チェックしない。 + +// OS_TPrintf( "NSD: correct data.\n" ); + return TRUE; +} + + +// NTR設定データのクリア +void NSD_ClearSettings( void ) +{ + NSDStoreEx *pNSDStoreEx = &s_NSDStoreEx; + + s_indexNSD = 1; // ライト前に反転されるので、"0"側が選択されるように"1"にしておく + + MI_CpuClear16( pNSDStoreEx, sizeof(NSDStoreEx) ); + // 初期値が0以外のもの + pNSDStoreEx->nsd.version = NTR_SETTINGS_DATA_VERSION; + pNSDStoreEx->nsd_ex.version = NTR_SETTINGS_DATA_EX_VERSION; + pNSDStoreEx->nsd.owner.birthday.month = 1; + pNSDStoreEx->nsd.owner.birthday.day = 1; + OS_TPrintf( "NSDStoreEx cleared.\n" ); +} + + +// NTR設定データのニックネーム・色・誕生日の初期化。 +void NSD_ClearOwnerInfo( void ) +{ + MI_CpuClear16( &GetNSD()->owner, sizeof(NTROwnerInfo) ); + GetNSD()->owner.birthday.month = 1; + GetNSD()->owner.birthday.day = 1; + GetNSD()->option.isSetBirthday = 0; + GetNSD()->option.isSetUserColor = 0; + GetNSD()->option.isSetNickname = 0; +} + + +//---------------------------------------------------------------------- +// NVRAMへのアクセスルーチン本体 ( nvState <- COMM_RD or COMM_WE ) +//---------------------------------------------------------------------- +static BOOL NVRAMm_ExecuteCommand( int nvState, u32 addr, u16 size, u8 *pSrc ) +{ + static u8 sr_buf[ 32 ] ATTRIBUTE_ALIGN(32); + OSTick start; + BOOL isSending = FALSE; + u8 *pSR = (u8 *)sr_buf; + + PXI_SetFifoRecvCallback( PXI_FIFO_TAG_NVRAM , Callback_NVRAM ); + + while( 1 ) { + //--------------------------------------- + // NVRAMコマンドを発行する + //--------------------------------------- + if( !isSending ) { + + s_nvCbOccurred = FALSE; + + switch( nvState ) { + case COMM_RD: + isSending = SPI_NvramReadDataBytes( addr, size, pSrc ); + break; + + case COMM_WE: + isSending = SPI_NvramWriteEnable(); + break; + + case COMM_WR: + isSending = SPI_NvramPageWrite( addr, size , pSrc ); + start = OS_GetTick(); + break; + + case COMM_RDSR_WE: + case COMM_RDSR_WR: + isSending = SPI_NvramReadStatusRegister( pSR ); + break; + + case COMM_SRST: + isSending = SPI_NvramSoftwareReset(); + break; + } + //--------------------------------------- + // コマンド実行結果(コールバック発生)を待って結果を処理する + //--------------------------------------- + }else { // isSending == TRUE + if( s_nvCbOccurred == TRUE ) { // コールバック発生を待つ。 + + isSending = FALSE; + + if( s_nvResult == SPI_PXI_RESULT_SUCCESS ) { + switch( nvState ) { + case COMM_RD: + return TRUE; + + case COMM_WE: + nvState = COMM_RDSR_WE; + break; + + case COMM_WR: + nvState = COMM_RDSR_WR; + break; + + case COMM_RDSR_WE: + case COMM_RDSR_WR: + + DC_InvalidateRange( pSR, 1 ); + + if( nvState == COMM_RDSR_WE ) { // ライトイネーブル確認ステートなら + if( ( *pSR & SR_WEN ) ) { + nvState = COMM_WR; + }else { + OS_TPrintf("NVRAM ERR: Write Enable Invalid.\n"); + return FALSE; + } + }else { + if( ( *pSR & SR_WIP ) == 0 ) { // ライト/イレース終了 + return TRUE; + }else { + if( ( *pSR & SR_EER ) // SR_EERが立っていたらエラー + || ( OS_TicksToMilliSeconds( OS_GetTick() - start ) > 4000 ) ) { + // コマンド発行から4秒経過したらエラー(※保険) + DEBUG_Printf( "NVRAM SR : %02x\n", *pSR ); + nvState = COMM_SRST; + }else { + SVC_WaitByLoop( 0x4000 ); + } + } + } + break; + + case COMM_SRST: + OS_TPrintf("NVRAM ERR: PageErase Timeout and SoftReset.\n"); + return FALSE; + } + }else { // s_nvResult != SPI_PXI_RESULT_SUCCESS + OS_TPrintf("NVRAM ERR: NVRAM PXI command failed.\n"); + return FALSE; + } + } + } + } +} + + +//---------------------------------------------------------------------- +// コールバック +//---------------------------------------------------------------------- +static void Callback_NVRAM( PXIFifoTag tag, u32 data, BOOL err ) +{ + #pragma unused(tag) + + u16 command = (u16)( ( ( data & SPI_PXI_DATA_MASK ) & 0x7f00 ) >> 8 ); + + s_nvResult = (u16)( data & 0x00ff ); + s_nvCbOccurred = TRUE; // コールバック発生フラグTRUE + + if( err ) { + OS_TPrintf("NVRAM-ARM9: Received PXI data is error.\n"); + s_nvResult = 0x00ff; + } + + switch(command){ // コマンド名表示 + case SPI_PXI_COMMAND_NVRAM_READ: + DEBUG_Printf("NVRAM-ARM9:ReadDataBytes"); + break; + case SPI_PXI_COMMAND_NVRAM_WREN: + DEBUG_Printf("NVRAM-ARM9:WriteEnable"); + break; + case SPI_PXI_COMMAND_NVRAM_PW: + DEBUG_Printf("NVRAM-ARM9:PageWrite"); + break; + case SPI_PXI_COMMAND_NVRAM_RDSR: + DEBUG_Printf("NVRAM-ARM9:ReadStatusRegister"); + break; + case SPI_PXI_COMMAND_NVRAM_WRDI: + DEBUG_Printf("NVRAM-ARM9:WriteDisable"); + break; + case SPI_PXI_COMMAND_NVRAM_PE: + DEBUG_Printf("NVRAM-ARM9:PageErase"); + break; + case SPI_PXI_COMMAND_NVRAM_SR: + DEBUG_Printf("NVRAM-ARM9:SoftwareReset"); + break; + default: + DEBUG_Printf("NVRAM-ARM9:?????"); + break; + } + if( s_nvResult != SPI_PXI_RESULT_SUCCESS ) { + OS_TPrintf(" Error! ->%x", s_nvResult ); + } + DEBUG_Printf("\n"); +} + diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c new file mode 100644 index 00000000..cdac3819 --- /dev/null +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c @@ -0,0 +1,297 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: TWLSettings.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 +#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_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 variables----------------------------------------------------- +static TSDStore s_TSDStore ATTRIBUTE_ALIGN(32); +static int s_indexTSD = TSD_NOT_CORRECT; + +#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 ] = { + (const char *)"nand:/shared1/TWLCFG0.dat", + (const char *)"nand:/shared1/TWLCFG1.dat", +}; + +static const u16 s_validLangBitmapList[] = { + TWL_LANG_BITMAP_WW, + TWL_LANG_BITMAP_CHINA, + TWL_LANG_BITMAP_KOREA, +}; + +// function's description----------------------------------------------- + +// TWL設定データのライト +BOOL TSD_WriteSettings( void ) +{ + return TSDi_WriteSettingsDirect( &s_TSDStore ); +} + + +static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore ) +{ + FSFile file; + + if( !TSD_IsReadSettings() ) { + OS_TPrintf( "ERROR: Need call TSD_ReadSetting.\n" ); + return FALSE; + } + s_indexTSD ^= 0x01; + pTSDStore->tsd.saveCount = (u8)( ( pTSDStore->tsd.saveCount + 1 ) & SAVE_COUNT_MASK ); + + // 対応言語ビットマップの設定 + pTSDStore->tsd.valid_language_bitmap = s_validLangBitmapList[ pTSDStore->tsd.region ]; + + // ダイジェスト算出 + SVC_CalcSHA1( pTSDStore->digest, &pTSDStore->tsd, sizeof(TWLSettingsData) ); + + FS_InitFile( &file ); + + OS_TPrintf( "Write TSD > %s : 0x%02x\n", s_TSDPath[ s_indexTSD ], pTSDStore->tsd.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" ); + return FALSE; + } + + // TSDStoreのライト + if( FS_WriteFile( &file, pTSDStore, sizeof(TSDStore) ) < sizeof(TSDStore) ) { + OS_TPrintf( " TSD[%d] : file read error.\n" ); + return FALSE; + } + + FS_CloseFile( &file ); + + return TRUE; +} + + +// TWL設定データ読み出し済み? +BOOL TSD_IsReadSettings( void ) +{ + 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; + +#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; + } + + // データのダイジェストチェック + SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, sizeof(TWLSettingsData) ); + 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 ].tsd.saveCount ); + }else { + OS_TPrintf("TSD[%d] invalid\n", i ); + } + } + + // 静的バッファに有効なTSDをコピー + if( enableTSDFlag ) { + // どちらのTSDを使用するか判定 + if( enableTSDFlag == 0x03 ) { + s_indexTSD = ( ( ( pTSDStore[ 0 ].tsd.saveCount + 1 ) & SAVE_COUNT_MASK ) == + pTSDStore[ 1 ].tsd.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 ].tsd.saveCount ); + + return retval; +} + + +// 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" ); + 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" ); + 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" ); + 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" ); + 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->version = TWL_SETTINGS_DATA_VERSION; + pTSD->region = TWL_DEFAULT_REGION; // リージョンは本体設定からなくなる予定 + pTSD->owner.birthday.month = 1; + pTSD->owner.birthday.day = 1; +} + diff --git a/build/libraries_sysmenu/settings/Makefile b/build/libraries_sysmenu/settings/Makefile new file mode 100644 index 00000000..52c5a13b --- /dev/null +++ b/build/libraries_sysmenu/settings/Makefile @@ -0,0 +1,33 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# 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:: 2007-10-03#$ +# $Rev: 1319 $ +# $Author: kitase_hirotake $ +#---------------------------------------------------------------------------- + +TARGET_FIRM = SYSTEMMENU + +include $(TWLIPL_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM9 + +#---------------------------------------------------------------------------- + +include $(TWLIPL_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index 7fafe336..04112f31 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -27,7 +27,7 @@ TARGET_PLATFORM = TWL TWL_PROC = ARM9 SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c gameBoot.c ninLogoFunc.c cmn.c \ - nitroSettingsEx.c TWLSettings.c settingsAPI.c + settingsAPI.c TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c new file mode 100644 index 00000000..c6efe675 --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c @@ -0,0 +1,274 @@ +/*---------------------------------------------------------------------------* + 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 +#include + +// define data---------------------------------------------------------- + +// function's prototype------------------------------------------------- +static BOOL SYSMi_VerifyNTRSettings( void ); +static BOOL VerifyData( void *pTgt1, void *pTgt2, u32 size ); +static void SYSMi_ConvertTWL2NTRSettings( void ); + +// global variables----------------------------------------------------- + +// static variables----------------------------------------------------- + +// const data----------------------------------------------------------- + +static const u16 s_validLangBitmapList[] = { + NTR_LANG_BITMAP_WW, + NTR_LANG_BITMAP_CHINA, + NTR_LANG_BITMAP_KOREA, +}; + +// function's description----------------------------------------------- + +// TWL設定データファイルのリード +BOOL SYSM_ReadTWLSettingsFile( void ) +{ + BOOL retval; + { + TSDStore (*pTempBuffer)[2] = SYSM_Alloc( TSD_TEMP_BUFFER_SIZE ); + if( pTempBuffer == NULL ) { + OS_TPrintf( "%s : malloc failed.\n", __FUNCTION__ ); + return FALSE; + } + MI_CpuFill32( pTempBuffer, 0xffffffff, TSD_TEMP_BUFFER_SIZE ); + retval = TSD_ReadSettings( pTempBuffer ); + SYSM_Free( pTempBuffer ); + } + if( !NSD_IsReadSettings() ) { + NSDStoreEx (*pTempBuffer)[2] = SYSM_Alloc( NSD_TEMP_BUFFER_SIZE ); + if( pTempBuffer == NULL ) { + OS_TPrintf( "%s : malloc failed.\n", __FUNCTION__ ); + return FALSE; + } + MI_CpuFill32( pTempBuffer, 0xffffffff, NSD_TEMP_BUFFER_SIZE ); + retval = NSD_ReadSettings( TSD_GetRegion(), pTempBuffer ); + SYSM_Free( pTempBuffer ); +#ifndef SDK_FINALROM + (void)SYSMi_VerifyNTRSettings(); +#endif + } + return retval; +} + + +// TWL設定データファイルへのライト +BOOL SYSM_WriteTWLSettingsFile( void ) +{ + BOOL retval; + retval = TSD_WriteSettings(); + if( retval ) { // ライト成功なら、TSDをNSDに変換して、NVRAMにも書き込み + SYSMi_ConvertTWL2NTRSettings(); + NSD_WriteSettings( TSD_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( TSD_GetRegion(), pTempBuffer ) || + !SYSMi_VerifyNTRSettings() + ) { + // ロード or ベリファイ失敗なら、TWL設定データからNTR設定データを生成して、書き込み + SYSMi_ConvertTWL2NTRSettings(); + NSD_WriteSettings( TSD_GetRegion() ); + } + SYSM_Free( pTempBuffer ); +} + + +// NTR設定とTWL設定をベリファイ +static 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_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_GetAlarmData(), TSD_GetAlarmData(), sizeof(NTRAlarm) ) || + // TP情報 + !VerifyData( NSD_GetTPCalibration(), &TSD_GetTPCalibration()->data, 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) ) ); + + 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のリージョンによって、ちょっと特殊な処理が必要なもの + 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 ) { + isFailed = TRUE; + } + }else { + // TSD側が標準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( void *pTgt1, void *pTgt2, u32 size ) +{ + u8 *p1 = (u8 *)pTgt1; + u8 *p2 = (u8 *)pTgt2; + + while( size-- ) { + if( *p1++ != *p2++ ) { + return FALSE; + } + } + return TRUE; +} + + +// TWL設定データ -> NTR設定データのコンバート +static 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() ); + 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; + // アラーム + MI_CpuCopy16( TSD_GetAlarmData(), NSD_GetAlarmData(), sizeof(NTRAlarm) ); + // TPキャリブレーション + MI_CpuCopy16( &TSD_GetTPCalibration()->data, NSD_GetTPCalibration(), sizeof(NTRTPCalibData) ); + + // オプション + // "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() < TWL_LANG_CODE_MAX_WW ) { + // TSD側が標準6言語の時、TSD側 == NSD側 + NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() ); + }else { + // TSD側が標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る) + NSD_SetLanguage( NTR_LANG_ENGLISH ); + } + + // 値が何でも問題ないもの + // ※※※※ TWL側のバックライト輝度レベルが4段階でない時は、変換が必要。※※※※ + NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() ); +} + diff --git a/include/sysmenu.h b/include/sysmenu.h index 80dbc8f5..a9fe2f06 100644 --- a/include/sysmenu.h +++ b/include/sysmenu.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include diff --git a/include/sysmenu/machineSettings.h b/include/sysmenu/settings.h similarity index 82% rename from include/sysmenu/machineSettings.h rename to include/sysmenu/settings.h index e9e425e1..58b91abe 100644 --- a/include/sysmenu/machineSettings.h +++ b/include/sysmenu/settings.h @@ -1,6 +1,6 @@ /*---------------------------------------------------------------------------* Project: TwlIPL - File: machineSettings.h + File: settings.h Copyright 2007 Nintendo. All rights reserved. @@ -18,8 +18,8 @@ #ifndef SYSM_MACHINE_SETTINGS_H_ #define SYSM_MACHINE_SETTINGS_H_ -#include -#include +#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/sysmenu/machineSettings/common/nitroSettings.h b/include/sysmenu/settings/common/NTRSettings.h similarity index 100% rename from include/sysmenu/machineSettings/common/nitroSettings.h rename to include/sysmenu/settings/common/NTRSettings.h diff --git a/include/sysmenu/settings/common/TWLSettings.h b/include/sysmenu/settings/common/TWLSettings.h new file mode 100644 index 00000000..bbf2b12d --- /dev/null +++ b/include/sysmenu/settings/common/TWLSettings.h @@ -0,0 +1,478 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: TWLSettings.h + + 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$ + *---------------------------------------------------------------------------*/ + + +#ifndef TWL_SETTINGS_H_ +#define TWL_SETTINGS_H_ +#if defined(SDK_CW) // TWLSettingsDataにビットフィールドを使っているので、コンパイラ依存で不具合が発生する可能性がある。 + // よって、CW以外のコンパイラの場合は、このヘッダを無効にしてエラーを出させるようにして再確認する。 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +// 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 TSD_TEMP_BUFFER_SIZE ( sizeof(TSDStore) * 2 ) // TSD_ReadTWLSettingsで必要なTempBufferサイズ + +// 言語コード +typedef enum TWLLangCode{ + TWL_LANG_JAPANESE = 0, // 日本語 + TWL_LANG_ENGLISH = 1, // 英語 + TWL_LANG_FRENCH = 2, // フランス語 + TWL_LANG_GERMAN = 3, // ドイツ語 + TWL_LANG_ITALIAN = 4, // イタリア語 + TWL_LANG_SPANISH = 5, // スペイン語 + TWL_LANG_CHINESE = 6, // 中国語 + TWL_LANG_KOREAN = 7, // 韓国語 + TWL_LANG_CODE_MAX +}TWLLangCode; + +#define TWL_LANG_CODE_MAX_WW NTR_LANG_CODE_MAX_WW // TWL_LANG_SPANISH + 1 + +#define TWL_LANG_BITMAP_WW NTR_LANG_BITMAP_WW // SystemMenu-WW版での対応言語ビットマップ +#define TWL_LANG_BITMAP_CHINA NTR_LANG_BITMAP_CHINA // SystemMenu-WW版での対応言語ビットマップ +#define TWL_LANG_BITMAP_KOREA NTR_LANG_BITMAP_KOREA // SystemMenu-WW版での対応言語ビットマップ + + +// リージョンコード(まだ適当) +typedef enum TWLRegionCode { + TWL_REGION_WW = 0, + TWL_REGION_CHINA = 1, + TWL_REGION_KOREA = 2, + TWL_REGION_MAX = 3 +}TWLRegion; + + +// 日付 +#define TWLDate NTRDate + +// アラーム +#define TWLAlarm NTRAlarm + +// TPキャリブレーション(NTRとの違いは、予約領域あり) +typedef struct TWLTPCalibData { + NTRTPCalibData data; + 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; // 予約。 + TWLDate birthday; // 生年月日 + u8 pad; + TWLNickname nickname; // ニックネーム + TWLComment comment; // コメント +}TWLOwnerInfo; // 80byte + + +typedef struct TWLParentalControl { + u8 rsv[ 16 ]; +}TWLParentalControl; + + +// TWL設定データ +typedef struct TWLSettingsData{ + u8 version; + u8 saveCount; + u8 rsv[ 2 ]; + struct flags { + u32 initialSequence : 1; + u32 isSetCountry : 1; + u32 isSetLanguage : 1; + u32 isSetDateTime : 1; + u32 isSetNickname : 1; + u32 isSetUserColor : 1; + u32 isSetBirthday : 1; + u32 isSetTP : 1; + u32 isSetParentalControl : 1; + u32 isAgreeEURA : 1; + // WiFi設定は別データなので、ここに設定済みフラグは用意しない。 + u32 isGBUseTopLCD : 1; + u32 rsv : 22; + }flags; + u16 valid_language_bitmap; // 対応言語ビットマップ(※ここじゃなく、"/sys/HWINFO.dat"内の方が良さそう) + u8 country; // 国コード + u8 region; // リージョン(※ここじゃなく、"/sys/HWINFO.dat"内の方が良さそう) + u8 language; // 言語(NTRとの違いは、データサイズ8bit) + u8 backLightBrightness; // バックライト輝度(NTRとの違いは、データサイズ8bit) + u8 rtcLastSetYear; // RTCの前回設定年 + s64 rtcOffset; // RTC設定時のオフセット値(ユーザーがRTC設定を変更する度にその値に応じて増減します。) + TWLOwnerInfo owner; // オーナー情報 + TWLAlarm alarm; // アラーム + TWLTPCalibData tp; // タッチパネルキャリブレーションデータ + TWLParentalControl parental; +}TWLSettingsData; // xxbyte + + +// TWL設定データ保存フォーマット +typedef struct TSDStore { + u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト + TWLSettingsData tsd; +}TSDStore; + + + +#ifdef SDK_ARM9 + +//========================================================= +// グローバル変数 +//========================================================= +extern TWLSettingsData *g_pTSD; +#define GetTSD() ( g_pTSD ) + +//========================================================= +// 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を実行しておく必要がある。 + +//========================================================= +// データ取得(TSD_ReadSettingsで内部ワークに読み出した情報の取得) +//========================================================= + +// バージョンの取得。 +static inline u8 TSD_GetVerion( void ) +{ + return (u8)GetTSD()->version; +} + +// リージョンの取得。 +static inline u8 TSD_GetRegion( void ) +{ + return (u8)GetTSD()->region; +} + +// オーナー情報全体の取得。 +static inline TWLOwnerInfo *TSD_GetOwnerInfo( void ) +{ + return &GetTSD()->owner; +} + +// 好きな色の取得。 +static inline u8 TSD_GetUserColor( void ) +{ + return (u8)GetTSD()->owner.userColor; +} + +// 誕生日の取得。 +static inline TWLDate *TSD_GetBirthday( void ) +{ + return &GetTSD()->owner.birthday; +} + +// ニックネームの取得。 +static inline TWLNickname *TSD_GetNickname( void ) +{ + return &GetTSD()->owner.nickname; +} + +// コメントの取得。 +static inline TWLComment *TSD_GetComment( void ) +{ + return &GetTSD()->owner.comment; +} + +// アラーム情報の取得。 +static inline TWLAlarm *TSD_GetAlarmData( void ) +{ + return &GetTSD()->alarm; +} + +// タッチパネルキャリブレーションデータの取得。 +static inline TWLTPCalibData *TSD_GetTPCalibration( void ) +{ + return &GetTSD()->tp; +} + +// 言語コードの取得 +static inline TWLLangCode TSD_GetLanguage( void ) +{ + return (TWLLangCode)GetTSD()->language; +} + +// 対応言語ビットマップの取得 +static inline u16 TSD_GetLanguageBitmap( void ) +{ + return GetTSD()->valid_language_bitmap; +} + +// 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; +} + +// 初回起動シーケンス中? +static inline BOOL TSD_IsInitialSequence( void ) +{ + return (BOOL)GetTSD()->flags.initialSequence; +} + +// 誕生日入力済み? +static inline BOOL TSD_IsSetBirthday( 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; +} + +// 言語コード入力済み? +static inline BOOL TSD_IsSetLanguage( void ) +{ + return (BOOL)GetTSD()->flags.isSetLanguage; +} + +// 日付・時刻データ入力済み? +static inline BOOL TSD_IsSetDateTime( void ) +{ + return (BOOL)GetTSD()->flags.isSetDateTime; +} + +// ニックネーム入力済み? +static inline BOOL TSD_IsSetNickname( void ) +{ + return (BOOL)GetTSD()->flags.isSetNickname; +} + +// パレンタルコントロール入力済み? +static inline BOOL TSD_IsSetParentalControl( void ) +{ + return (BOOL)GetTSD()->flags.isSetParentalControl; +} + +// EURAビューア同意済み? +static inline BOOL TSD_IsAgreeEURA( void ) +{ + return (BOOL)GetTSD()->flags.isAgreeEURA; +} + +// GBアプリなど1画面ソフトが使うのは上画面? +static inline BOOL TSD_IsGBUseTopLCD( void ) +{ + return (BOOL)GetTSD()->flags.isGBUseTopLCD; +} + + +//========================================================= +// データセット(TSD_ReadSettingsで内部ワークに読み出した情報への値セット) +//========================================================= + +// バージョンのセット。 +static inline void TSD_SetVerion( u8 version ) +{ + GetTSD()->version = version; +} + +// リージョンのセット。 +static inline void TSD_SetRegion( u8 region ) +{ + GetTSD()->region = region; +} + +// オーナー情報全体のセット。 +static inline void TSD_SetOwnerInfo( TWLOwnerInfo *pOwner ) +{ + MI_CpuCopy16( pOwner, &GetTSD()->owner, sizeof(TWLOwnerInfo) ); +} + +// ユーザーカラーのセット。 +static inline void TSD_SetUserColor( u8 userColor ) +{ + GetTSD()->owner.userColor = userColor; +} + +// 誕生日のセット。 +static inline void TSD_SetBirthday( TWLDate *pBirth ) +{ + GetTSD()->owner.birthday.month = pBirth->month; + GetTSD()->owner.birthday.day = pBirth->day; +} + +// ニックネームのセット。 +static inline void TSD_SetNickname( TWLNickname *pNickname ) +{ + MI_CpuCopy16( pNickname, &GetTSD()->owner.nickname, sizeof(TWLNickname) ); +} + +// コメントのセット。 +static inline void TSD_SetComment( TWLComment *pComment ) +{ + MI_CpuCopy16( pComment, &GetTSD()->owner.comment, sizeof(TWLComment) ); +} + +// アラーム情報のセット。 +static inline void TSD_SetAlarmData( TWLAlarm *pAlarm ) +{ + MI_CpuCopy16( pAlarm, &GetTSD()->alarm, sizeof(TWLAlarm) ); +} + +// タッチパネルキャリブレーションデータのセット。 +static inline void TSD_SetTPCalibration( TWLTPCalibData *pTPCalib ) +{ + MI_CpuCopy16( pTPCalib, &GetTSD()->tp, sizeof(TWLTPCalibData) ); +} + +// 言語コードのセット +static inline void TSD_SetLanguage( TWLLangCode language ) +{ + GetTSD()->language = language; +} + +// 対応言語ビットマップのセット +static inline void TSD_SetLanguageBitmap( u16 valid_language_bitmap ) +{ + GetTSD()->valid_language_bitmap = valid_language_bitmap; +} + +// 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 ) +{ + 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; +} + +// 言語コードの入力済みフラグセット。 +static inline void TSD_SetFlagLanguage( BOOL set ) +{ + GetTSD()->flags.isSetLanguage = (u32)set; +} + +// 日付・時刻の入力済みフラグセット。 +static inline void TSD_SetFlagDateTime( BOOL set ) +{ + GetTSD()->flags.isSetDateTime = (u32)set; +} + +// ニックネームの入力済みフラグセット。 +static inline void TSD_SetFlagNickname( BOOL set ) +{ + GetTSD()->flags.isSetNickname = (u32)set; +} + +// パレンタルコントロールの入力済みフラグセット。 +static inline void TSD_SetFlagParentalControl( BOOL set ) +{ + GetTSD()->flags.isSetNickname = (u32)set; +} + +// EURAビューア同意済みフラグセット。 +static inline void TSD_SetFlagAgreeEURA( BOOL set ) +{ + GetTSD()->flags.isSetNickname = (u32)set; +} + +// GBアプリなど1画面ソフトが使う画面フラグをセット +static inline void TSD_SetFlagGBUseTopLCD( BOOL set ) +{ + GetTSD()->flags.isGBUseTopLCD = (u32)set; +} + + +#endif // SDK_ARM9 + + + +#ifdef __cplusplus +} +#endif + +#endif // SDK_CW +#endif // TWL_SETTINGS_H_ diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index 7d1495c6..6797a7d7 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -22,7 +22,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" {