mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
フォルダ・ファイル整理。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@104 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
d30ef9bd0b
commit
d1e6f438a4
@ -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
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
SUBDIRS = sysmenu mb_loader acsign
|
||||
SUBDIRS = sysmenu settings mb_loader acsign
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
50
build/libraries_sysmenu/settings/ARM9/Makefile
Normal file
50
build/libraries_sysmenu/settings/ARM9/Makefile
Normal 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 =====
|
||||
537
build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c
Normal file
537
build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c
Normal 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は、日・英・独・仏・伊・西の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");
|
||||
}
|
||||
|
||||
297
build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c
Normal file
297
build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c
Normal 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;
|
||||
}
|
||||
|
||||
33
build/libraries_sysmenu/settings/Makefile
Normal file
33
build/libraries_sysmenu/settings/Makefile
Normal 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 =====
|
||||
@ -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
|
||||
|
||||
|
||||
274
build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c
Normal file
274
build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c
Normal 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側が標準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() );
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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" {
|
||||
478
include/sysmenu/settings/common/TWLSettings.h
Normal file
478
include/sysmenu/settings/common/TWLSettings.h
Normal 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アプリなど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_
|
||||
@ -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" {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user