フォルダ・ファイル整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@104 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-06 08:18:12 +00:00
parent d30ef9bd0b
commit d1e6f438a4
13 changed files with 1677 additions and 7 deletions

View File

@ -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

View File

@ -22,7 +22,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = sysmenu mb_loader acsign
SUBDIRS = sysmenu settings mb_loader acsign
#----------------------------------------------------------------------------

View File

@ -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 =====

View File

@ -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 <twl.h>
#include <sysmenu/settings/common/NTRSettings.h>
#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は、日・英・独・仏・伊・西の言語のうちの、対応言語のみの値となる。
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");
}

View File

@ -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 <twl.h>
#include <sysmenu/settings/common/NTRSettings.h>
#include <sysmenu/settings/common/TWLSettings.h>
// 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;
}

View File

@ -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 =====

View File

@ -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

View File

@ -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 <twl.h>
#include <sysmenu.h>
// 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側が標準言語の時、NSD側は、各リージョンの対応言語ビットマップのうち、標準言語のものしか取りえない。
u16 defaultLangBitmap = (u16)( s_validLangBitmapList[ TSD_GetRegion() & 0x03 ] & NTR_LANG_BITMAP_WW );
if( ( defaultLangBitmap & ( 0x0001 << NSD_GetLanguage() ) ) == 0 ) {
isFailed = TRUE;
}
}else {
// TSD側が標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
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側が標準言語の時、TSD側 == NSD側
NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() );
}else {
// TSD側が標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
NSD_SetLanguage( NTR_LANG_ENGLISH );
}
// 値が何でも問題ないもの
// ※※※※ TWL側のバックライト輝度レベルが段階でない時は、変換が必要。※※※※
NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() );
}

View File

@ -21,7 +21,7 @@
#include <sysmenu/rom_header.h>
#include <sysmenu/banner.h>
#include <sysmenu/machineSettings.h>
#include <sysmenu/settings.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/mmap.h>

View File

@ -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 <sysmenu/machineSettings/common/nitroSettings.h>
#include <sysmenu/machineSettings/common/TWLSettings.h>
#include <sysmenu/settings/common/NTRSettings.h>
#include <sysmenu/settings/common/TWLSettings.h>
#ifdef __cplusplus
extern "C" {

View File

@ -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 <twl.h>
#include <sysmenu/settings/common/NTRSettings.h>
#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アプリなど画面ソフトが使うのは上画面
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アプリなど画面ソフトが使う画面フラグをセット
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_

View File

@ -22,7 +22,7 @@
#include <sysmenu/rom_header.h>
#include <sysmenu/banner.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/machineSettings.h>
#include <sysmenu/settings.h>
#ifdef __cplusplus
extern "C" {