・TWL設定データおよびNTR設定データライブラリの実装。

・MachineSettingsでの設定がTWL/NTR設定データの両方に反映されるよう変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@103 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-06 07:56:02 +00:00
parent 1815111691
commit d30ef9bd0b
20 changed files with 1008 additions and 922 deletions

View File

@ -24,7 +24,7 @@ SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
#TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
INCDIR = include \

View File

@ -21,7 +21,7 @@ SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
#TWL_ARCHGEN = LIMITED
TWL_PROC = ARM7
#----------------------------------------------------------------------------

View File

@ -21,7 +21,7 @@ SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
#TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
#----------------------------------------------------------------------------

View File

@ -23,11 +23,11 @@ MYSUBDIRS = ./
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
#TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c gameBoot.c ninLogoFunc.c cmn.c \
nitroSettingsEx.c
nitroSettingsEx.c TWLSettings.c settingsAPI.c
TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a

View File

@ -20,14 +20,15 @@
#include "spi.h"
// define data----------------------------------------------------------
#if 0
#define DEBUG_Printf OS_TPrintf
#else
#define DEBUG_Printf(...) ((void)0)
#endif
#define NCD_EX_FORCE_ENABLE // このスイッチを定義すると、SYSMバージョンに関わらず強制的にNitroConfigDataExが有効になる。
// ※実機上では、このフラグのON,OFFに関係なく正常動作するが、アプリビルドをデバッガや他実機で動作させる際に、ここがONでないとダメ。
// 読み込まれていないNCDEXをリードして死亡してしまうので注意。
#define SAVE_COUNT_MAX 0x0080 // NitroConfigData.saveCountの最大値
#define SAVE_COUNT_MASK 0x007f // NitroConfigData.saveCountの値の範囲をマスクする。(0x00-0x7f
#define NCD_NOT_CORRECT 0x00ff // NITRO設定データが読み出されていない or 有効なものがないことを示す。
#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ステータスレジスタ値
@ -37,7 +38,7 @@
#define READ_IPL2_HEADER_ADDR 0x18 // IPL2ヘッダのうち、読み込みが必要な部分の先頭アドレス
#define READ_IPL2_HEADER_SIZE 0x0a // IPL2ヘッダのうち、読み込みが必要なサイズ
#define NCD_ROM_ADDR_SHIFT 3
#define NSD_ROM_ADDR_SHIFT 3
// NVRAM関連送信コマンドステート
static enum NvramCommState{
@ -54,38 +55,50 @@ static enum NvramCommState{
// IPL2ヘッダの一部0x18からのデータ)
typedef struct IPL2HeaderPart {
struct {
u8 timestamp[5]; // IPL2タイムスタンプ [0]:分,[1]:時,[2]:日,[3]:月,[4]:年
u8 ipl2_type; // IPL2タイプ(nitroConfigData.hで定義のIPL2_TYPE...
u8 timestamp[5]; // NTR-IPL2タイムスタンプ [0]:分,[1]:時,[2]:日,[3]:月,[4]:年
u8 ipl2_type; // NTR-IPL2タイプ
u8 rsv[2];
} version;
u16 ncd_rom_addr;
u16 nsd_rom_addr;
u8 pad[ 0x16 ]; // ※キャッシュラインに合わせるためのパディング。本来は必要なし。
u8 pad[ 0x16 ]; // ※キャッシュラインに合わせるためのパディング。本来は必要なし。
} IPL2HeaderPart; // 0x20bytes
// function's prototype-------------------------------------------------
static void NCD_ReadIPL2Header( void );
static int NVRAMm_checkCorrectNCD(NCDStoreEx *ncdsp);
static BOOL NCD_CheckDataValue( NCDStoreEx *ncdsp );
static BOOL NVRAMm_ExecuteCommand( int nv_state, u32 addr, u16 size, u8 *srcp );
static void Callback_NVRAM(PXIFifoTag tag, u32 data, BOOL err);
u32 NSD_GetNSDRomAddr( void ); // NTRSettingデータのNVRAM格納アドレスを取得
u8 NSD_GetIPL2Type( void ); // NTR-IPL2タイプを取得
const u8 *NSD_GetIPL2Timestamp( void ); // NTR-IPL2のタイムスタンプを取得
// const data-----------------------------------------------------------
// global variables-----------------------------------------------------
NitroConfigDataEx ncdEx;
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 volatile BOOL nv_cb_occurred;
static volatile u16 nv_result;
static u16 ena_ncd_num = NCD_NOT_CORRECT;
static u16 next_saveCount;
static NCDStoreEx ncds[2] ATTRIBUTE_ALIGN(32);
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,
};
static IPL2HeaderPart ipl2Header ATTRIBUTE_ALIGN(32);
static BOOL read_ipl2h = FALSE;
// function's description-----------------------------------------------
@ -95,268 +108,287 @@ static BOOL read_ipl2h = FALSE;
// コンポーネント上での使用時
// IPL2ヘッダの読み出し
static void NCD_ReadIPL2Header( void )
static void NSDi_ReadIPL2Header( void )
{
if( !read_ipl2h ) {
if( !s_isReadIPL2H ) {
OS_TPrintf( "IPL2Header:%x\n", sizeof(IPL2HeaderPart) );
DC_InvalidateRange( &ipl2Header, sizeof(IPL2HeaderPart) );
while( !NVRAMm_ExecuteCommand( COMM_RD, READ_IPL2_HEADER_ADDR, READ_IPL2_HEADER_SIZE, (u8 *)&ipl2Header ) ) {}
read_ipl2h = TRUE;
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 NCD_GetIPL2Type( void )
u8 NSD_GetIPL2Type( void )
{
NCD_ReadIPL2Header();
return ipl2Header.version.ipl2_type;
NSDi_ReadIPL2Header();
return s_IPL2Header.version.ipl2_type;
}
// IPL2バージョンの取得
u8 *NCD_GetIPL2Version( void )
// IPL2タイムスタンプの取得
const u8 *NSD_GetIPL2Timestamp( void )
{
NCD_ReadIPL2Header();
return ipl2Header.version.timestamp;
NSDi_ReadIPL2Header();
return s_IPL2Header.version.timestamp;
}
// NCD格納ROMアドレスの取得
u32 NCD_GetNCDRomAddr( void )
// NSD格納ROMアドレスの取得
u32 NSD_GetNSDRomAddr( void )
{
NCD_ReadIPL2Header();
return (u32)( ipl2Header.ncd_rom_addr << NCD_ROM_ADDR_SHIFT );
NSDi_ReadIPL2Header();
return (u32)( s_IPL2Header.nsd_rom_addr << NSD_ROM_ADDR_SHIFT );
}
//----------------------------------------------------------------------
// NITRO設定データのリード
// NTR設定データのリード
//----------------------------------------------------------------------
int NVRAMm_ReadNitroConfigData(NitroConfigData *dstp)
// NTR設定データリード済み
BOOL NSD_IsReadSettings( void )
{
int result = 0;
NCDStoreEx *ncdsp = &ncds[ 0 ];
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( ncdsp, sizeof(NCDStoreEx) * 2 );
DC_InvalidateRange( pNSDStoreEx, sizeof(NSDStoreEx) * 2 );
// フラッシュからニ重化されているNITRO設定データを読み出す。
while( !NVRAMm_ExecuteCommand( COMM_RD, NCD_GetNCDRomAddr(), sizeof(NCDStoreEx), (u8 *)&ncdsp[0]) ) {}
while( !NVRAMm_ExecuteCommand( COMM_RD, NCD_GetNCDRomAddr() + SPI_NVRAM_PAGE_SIZE, sizeof(NCDStoreEx), (u8 *)&ncdsp[1]) ) {}
OS_TPrintf("NCD read addr=%08x\n", NCD_GetNCDRomAddr() );
// フラッシュからニ重化されている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(NVRAMm_checkCorrectNCD(ncdsp)) {
next_saveCount = 1;
result = 1;
goto END; // 有効なデータがなければエラー終了。
}
next_saveCount = (u8)((ncdsp[ena_ncd_num].saveCount + 1) & SAVE_COUNT_MASK);
// 有効なNITRO設定データをバッファに転送
if( dstp != NULL ) {
SVC_CpuCopy( (void *)&ncdsp[ ena_ncd_num ].ncd, (void *)dstp, sizeof(NitroConfigData), 16);
SVC_CpuCopy( (void *)&ncdsp[ ena_ncd_num ].ncd_ex, (void *)&ncdEx, sizeof(NitroConfigDataEx), 16);
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;
}
END:
return result;
OS_TPrintf("Use NSD[%d] : saveCount = %d\n", s_indexNSD, s_NSDStoreEx.saveCount);
return TRUE;
}
//----------------------------------------------------------------------
// NITRO設定データのライト
// NTR設定データのライト
//----------------------------------------------------------------------
void NVRAMm_WriteNitroConfigData( NitroConfigData *srcp )
BOOL NSD_WriteSettings( u8 region )
{
NCDStoreEx *ncdsp = &ncds[ 0 ];
u16 size = sizeof(NCDStore);
u32 flash_addr;
int retry;
int retry;
u32 nvramAddr;
// まだNITRO設定データがリードされていなければ、リードを行って必要な情報を取得する。
if( ena_ncd_num == NCD_NOT_CORRECT ) {
if( NVRAMm_ReadNitroConfigData( NULL ) ) {
ena_ncd_num = 0; // 有効なデータがなければ"0"側にライトする。
}
// まだNTR設定データがリードされていなければ、リードを行って必要な情報を取得する。
if( !NSD_IsReadSettings() ) {
OS_TPrintf( "ERROR: Need call NSD_ReadSetting.\n" );
return FALSE;
}
// NCD のCRC、セーブカウント値、ライトアドレスの算出。
ncdsp->ncd = *srcp; // *GetNCDWork(); でも一緒やん。
ncdsp->ncd.version = NITRO_CONFIG_DATA_VERSION; // バージョンを現在のものに設定。
ncdsp->crc16 = SVC_GetCRC16( 0xffff, (const void *)&ncdsp->ncd, sizeof(NitroConfigData) );
ncdsp->saveCount = next_saveCount;
next_saveCount = (u8)( ( next_saveCount + 1 ) & SAVE_COUNT_MASK );
// 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 );
// NCD_EXのCRC算出。
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
ncdsp->ncd_ex = *GetNCDExWork();
ncdsp->ncd_ex.version = NITRO_CONFIG_DATA_EX_VERSION; // バージョンを現在のものに設定。
ncdsp->ncd_ex.valid_language_bitmap = VALID_LANG_BITMAP;
ncdsp->crc16_ex = SVC_GetCRC16( 0xffff, (const void *)&ncdsp->ncd_ex, sizeof(NitroConfigDataEx) );
size = sizeof(NCDStoreEx); // ※書き込みサイズをNCDStoreExに拡張。
}
// 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) );
// NITRO設定データのライト
DC_FlushRange(ncdsp, sizeof(NCDStoreEx));
// NTR設定データのライト
DC_FlushRange( &s_NSDStoreEx, sizeof(NSDStoreEx) );
retry = NVRAM_RETRY_NUM;
while( retry-- ) {
ena_ncd_num ^= 0x01; // リトライの度に書き込みアドレスを切り替える。
flash_addr = NCD_GetNCDRomAddr() + ena_ncd_num * SPI_NVRAM_PAGE_SIZE;
OS_TPrintf("NCD write addr=%08x\n", flash_addr );
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, flash_addr, size, (u8 *)ncdsp) ) {
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 );
}
}
//----------------------------------------------------------------------
// ミラーリングされているNITRO設定データのどちらが有効かを判定
//----------------------------------------------------------------------
static int NVRAMm_checkCorrectNCD(NCDStoreEx *ncdsp)
{
u16 i;
u16 ncd_valid = 0;
// 各ミラーデータのCRC & saveCount正当性チェック
for(i = 0; i < 2; i++) {
u16 crc;
BOOL invalid = FALSE;
crc = SVC_GetCRC16( 0xffff, (const void *)&ncdsp[i].ncd, sizeof(NitroConfigData) );
if( ( ncdsp[ i ].crc16 != crc ) // CRCが正しく、saveCount値が0x80以下で、かつバージョンが一致するデータを正当と判断。
|| ( ncdsp[ i ].ncd.version != NITRO_CONFIG_DATA_VERSION )
|| ( ncdsp[ i ].saveCount >= SAVE_COUNT_MAX ) ) {
OS_TPrintf("NCD crc error.\n");
invalid = TRUE;
}
// NCDExが有効なIPL2Typeならば、NCDExのCRCチェックを行う。
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
crc = SVC_GetCRC16( 0xffff, (const void *)&ncdsp[i].ncd_ex, sizeof(NitroConfigDataEx) );
if( ( ncdsp[ i ].crc16_ex != crc )
|| ( ncdsp[ i ].ncd_ex.version != NITRO_CONFIG_DATA_EX_VERSION ) ) {
OS_TPrintf("NCDEx crc error.\n");
invalid = TRUE;
}
}
// NCD, NCDExのCRCが正しいなら、データの中身をチェック。
if( !invalid ) {
if( NCD_CheckDataValue( &ncdsp[ i ] ) ) {
ncd_valid |= 0x01 << i; // データがおかしい値でないかもチェック。
ena_ncd_num = i; // 有効なNCDのインデックスを切り替える。
}else {
invalid = TRUE;
}
}
if( ncd_valid & ( 0x01 << i ) ) {
OS_TPrintf("NCD mirror%d is valid.:saveCount = %d\n", i, ncdsp[i].saveCount);
}else {
OS_TPrintf("NCD mirror%d is invalid.\n", i);
}
}
if( ncd_valid == 0 ) {
return 1;
}else if( ncd_valid == 0x03 ) {
// ミラーリングされたNCDが両方ともに正当な場合、セーブカウント値が大きい方を有効とする。
u16 saveCount = (u8)( ( ncdsp[ 0 ].saveCount + 1 ) & SAVE_COUNT_MASK );
if( saveCount != ncdsp[ 1 ].saveCount ) {
ena_ncd_num = 0;
}
}
OS_TPrintf("use NCD mirror%d.:saveCount = %d\n", ena_ncd_num, ncdsp[ena_ncd_num].saveCount);
return 0;
}
// NITRO設定データの値が正しい値かチェック。 // FALSE:正しくない。TRUE正しい。
static BOOL NCD_CheckDataValue( NCDStoreEx *ncdsp )
{
NitroConfigData *ncdp = &ncdsp->ncd;
NitroConfigDataEx *ncdexp = &ncdsp->ncd_ex;
//ncdp->option;
// NCDのlanguageチェック
if( ~( LANG_BITMAP_WW & VALID_LANG_BITMAP ) & ( 0x0001 << ncdp->option.language ) ) {
OS_TPrintf("NCD: invalid language : org:%02d ex:%02d bitmap:%04x\n",
ncdp->option.language, ncdexp->language, ncdexp->valid_language_bitmap );
return FALSE;
}
// NCDExのlanguageチェックNCDExが有効なのは、下記のIPL2タイプのもの
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
if( ( ~VALID_LANG_BITMAP & ( 0x0001 << ncdexp->language ) )
|| ( ncdexp->valid_language_bitmap != VALID_LANG_BITMAP ) ) {
OS_TPrintf("NCDEx: invalid language : org:%02d ex:%02d bitmap:%04x\n",
ncdp->option.language, ncdexp->language, ncdexp->valid_language_bitmap );
return FALSE;
}
}
//ncdp->owner;
// favoriteColorは4bitなので範囲外はない。
// birthday
if( ncdp->option.input_birthday ) {
if( ( ncdp->owner.birthday.month > 12 ) || ( ncdp->owner.birthday.day > 31 ) ) {
OS_TPrintf("NCD: invalid birthday : %02d/%02d\n", ncdp->owner.birthday.month, ncdp->owner.birthday.day );
return FALSE;
}
}
// nickname
if( ncdp->option.input_nickname ) {
if( ncdp->owner.nickname.length > NCD_NICKNAME_LENGTH ) {
OS_TPrintf("NCD: invalid nickname length : %02d\n", ncdp->owner.nickname.length );
return FALSE;
}
}
// comment
if( ncdp->owner.comment.length > NCD_COMMENT_LENGTH ) {
OS_TPrintf("NCD: invalid comment length : %02d\n", ncdp->owner.comment.length );
return FALSE;
}
//ncdp->alarm;
if( ( ncdp->alarm.hour > 23 ) || ( ncdp->alarm.minute > 59 ) ) {
OS_TPrintf("NCD: invalid alarm time : %02d:%02d\n", ncdp->alarm.hour, ncdp->alarm.minute );
return FALSE;
}
//ncdp->tp;
// TPキャリブレーション値は、TP_CalcCalibrateParamで値のチェックをしているので、チェックしない。
OS_TPrintf( "NCD: correct data.\n" );
return TRUE;
}
//----------------------------------------------------------------------
// NVRAMへのアクセスルーチン本体 ( nv_state <- COMM_RD or COMM_WE )
// ミラーリングされているNTR設定データのどちらが有効かを判定
//----------------------------------------------------------------------
static BOOL NVRAMm_ExecuteCommand( int nv_state, u32 addr, u16 size, u8 *srcp )
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 nv_sending = FALSE;
u8 *nvram_srp = (u8 *)&ncds[1];
BOOL isSending = FALSE;
u8 *pSR = (u8 *)sr_buf;
PXI_SetFifoRecvCallback( PXI_FIFO_TAG_NVRAM , Callback_NVRAM );
@ -364,75 +396,75 @@ static BOOL NVRAMm_ExecuteCommand( int nv_state, u32 addr, u16 size, u8 *srcp )
//---------------------------------------
// NVRAMコマンドを発行する
//---------------------------------------
if( !nv_sending ) {
if( !isSending ) {
nv_cb_occurred = FALSE;
s_nvCbOccurred = FALSE;
switch( nv_state ) {
switch( nvState ) {
case COMM_RD:
nv_sending = SPI_NvramReadDataBytes( addr, size, srcp );
isSending = SPI_NvramReadDataBytes( addr, size, pSrc );
break;
case COMM_WE:
nv_sending = SPI_NvramWriteEnable();
isSending = SPI_NvramWriteEnable();
break;
case COMM_WR:
nv_sending = SPI_NvramPageWrite( addr, size , srcp );
isSending = SPI_NvramPageWrite( addr, size , pSrc );
start = OS_GetTick();
break;
case COMM_RDSR_WE:
case COMM_RDSR_WR:
nv_sending = SPI_NvramReadStatusRegister( nvram_srp );
isSending = SPI_NvramReadStatusRegister( pSR );
break;
case COMM_SRST:
nv_sending = SPI_NvramSoftwareReset();
isSending = SPI_NvramSoftwareReset();
break;
}
//---------------------------------------
// コマンド実行結果(コールバック発生)を待って結果を処理する
//---------------------------------------
}else { // nv_sending == TRUE
if( nv_cb_occurred == TRUE ) { // コールバック発生を待つ。
}else { // isSending == TRUE
if( s_nvCbOccurred == TRUE ) { // コールバック発生を待つ。
nv_sending = FALSE;
isSending = FALSE;
if( nv_result == SPI_PXI_RESULT_SUCCESS ) {
switch( nv_state ) {
if( s_nvResult == SPI_PXI_RESULT_SUCCESS ) {
switch( nvState ) {
case COMM_RD:
return TRUE;
case COMM_WE:
nv_state = COMM_RDSR_WE;
nvState = COMM_RDSR_WE;
break;
case COMM_WR:
nv_state = COMM_RDSR_WR;
nvState = COMM_RDSR_WR;
break;
case COMM_RDSR_WE:
case COMM_RDSR_WR:
DC_InvalidateRange( nvram_srp, 1 );
DC_InvalidateRange( pSR, 1 );
if( nv_state == COMM_RDSR_WE ) { // ライトイネーブル確認ステートなら
if( ( *nvram_srp & SR_WEN ) ) {
nv_state = COMM_WR;
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( ( *nvram_srp & SR_WIP ) == 0 ) { // ライト/イレース終了
if( ( *pSR & SR_WIP ) == 0 ) { // ライト/イレース終了
return TRUE;
}else {
if( ( *nvram_srp & SR_EER ) // SR_EERが立っていたらエラー
if( ( *pSR & SR_EER ) // SR_EERが立っていたらエラー
|| ( OS_TicksToMilliSeconds( OS_GetTick() - start ) > 4000 ) ) {
// コマンド発行から4秒経過したらエラー※保険
OS_TPrintf( "NVRAM SR : %02x\n", *nvram_srp );
nv_state = COMM_SRST;
DEBUG_Printf( "NVRAM SR : %02x\n", *pSR );
nvState = COMM_SRST;
}else {
SVC_WaitByLoop( 0x4000 );
}
@ -444,7 +476,7 @@ static BOOL NVRAMm_ExecuteCommand( int nv_state, u32 addr, u16 size, u8 *srcp )
OS_TPrintf("NVRAM ERR: PageErase Timeout and SoftReset.\n");
return FALSE;
}
}else { // nv_result != SPI_PXI_RESULT_SUCCESS
}else { // s_nvResult != SPI_PXI_RESULT_SUCCESS
OS_TPrintf("NVRAM ERR: NVRAM PXI command failed.\n");
return FALSE;
}
@ -463,43 +495,43 @@ static void Callback_NVRAM( PXIFifoTag tag, u32 data, BOOL err )
u16 command = (u16)( ( ( data & SPI_PXI_DATA_MASK ) & 0x7f00 ) >> 8 );
nv_result = (u16)( data & 0x00ff );
nv_cb_occurred = TRUE; // コールバック発生フラグTRUE
s_nvResult = (u16)( data & 0x00ff );
s_nvCbOccurred = TRUE; // コールバック発生フラグTRUE
if( err ) {
OS_TPrintf("NVRAM-ARM9: Received PXI data is error.\n");
nv_result = 0x00ff;
s_nvResult = 0x00ff;
}
switch(command){ // コマンド名表示
case SPI_PXI_COMMAND_NVRAM_READ:
OS_TPrintf("NVRAM-ARM9:ReadDataBytes");
DEBUG_Printf("NVRAM-ARM9:ReadDataBytes");
break;
case SPI_PXI_COMMAND_NVRAM_WREN:
OS_TPrintf("NVRAM-ARM9:WriteEnable");
DEBUG_Printf("NVRAM-ARM9:WriteEnable");
break;
case SPI_PXI_COMMAND_NVRAM_PW:
OS_TPrintf("NVRAM-ARM9:PageWrite");
DEBUG_Printf("NVRAM-ARM9:PageWrite");
break;
case SPI_PXI_COMMAND_NVRAM_RDSR:
OS_TPrintf("NVRAM-ARM9:ReadStatusRegister");
DEBUG_Printf("NVRAM-ARM9:ReadStatusRegister");
break;
case SPI_PXI_COMMAND_NVRAM_WRDI:
OS_TPrintf("NVRAM-ARM9:WriteDisable");
DEBUG_Printf("NVRAM-ARM9:WriteDisable");
break;
case SPI_PXI_COMMAND_NVRAM_PE:
OS_TPrintf("NVRAM-ARM9:PageErase");
DEBUG_Printf("NVRAM-ARM9:PageErase");
break;
case SPI_PXI_COMMAND_NVRAM_SR:
OS_TPrintf("NVRAM-ARM9:SoftwareReset");
DEBUG_Printf("NVRAM-ARM9:SoftwareReset");
break;
default:
OS_TPrintf("NVRAM-ARM9:?????");
DEBUG_Printf("NVRAM-ARM9:?????");
break;
}
if( nv_result != SPI_PXI_RESULT_SUCCESS ) {
OS_TPrintf(" Error! ->%x", nv_result );
if( s_nvResult != SPI_PXI_RESULT_SUCCESS ) {
OS_TPrintf(" Error! ->%x", s_nvResult );
}
OS_TPrintf("\n");
DEBUG_Printf("\n");
}

View File

@ -55,22 +55,15 @@ void SYSM_RebootTitle( u64 titleID );
static void INTR_SubpIRQ( void );
static void SYSMi_CheckCardLoadAddressAndSize( void );
static void LoadRomRegSizeAdjust( CARDRomRegion *romRegp, u32 load_limit_lo, u32 load_limit_hi );
static void SYSMi_ReadyBootNitroGame( void );
static BOOL SYSMi_CheckARM7LoadNITROCard( void );
static void SYSMi_MainpRegisterAndRamClear( BOOL isPlatformTWL );
static void ClearMemory( int addr1, int addr2 );
static void SYSMi_CopyInfoFromIPL1( void );
static void SYSMi_ReadNTRSetting( void );
static void SYSMi_ReadTWLSetting( void );
static void SYSMi_VerifyNTRSetting( void );
static BOOL SYSMi_CheckEntryAddress( void );
static void SYSMi_WriteAdjustRTC( void );
static BOOL SYSMi_SendMessageToARM7( u32 msg );
static BOOL SYSMi_CheckNitroCardRightly( void );
static int SYSMi_ExistCard( void );
static u32 SYSMi_SelectBootType( void );
static void SYSMi_DispInitialDebugData( void );
@ -79,10 +72,16 @@ static void SYSMi_DispDebugData( void );
static void DispSingleColorScreen( int mode );
static void SYSMi_ReadCardBannerFile( void );
static void SYSMi_CheckCardCloneBoot( void );
static BOOL SYSMi_CheckEntryAddress( void );
static BOOL SYSMi_CheckARM7LoadNITROCard( void );
static void SYSMi_CheckCardCloneBoot( void );
static void SYSMi_CheckRTC( void );
// global variable-------------------------------------------------------------
void *(*SYSM_Alloc)( u32 size );
void (*SYSM_Free )( void *ptr );
#ifdef __SYSM_DEBUG
SharedWork *swp; // デバッガでのIPL1SharedWorkのウォッチ用
SYSM_work *pSysm; // デバッガでのSYSMワークのウォッチ用
@ -134,7 +133,7 @@ void SYSM_Init( void )
{
#ifdef __SYSM_DEBUG
pSysm = GetSYSMWork();
ncdp = GetNCDWork();
ncdp = GetTSD();
// SYSMi_DispInitialDebugData(); // 初期デバッグ情報表示
#endif /* __SYSM_DEBUG */
@ -156,6 +155,13 @@ void SYSM_Init( void )
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
}
// システムメニューライブラリ用メモリアロケータの設定
void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
SYSM_Alloc = pAlloc;
SYSM_Free = pFree;
}
// ARM7側の初期化待ち
static void SYSMi_WaitInitARM7( void )
@ -166,14 +172,15 @@ static void SYSMi_WaitInitARM7( void )
*/
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
SYSMi_ReadTWLSetting(); // NANDからTWL本体設定データをリード
PMm_SetBackLightBrightness();
SYSMi_ReadNTRSetting(); // NOR からNTR本体設定データをリード
SYSMi_VerifyNTRSetting(); // NVRAMのNTR本体設定データをリードし、不一致箇所があればNTR側をリカバリ。
// SYSM_ReadHWInfo(); // NANDからHW情報をリード
SYSM_ReadTWLSettingsFile(); // NANDからTWL本体設定データをリード
SYSM_SetBackLightBrightness(); // 読み出したTWL本体設定データをもとにバックライト輝度設定
SYSM_CaribrateTP(); // 読み出したTWL本体設定データをもとにTPキャリブレーション。
SYSMi_WriteAdjustRTC(); // 読み出したTWL本体設定データをもとにRTCクロック補正値をセット。
SYSMi_CheckRTC();
SYSM_VerifyAndRecoveryNTRSettings(); // NTR設定データを読み出して、TWL設定データとベリファイし、必要ならリカバリ
SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
@ -481,41 +488,6 @@ static void INTR_SubpIRQ( void )
// アプリ起動処理
// ============================================================================
// エントリアドレスの正当性チェック
static BOOL SYSMi_CheckEntryAddress( void )
{
// エントリアドレスがROM内登録エリアかAGBカートリッジエリアなら、無限ループに入る。
if( !( ( (u32)GetRomHeaderAddr()->main_entry_address >= HW_MAIN_MEM )
&& ( (u32)GetRomHeaderAddr()->main_entry_address < SYSM_ARM9_MMEM_ENTRY_ADDR_LIMIT ) )
|| !( ( ( (u32)GetRomHeaderAddr()->sub_entry_address >= HW_MAIN_MEM )
&& ( (u32)GetRomHeaderAddr()->sub_entry_address < SYSM_ARM7_LOAD_MMEM_LAST_ADDR ) )
|| ( ( (u32)GetRomHeaderAddr()->sub_entry_address >= HW_WRAM )
&& ( (u32)GetRomHeaderAddr()->sub_entry_address < SYSM_ARM7_LOAD_WRAM_LAST_ADDR ) ) ) )
{
OS_TPrintf("entry address invalid.\n");
#ifdef __DEBUG_SECURITY_CODE
DispSingleColorScreen( SCREEN_YELLOW );
#endif
return FALSE;
}
OS_TPrintf("entry address valid.\n");
return TRUE;
}
// ARM7によるNITROゲームのロード完了を確認する。
static BOOL SYSMi_CheckARM7LoadNITROCard( void )
{
if( SYSMi_ExistCard()
// && !( SYSM_GetBootFlag() & BFLG_LOAD_CARD_COMPLETED )
) {
return FALSE;
}
return TRUE;
}
// SystemMenuで使用したレジスタメモリのクリア
static void SYSMi_MainpRegisterAndRamClear( BOOL isPlatformTWL )
{
@ -579,80 +551,6 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
}
// NITRO設定データの読み出し。
static void SYSMi_ReadNTRSetting( void )
{
RTCDate date;
RTCTime time;
GetSYSMWork()->ncd_invalid = NVRAMm_ReadNitroConfigData( GetNCDWork() );
// NVRAMからNITRO設定データをロード。
if( GetSYSMWork()->ncd_invalid ) { // リードしたNITRO設定データが無効だったら、0クリアしたものを使用。
OS_TPrintf(" NCD destroyed.\n" );
SVC_CpuClearFast( 0x0000, GetNCDExWork(), sizeof(NitroConfigDataEx) );
GetNCDExWork()->version = NITRO_CONFIG_DATA_EX_VERSION;
GetNCDWork()->option.backLightBrightness= 2; // 出荷時と同じ値に。
GetNCDWork()->option.language = LANG_ENGLISH; // プリセットが必要なデータはプリセットしておく
GetNCDWork()->option.destroyFlashFlag = 1;
GetNCDWork()->owner.birthday.month = 1;
GetNCDWork()->owner.birthday.day = 1;
GetNCDExWork()->valid_language_bitmap = VALID_LANG_BITMAP;
}
// RTCのリセット or おかしい値を検出した場合は初回起動シーケンスへ。
( void )RTC_GetDateTime( &date, &time );
if( !SYSM_CheckRTCDate( &date ) ||
!SYSM_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
|| ( GetSYSMWork()->rtcStatus & 0x01 )
#endif
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");
GetNCDWork()->option.input_rtc = 0;
GetNCDWork()->option.rtcOffset = 0;
GetNCDWork()->option.rtcLastSetYear = 0;
( void )NVRAMm_WriteNitroConfigData( GetNCDWork() );
}
}
// TWL設定データの読み出し
static void SYSMi_ReadTWLSetting( void )
{
}
// NTR設定とTWL設定をベリファイして、不一致があれば、NTR設定を更新
static void SYSMi_VerifyNTRSetting( void )
{
}
// RTCの日付が正しいかチェック
BOOL SYSM_CheckRTCDate( RTCDate *datep )
{
if( ( datep->year >= 100 )
|| ( datep->month < 1 ) || ( datep->month > 12 )
|| ( datep->day < 1 ) || ( datep->day > 31 )
|| ( datep->week >= RTC_WEEK_MAX ) ) {
return FALSE;
}
return TRUE;
}
// RTCの時刻が正しいかチェック
BOOL SYSM_CheckRTCTime( RTCTime *timep )
{
if( ( timep->hour > 23 )
|| ( timep->minute > 59 )
|| ( timep->second > 59 ) ) {
return FALSE;
}
return TRUE;
}
// バナーファイルの読み込みの実体
static void SYSMi_ReadCardBannerFile( void )
@ -702,6 +600,137 @@ static void SYSMi_ReadCardBannerFile( void )
}
// タッチパネルキャリブレーション
void SYSM_CaribrateTP( void )
{
#ifndef __TP_OFF
TPCalibrateParam calibrate;
( void )TP_CalcCalibrateParam( &calibrate, // タッチパネル初期化
GetTSD()->tp.data.raw_x1, GetTSD()->tp.data.raw_y1, (u16)GetTSD()->tp.data.dx1, (u16)GetTSD()->tp.data.dy1,
GetTSD()->tp.data.raw_x2, GetTSD()->tp.data.raw_y2, (u16)GetTSD()->tp.data.dx2, (u16)GetTSD()->tp.data.dy2 );
TP_SetCalibrateParam( &calibrate );
OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n",
GetTSD()->tp.data.raw_x1, GetTSD()->tp.data.raw_y1, (u16)GetTSD()->tp.data.dx1, (u16)GetTSD()->tp.data.dy1,
GetTSD()->tp.data.raw_x2, GetTSD()->tp.data.raw_y2, (u16)GetTSD()->tp.data.dx2, (u16)GetTSD()->tp.data.dy2 );
#endif
}
// RTCクロック補正値をセット
static void SYSMi_WriteAdjustRTC( void )
{
// ※TWLの時は、NANDの"/sys/HWINFO.dat"ファイルから該当する情報を取得する。
#if 0
FS_OpenFile( "/sys/HWINFO.dat" );
FS_ReadFile( xxxx );
raw = xxxx.rtcRaw;
( void )RTCi_SetRegAdjust( &raw );
#endif
#ifndef __IS_DEBUGGER_BUILD // デバッガ用ビルド時は補正しない。
RTCRawAdjust raw;
raw.adjust = 0;
// raw.adjust = GetTSD()->rtcClockAdjust; // ncd_invalid時にはrtcClockAdjustは
// 0クリアされているため補正機能は使用されない
( void )RTCi_SetRegAdjust( &raw );
#endif /* __IS_DEBUGGER_BUILD */
}
// FIFO経由でARM7にメッセージ通知。※PXI_FIFO_TAG_USER_1を使用。
static BOOL SYSMi_SendMessageToARM7(u32 msg)
{
#pragma unused(msg)
return TRUE;
}
// NTR,TWLカード存在チェック 「リターン 1カード認識 0カードなし」
static int SYSMi_ExistCard( void )
{
if( ( GetRomHeaderAddr()->nintendo_logo_crc16 == 0xcf56 ) &&
( GetRomHeaderAddr()->header_crc16 == GetSYSMWork()->cardHeaderCrc16) ) {
return TRUE; // NTR,TWLカードありNintendoロゴCRC、カードヘッダCRCが正しい場合
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
}else {
return FALSE; // NTR,TWLカードなし
}
}
// スリープモードへの遷移
void SYSM_GoSleepMode( void )
{
#ifndef __IS_DEBUGGER_BUILD // デバッガ用ビルド時はスリープしない。
PM_GoSleepMode( (PMWakeUpTrigger)( (PAD_DetectFold() ? PM_TRIGGER_COVER_OPEN : 0) | PM_TRIGGER_RTC_ALARM ),
0,
0 );
#endif /* __IS_DEBUGGER_BUILD */
}
// バックライト輝度調整
void SYSM_SetBackLightBrightness( void )
{
( void )PMi_WriteRegister( 4, (u16)TSD_GetBacklightBrightness() );
( void )PM_SetBackLight( PM_LCD_ALL, PM_BACKLIGHT_ON );
}
//======================================================================
// 各種チェック
//======================================================================
// Nintendoロゴチェック 「リターン 1:Nintendoロゴ認識成功 0失敗」
BOOL SYSM_CheckNinLogo(u16 *logo_cardp)
{
u16 *logo_orgp = (u16 *)SYSROM9_NINLOGO_ADR; // ARM9のシステムROMのロゴデータとカートリッジ内のものを比較
u16 length = NINTENDO_LOGO_LENGTH >> 1;
while(length--) {
if(*logo_orgp++ != *logo_cardp++) return FALSE;
}
return TRUE;
}
// エントリアドレスの正当性チェック
static BOOL SYSMi_CheckEntryAddress( void )
{
// エントリアドレスがROM内登録エリアかAGBカートリッジエリアなら、無限ループに入る。
if( !( ( (u32)GetRomHeaderAddr()->main_entry_address >= HW_MAIN_MEM )
&& ( (u32)GetRomHeaderAddr()->main_entry_address < SYSM_ARM9_MMEM_ENTRY_ADDR_LIMIT ) )
|| !( ( ( (u32)GetRomHeaderAddr()->sub_entry_address >= HW_MAIN_MEM )
&& ( (u32)GetRomHeaderAddr()->sub_entry_address < SYSM_ARM7_LOAD_MMEM_LAST_ADDR ) )
|| ( ( (u32)GetRomHeaderAddr()->sub_entry_address >= HW_WRAM )
&& ( (u32)GetRomHeaderAddr()->sub_entry_address < SYSM_ARM7_LOAD_WRAM_LAST_ADDR ) ) ) )
{
OS_TPrintf("entry address invalid.\n");
#ifdef __DEBUG_SECURITY_CODE
DispSingleColorScreen( SCREEN_YELLOW );
#endif
return FALSE;
}
OS_TPrintf("entry address valid.\n");
return TRUE;
}
// ARM7によるNITROゲームのロード完了を確認する。
static BOOL SYSMi_CheckARM7LoadNITROCard( void )
{
if( SYSMi_ExistCard()
// && !( SYSM_GetBootFlag() & BFLG_LOAD_CARD_COMPLETED )
) {
return FALSE;
}
return TRUE;
}
// クローンブート判定
static void SYSMi_CheckCardCloneBoot( void )
{
@ -731,91 +760,32 @@ static void SYSMi_CheckCardCloneBoot( void )
}
// タッチパネルキャリブレーション
void SYSM_CaribrateTP( void )
// 起動時のRTCチェック
static void SYSMi_CheckRTC( void )
{
#ifndef __TP_OFF
TPCalibrateParam calibrate;
RTCDate date;
RTCTime time;
( void )TP_CalcCalibrateParam( &calibrate, // タッチパネル初期化
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );
TP_SetCalibrateParam( &calibrate );
OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n",
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );
// RTCのリセット or おかしい値を検出した場合は初回起動シーケンスへ。
( void )RTC_GetDateTime( &date, &time );
if( !SYSM_CheckRTCDate( &date ) ||
!SYSM_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
|| ( GetSYSMWork()->rtcStatus & 0x01 )
#endif
}
// RTCクロック補正値をセット
static void SYSMi_WriteAdjustRTC( void )
{
#ifndef __IS_DEBUGGER_BUILD // デバッガ用ビルド時は補正しない。
RTCRawAdjust raw;
raw.adjust = GetNCDWork()->option.rtcClockAdjust; // ncd_invalid時にはrtcClockAdjustは
// 0クリアされているため補正機能は使用されない
( void )RTCi_SetRegAdjust( &raw );
#endif /* __IS_DEBUGGER_BUILD */
}
// FIFO経由でARM7にメッセージ通知。※PXI_FIFO_TAG_USER_1を使用。
static BOOL SYSMi_SendMessageToARM7(u32 msg)
{
#pragma unused(msg)
return TRUE;
}
// NTR,TWLカード存在チェック 「リターン 1カード認識 0カードなし」
static int SYSMi_ExistCard( void )
{
if( ( GetRomHeaderAddr()->nintendo_logo_crc16 == 0xcf56 ) &&
( GetRomHeaderAddr()->header_crc16 == GetSYSMWork()->cardHeaderCrc16) ) {
return TRUE; // NTR,TWLカードありNintendoロゴCRC、カードヘッダCRCが正しい場合
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
}else {
return FALSE; // NTR,TWLカードなし
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");
GetTSD()->flags.isSetDateTime = 0;
GetTSD()->rtcOffset = 0;
GetTSD()->rtcLastSetYear = 0;
// ※※ライトする?
SYSM_WriteTWLSettingsFile();
}
}
// Nintendoロゴチェック 「リターン 1:Nintendoロゴ認識成功 0失敗」
BOOL SYSM_CheckNinLogo(u16 *logo_cardp)
{
u16 *logo_orgp = (u16 *)SYSROM9_NINLOGO_ADR; // ARM9のシステムROMのロゴデータとカートリッジ内のものを比較
u16 length = NINTENDO_LOGO_LENGTH >> 1;
while(length--) {
if(*logo_orgp++ != *logo_cardp++) return FALSE;
}
return TRUE;
}
// スリープモードへの遷移
void SYSM_GoSleepMode( void )
{
#ifndef __IS_DEBUGGER_BUILD // デバッガ用ビルド時はスリープしない。
PM_GoSleepMode( (PMWakeUpTrigger)( (PAD_DetectFold() ? PM_TRIGGER_COVER_OPEN : 0) | PM_TRIGGER_RTC_ALARM ),
0,
0 );
#endif /* __IS_DEBUGGER_BUILD */
}
// バックライト輝度調整
void PMm_SetBackLightBrightness( void )
{
( void )PMi_WriteRegister( 4, (u16)NCD_GetBackLightBrightness() );
( void )PM_SetBackLight( PM_LCD_ALL, PM_BACKLIGHT_ON );
}
//======================================================================
// デバッグ関数
// デバッグ
//======================================================================
// 初期データのデバッグ表示

View File

@ -23,7 +23,7 @@
// extern data------------------------------------------
// function's prototype declaration---------------------
static s64 SYSMi_CalcRtcSecOffset( RTCDate *datep, RTCTime *timep );
static s64 SYSMi_CalcRTCSecOffset( RTCDate *datep, RTCTime *timep );
// global variable -------------------------------------
@ -33,30 +33,12 @@ static s64 SYSMi_CalcRtcSecOffset( RTCDate *datep, RTCTime *timep );
// function's description-------------------------------
//======================================================================
// NITRO設定データ ワーク制御
//======================================================================
// NITRO設定データのニックネーム・色・誕生日の初期化。
void NCD_ClearOwnerInfo( void )
{
NitroConfigData *ncdp = GetNCDWork();
MI_CpuClear16( &ncdp->owner, sizeof(NvOwnerInfo) );
ncdp->owner.birthday.month = 1;
ncdp->owner.birthday.day = 1;
ncdp->option.input_birthday = 0;
ncdp->option.input_favoriteColor = 0;
ncdp->option.input_nickname = 0;
}
//======================================================================
// RTCオフセット制御
//======================================================================
// RTCに新しい設定値をセットして、その値をもとにrtcOffset値を算出する。
s64 SYSM_CalcRtcOffsetAndSetDateTime( RTCDate *newDatep, RTCTime *newTimep )
s64 SYSM_CalcRTCOffsetAndSetDateTime( RTCDate *newDatep, RTCTime *newTimep )
{
RTCDate oldDate;
RTCTime oldTime;
@ -70,14 +52,14 @@ s64 SYSM_CalcRtcOffsetAndSetDateTime( RTCDate *newDatep, RTCTime *newTimep )
oldTime.second = 0;
// RTC設定時は、今回の設定でどれだけRTC値が変化したか秒オフセット単位を算出。
if( ( oldDate.year < NCD_GetRtcLastSetYear() ) && ( NCD_GetInputRTC() ) ) {
if( ( oldDate.year < TSD_GetRTCLastSetYear() ) && ( TSD_IsSetDateTime() ) ) {
oldDate.year += 100; // 前回の設定今回の設定の間にRTCが一周してしまったら、yearは100を加算してoffsetを計算する。
}
NCD_SetRtcLastSetYear( (u8)newDatep->year );
TSD_SetRTCLastSetYear( (u8)newDatep->year );
offset0 = SYSMi_CalcRtcSecOffset( &oldDate, &oldTime ); // 設定直前のRTC値のオフセットを算出
offset1 = SYSMi_CalcRtcSecOffset( newDatep, newTimep ); // 新しくセットされたRTC値のオフセットを算出
offset = NCD_GetRtcOffset() + offset1 - offset0; // 新RTC_ofs と 現在のRTC_ofs の差分の値を加算してリターン。
offset0 = SYSMi_CalcRTCSecOffset( &oldDate, &oldTime ); // 設定直前のRTC値のオフセットを算出
offset1 = SYSMi_CalcRTCSecOffset( newDatep, newTimep ); // 新しくセットされたRTC値のオフセットを算出
offset = TSD_GetRTCOffset() + offset1 - offset0; // 新RTC_ofs と 現在のRTC_ofs の差分の値を加算してリターン。
OS_Printf ("Now Date = year:%3d month:%3d date:%3d hour:%3d minute:%3d second:%3d\n",
oldDate.year, oldDate.month, oldDate.day,
@ -95,7 +77,7 @@ s64 SYSM_CalcRtcOffsetAndSetDateTime( RTCDate *newDatep, RTCTime *newTimep )
// RTCオフセット値の算出
#define SECOND_OFFSET
static s64 SYSMi_CalcRtcSecOffset( RTCDate *datep, RTCTime *timep )
static s64 SYSMi_CalcRTCSecOffset( RTCDate *datep, RTCTime *timep )
{
u32 i;
int uruu = 0;
@ -160,6 +142,7 @@ u32 SYSM_GetDayNum( u32 year, u32 month )
}
*/
// 簡易うるう年の判定 (うるう年1、通常の年0※RTCのとりうる範20002100年に限定する。
BOOL SYSM_IsLeapYear100( u32 year )
{
@ -170,3 +153,28 @@ BOOL SYSM_IsLeapYear100( u32 year )
}
}
// RTCの日付が正しいかチェック
BOOL SYSM_CheckRTCDate( RTCDate *datep )
{
if( ( datep->year >= 100 )
|| ( datep->month < 1 ) || ( datep->month > 12 )
|| ( datep->day < 1 ) || ( datep->day > 31 )
|| ( datep->week >= RTC_WEEK_MAX ) ) {
return FALSE;
}
return TRUE;
}
// RTCの時刻が正しいかチェック
BOOL SYSM_CheckRTCTime( RTCTime *timep )
{
if( ( timep->hour > 23 )
|| ( timep->minute > 59 )
|| ( timep->second > 59 ) ) {
return FALSE;
}
return TRUE;
}

View File

@ -16,13 +16,13 @@
# $Author: $
#----------------------------------------------------------------------------
SUBDIRS =
SUBDIRS = ../../../libraries_sysmenu/sysmenu
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
#TWL_ARCHGEN = LIMITED
TARGET_BIN = main.srl

View File

@ -55,7 +55,7 @@ static const u16 *s_pStrSetting[ SETTING_MENU_ELEMENT_NUM ]; //
//===============================================
// mainMenu.c
//===============================================
static const u16 *const s_pStrSettingElemTbl[ SETTING_MENU_ELEMENT_NUM ][ LANG_CODE_MAX ] = {
static const u16 *const s_pStrSettingElemTbl[ SETTING_MENU_ELEMENT_NUM ][ TWL_LANG_CODE_MAX ] = {
{
(const u16 *)L"言語",
(const u16 *)L"LANGUAGE",
@ -126,13 +126,10 @@ void MachineSettingInit( void )
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"MACHINE SETTINGS" );
#ifdef __NCD_CLEAR_ENABLE
(void)PutStringUTF16( 18 * 8, 21 * 8, TXT_COLOR_BLACK, (const u16 *)L"[START]:NCD clear.");
#endif /* __NCD_CLEAR_ENABLE */
// NITRO設定データのlanguageに応じたメインメニュー構成言語の切り替え
for( i = 0; i < SETTING_MENU_ELEMENT_NUM; i++ ) {
s_pStrSetting[ i ] = s_pStrSettingElemTbl[ i ][ GetNCDWork()->option.language ];
s_pStrSetting[ i ] = s_pStrSettingElemTbl[ i ][ TSD_GetLanguage() ];
}
DrawMenu( s_csr, &s_settingParam );
@ -194,22 +191,6 @@ int MachineSettingMain( void )
}
}
#ifdef __NCD_CLEAR_ENABLE
if( pad.trg & PAD_BUTTON_START ) {
SVC_CpuClearFast( 0x0000, GetNCDWork(), sizeof(NitroConfigData) );
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase( 0x3fe00 );
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase( 0x3ff00 );
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteDisable();
OS_TPrintf("NitroConfigData zero clear!!\n");
}
#endif /* __NCD_CLEAR_ENABLE */
return 0;
}
@ -242,27 +223,27 @@ void CheckOKCancelButton(BOOL *tp_ok, BOOL *tp_cancel)
static BOOL InitialSetting( void )
{
#if 0
if(GetNCDWork()->option.input_language == 0) { // 言語設定がまだ。
if( !TSD_GetFlagLanguage() ) { // 言語設定がまだ。
g_initialSet = TRUE;
s_csr = 2;
SelectLangageInit();
g_pNowProcess = SelectLanguageMain;
return TRUE;
}else if(GetNCDWork()->option.input_tp == 0) { // TPキャリブレーションがまだ。
}else if( !TSD_GetFlagTP() ) { // TPキャリブレーションがまだ。
g_initialSet = TRUE;
s_csr = 3;
TP_CalibrationInit();
g_pNowProcess = TP_CalibrationMain;
return TRUE;
}else if(GetNCDWork()->option.input_rtc == 0) { // RTC設定がまだ。
}else if( !TSD_GetFlagDateTime() ) { // RTC設定がまだ。
ClearRTC();
g_initialSet = TRUE;
s_csr = 1;
SetRTCInit();
g_pNowProcess = SetRTCMain;
return TRUE;
}else if( (GetNCDWork()->option.input_nickname == 0) // ニックネームまたは好きな色入力がまだ。
|| (GetNCDWork()->option.input_favoriteColor == 0) ) {
}else if( !TSD_GetFlagNickname() || // ニックネームまたは好きな色入力がまだ。
!TSD_GetFlagUserColor() ) {
/* g_initialSet = TRUE;
s_csr = 0;
SetOwnerInfoInit();

View File

@ -71,6 +71,7 @@ typedef struct CalibWork {
u16 last_y;
TPData sample[2];
TPCalibrateParam calibrate;
TWLTPCalibData calibData;
}CalibWork;
// extern data------------------------------------------
@ -406,20 +407,23 @@ int TP_CalibrationMain( void )
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) {
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_tp = 1; // タッチパネル入力フラグを立てる。
GetNCDWork()->tp.raw_x1 = s_pCw->sample[0].x;
GetNCDWork()->tp.raw_y1 = s_pCw->sample[0].y;
GetNCDWork()->tp.dx1 = 32;
GetNCDWork()->tp.dy1 = 32;
GetNCDWork()->tp.raw_x2 = s_pCw->sample[1].x;
GetNCDWork()->tp.raw_y2 = s_pCw->sample[1].y;
GetNCDWork()->tp.dx2 = DISP_X_SIZE - 32;
GetNCDWork()->tp.dy2 = DISP_Y_SIZE - 32;
GetSYSMWork()->ncd_invalid = 0;
s_pCw->calibData.data.raw_x1 = s_pCw->sample[0].x;
s_pCw->calibData.data.raw_y1 = s_pCw->sample[0].y;
s_pCw->calibData.data.dx1 = 32;
s_pCw->calibData.data.dy1 = 32;
s_pCw->calibData.data.raw_x2 = s_pCw->sample[1].x;
s_pCw->calibData.data.raw_y2 = s_pCw->sample[1].y;
s_pCw->calibData.data.dx2 = DISP_X_SIZE - 32;
s_pCw->calibData.data.dy2 = DISP_Y_SIZE - 32;
TSD_SetTPCalibration( &s_pCw->calibData );
TSD_SetFlagTP( TRUE ); // タッチパネル入力フラグを立てる。
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
(void)SYSM_WriteTWLSettingsFile();
ReturnMenu();
return 0;
@ -438,8 +442,8 @@ int TP_CalibrationMain( void )
if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ){
(void)TP_CalcCalibrateParam(
&s_pCw->calibrate,
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );
s_pCw->calibData.data.raw_x1, s_pCw->calibData.data.raw_y1, (u16)s_pCw->calibData.data.dx1, (u16)s_pCw->calibData.data.dy1,
s_pCw->calibData.data.raw_x2, s_pCw->calibData.data.raw_y2, (u16)s_pCw->calibData.data.dx2, (u16)s_pCw->calibData.data.dy2 );
TP_SetCalibrateParam( &s_pCw->calibrate );
ReturnMenu();
return 0;
@ -452,7 +456,7 @@ int TP_CalibrationMain( void )
// ƒ<>ƒjƒ…<C692>[‚É–ß‚é
static void ReturnMenu( void )
{
NNS_FndFreeToAllocator( &g_allocator, s_pCw ); // キャリブレーション用変数の開放
Free( s_pCw ); // キャリブレーション用変数の開放
s_pCw = NULL;
OS_Printf("Free :CalibWork\n");
MachineSettingInit();
@ -474,7 +478,7 @@ void TP_CalibrationInit( void )
DisplayInit();
s_pCw = NNS_FndAllocFromAllocator( &g_allocator, sizeof(CalibWork) ); // キャリブレーション用変数の確保
s_pCw = Alloc( sizeof(CalibWork) ); // キャリブレーション用変数の確保
if( s_pCw == NULL ) {
OS_Panic("ARM9- Fail to allocate memory...\n");
}

View File

@ -24,12 +24,9 @@
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static void InitAllocator( NNSFndAllocator* pAllocator );
static void InitAllocSystem( void );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
NNSFndAllocator g_allocator;
int (*g_pNowProcess)( void );
RTCDrawProperty g_rtcDraw = {
TRUE, RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y
@ -54,6 +51,7 @@ void TwlMain(void)
GX_Init();
GX_SetPower(GX_POWER_ALL); // 各ロジック パワーON
FS_Init( 3 );
// 割り込み許可----------------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
@ -65,12 +63,16 @@ void TwlMain(void)
(void)RTC_Init();
// システムの初期化------------------
InitAllocator( &g_allocator );
CMN_InitFileSystem( &g_allocator );
InitAllocator();
SYSM_SetAllocFunc( Alloc, Free );
// NitroConfigDataのリード
(void)NVRAMm_ReadNitroConfigData( GetNCDWork() );
SYSM_CaribrateTP();
// ※本来ならランチャーからのパラメータチェックを行い、
// 初回起動シーケンスに入るパスがある
// TWL設定のリード
if( SYSM_ReadTWLSettingsFile() ) {
SYSM_CaribrateTP();
}
InitBG();
GetAndDrawRTCData( &g_rtcDraw, TRUE );
@ -88,23 +90,6 @@ void TwlMain(void)
}
// アロケータの初期化
static void InitAllocator( NNSFndAllocator* pAllocator )
{
u32 arenaLow = MATH_ROUNDUP ( (u32)OS_GetMainArenaLo(), 16 );
u32 arenaHigh = MATH_ROUNDDOWN( (u32)OS_GetMainArenaHi(), 16 );
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo( heapSize, 16 );
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap( heapMemory, heapSize );
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap( pAllocator, heapHandle, 4 );
}
// ============================================================================
// 割り込み処理
// ============================================================================

View File

@ -80,9 +80,9 @@ static void InitScreen( void );
static void InitCanvas( void );
// global variable-------------------------------------------------------------
KeyWork pad; // キーパッド入力データ
TpWork tpd; // タッチパネル入力データ
KeyWork pad; // キーパッド入力データ
TpWork tpd; // タッチパネル入力データ
NNSFndAllocator g_allocator; // メモリアロケータ
NNSG2dFont gFont; // フォント
NNSG2dCharCanvas gCanvas; // CharCanvas
NNSG2dTextCanvas gTextCanvas; // TextCanvas
@ -112,8 +112,45 @@ const u8 *const g_strWeek[] ATTRIBUTE_ALIGN(2) = {
(const u8 *)"SAT",
};
// ============================================================================
// function's description
// メモリ管理
// ============================================================================
// アロケータの初期化
void InitAllocator( void )
{
NNSFndAllocator *pAllocator = &g_allocator;
u32 arenaLow = MATH_ROUNDUP ( (u32)OS_GetMainArenaLo(), 16 );
u32 arenaHigh = MATH_ROUNDDOWN( (u32)OS_GetMainArenaHi(), 16 );
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo( heapSize, 16 );
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap( heapMemory, heapSize );
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap( pAllocator, heapHandle, 32 );
}
// メモリ割り当て
void *Alloc( u32 size )
{
return NNS_FndAllocFromAllocator( &g_allocator, size );
}
// メモリ解放
void Free( void *pBuffer )
{
NNS_FndFreeToAllocator( &g_allocator, pBuffer );
}
// ============================================================================
// 画面設定
// ============================================================================
// BG初期化
@ -198,6 +235,8 @@ static void InitScreen( void )
// 文字列描画の初期化
static void InitCanvas( void )
{
CMN_InitFileSystem( &g_allocator );
// フォントを読み込みます
{
void* pFontFile;

View File

@ -134,17 +134,20 @@ typedef struct RTCDrawProperty {
}RTCDrawProperty;
// global variables--------------------------------------------------
extern TpWork tpd; // タッチパネルデータ
extern KeyWork pad; // キーパッド入力データ
extern const u8 *const g_strWeek[ 7 ]; // 曜日文字列
extern RTCDrawProperty g_rtcDraw;
extern TpWork tpd; // タッチパネルデータ
extern KeyWork pad; // キーパッド入力データ
extern const u8 *const g_strWeek[ 7 ]; // 曜日文字列
extern RTCDrawProperty g_rtcDraw;
extern NNSFndAllocator g_allocator; // メモリアロケータ
extern NNSG2dFont gFont; // フォント
extern NNSG2dCharCanvas gCanvas; // CharCanvas
extern NNSG2dTextCanvas gTextCanvas; // TextCanvas
extern NNSFndAllocator g_allocator; // メモリアロケータ
extern NNSG2dFont gFont; // フォント
extern NNSG2dCharCanvas gCanvas; // CharCanvas
extern NNSG2dTextCanvas gTextCanvas; // TextCanvas
// function-------------------------------------------------------------
void InitAllocator( void );
void *Alloc( u32 size );
void Free( void *pBuffer );
void InitBG( void );
int GetPrintfWidth( const NNSG2dTextCanvas *pCanvas, const char *fmt, ... );
void PutStringUTF16 ( int x, int y, int color, const u16 *strUTF16 );

View File

@ -32,7 +32,7 @@
// global variable -------------------------------------
// static variable -------------------------------------
static NvLangCode s_langCode; // 言語コード
static TWLLangCode s_langCode; // 言語コード
// const data -----------------------------------------
static const u16 *const s_pStrLanguage[] = {
@ -81,10 +81,10 @@ void SelectLanguageInit( void )
}
if( ( GetSYSMWork()->ncd_invalid ) ||
( GetNCDWork()->option.language >= LANG_CODE_MAX ) ) {
s_langCode = LANG_ENGLISH;
( TSD_GetLanguage() >= TWL_LANG_CODE_MAX ) ) {
s_langCode = TWL_LANG_ENGLISH;
}else {
s_langCode = (NvLangCode)GetNCDWork()->option.language;
s_langCode = TSD_GetLanguage();
}
DrawMenu( (u16)s_langCode, &langSel );
@ -109,13 +109,13 @@ int SelectLanguageMain( void )
// キー入力処理
//--------------------------------------
if( pad.trg & PAD_KEY_DOWN ) { // カーソルの移動
if( ++s_langCode == LANG_CODE_MAX ) {
s_langCode = (NvLangCode)0;
if( ++s_langCode == TWL_LANG_CODE_MAX ) {
s_langCode = (TWLLangCode)0;
}
}
if( pad.trg & PAD_KEY_UP ) {
if( --s_langCode < 0 ) {
s_langCode = (NvLangCode)( LANG_CODE_MAX - 1 );
s_langCode = (TWLLangCode)( TWL_LANG_CODE_MAX - 1 );
}
}
tp_select = SelectMenuByTP( (u16 *)&s_langCode, &langSel );
@ -129,12 +129,14 @@ int SelectLanguageMain( void )
if( ( pad.trg & PAD_BUTTON_A ) || tp_select ) { // メニュー項目への分岐
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_language = 1; // 言語入力フラグを立てる
GetNCDWork()->option.language = s_langCode;
TSD_SetLanguage( s_langCode );
TSD_SetFlagLanguage( TRUE ); // 言語入力フラグを立てる
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
(void)SYSM_WriteTWLSettingsFile();
MachineSettingInit();
return 0;
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) {

View File

@ -80,7 +80,7 @@ typedef struct Nickname {
u8 change_flag; // 変更フラグ
u8 length; // 文字数
u8 pad;
u16 str[NCD_NICKNAME_LENGTH + 1]; // ニックネームコード
u16 str[TWL_NICKNAME_LENGTH + 1]; // ニックネームコード
}Nickname;
// カーソルX,Y位置キャラ単位
@ -189,7 +189,7 @@ static const u16 *str_button[] = { NULL,
void SEQ_OwnerInfo_init(void)
{
u16 x,y;
u16 temp[NCD_NICKNAME_LENGTH + 1];
u16 temp[TWL_NICKNAME_LENGTH + 1];
GXS_SetVisiblePlane(GX_PLANEMASK_NONE);
@ -202,7 +202,7 @@ void SEQ_OwnerInfo_init(void)
(void)DrawStringSJIS( RETURN_BUTTON_LT_X, RETURN_BUTTON_LT_Y,HIGHLIGHT_C, (const u8 *)" RETURN ");
if(ow == NULL) {
ow = NNS_FndAllocFromAllocator( &g_allocator, sizeof(OwnerWork) ); // オーナー情報編集用ワークの確保
ow = Alloc( sizeof(OwnerWork) ); // オーナー情報編集用ワークの確保
#ifdef __SYSM_DEBUG
if(ow == NULL) OS_Panic("ARM9- Fail to allocate memory...\n");
#endif /* __SYSM_DEBUG */
@ -214,19 +214,21 @@ void SEQ_OwnerInfo_init(void)
{
u32 dayNum;
if(GetNCDWork()->owner.nickname.length > NCD_NICKNAME_LENGTH) {
GetNCDWork()->owner.nickname.length = 0;
SVC_CpuClear(0x0000, GetNCDWork()->owner.nickname.str, NCD_NICKNAME_LENGTH * 2, 16);
if( TSD_GetNickname()->length > TWL_NICKNAME_LENGTH) {
TSD_GetNickname()->length = 0;
SVC_CpuClear( 0x0000, TSD_GetNickname().buffer, TWL_NICKNAME_BUFFERSIZE, 16 );
}
if((GetNCDWork()->owner.birthday.month == 0) || (GetNCDWork()->owner.birthday.month > 12)) {
GetNCDWork()->owner.birthday.month = 1;
if( ( TSD_GetBirthday()->month == 0) ||
( TSD_GetBirthday()->month > 12 ) ) {
TSD_GetBirthday()->month = 1;
}
dayNum = SYSM_GetDayNum( 0, (u32)GetNCDWork()->owner.birthday.month );
if((GetNCDWork()->owner.birthday.day == 0) || (GetNCDWork()->owner.birthday.day > dayNum)) {
GetNCDWork()->owner.birthday.day = 1;
dayNum = SYSM_GetDayNum( 0, (u32)TSD_GetBirthday()->month );
if( ( TSD_GetBirthday()->day == 0) ||
( TSD_GetBirthday()->day > dayNum ) ) {
TSD_GetBirthday()->day = 1;
}
if( GetNCDWork()->owner.favoriteColor >= NCD_FAVORITE_COLOR_MAX_NUM ) {
GetNCDWork()->owner.favoriteColor = 0;
if( TSD_GetUserColor() >= TWL_FAVORITE_COLOR_MAX_NUM ) {
TSD_SetUserColor( 0 );
}
}
@ -234,16 +236,16 @@ void SEQ_OwnerInfo_init(void)
x = (u16)(ownerInfoSel.pos_x+13);
y = (u16)ownerInfoSel.pos_y;
SVC_CpuClear(0x0000, temp, sizeof(temp), 16);
ExUTF16_LEtoSJIS_BE( (u8 *)temp, GetNCDWork()->owner.nickname.str, GetNCDWork()->owner.nickname.length);
ExUTF16_LEtoSJIS_BE( (u8 *)temp, TSD_GetNickname()->buffer, TSD_GetNickname()->length );
(void)DrawStringSJIS ( x, y, LIGHTGREEN, temp);
DrawBirthday ( x, (u16)(y + OWNER_INFO_CSR_NEXT_Y_NUM * 1), LIGHTGREEN, &GetNCDWork()->owner.birthday);
ow->favoriteColor = GetNCDWork()->owner.favoriteColor;
(void)DrawDecimalSJIS( x, (u16)(y + OWNER_INFO_CSR_NEXT_Y_NUM * 2), LIGHTGREEN, &ow->favoriteColor, 2, 1);
DrawBirthday ( x, (u16)(y + OWNER_INFO_CSR_NEXT_Y_NUM * 1), LIGHTGREEN, TSD_GetBirthday() );
ow->favoriteColor = TSD_GetUserColor();
(void)DrawDecimalSJIS( x, (u16)(y + OWNER_INFO_CSR_NEXT_Y_NUM * 2), LIGHTGREEN, &ow->favoriteColor, 2, 1 );
DrawMenu(ow->sel, &ownerInfoSel);
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
DrawMenu( ow->sel, &ownerInfoSel );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
GXS_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1);
GXS_SetVisiblePlane( GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1 );
}
@ -265,18 +267,18 @@ int SEQ_OwnerInfo(void)
pad.trg = 0;
if(GetNCDWork()->option.input_nickname == 0) {
if( !TSD_GetFlagNickname() ) {
ow->sel = 0;
pad.trg |= PAD_BUTTON_A;
}else if(GetNCDWork()->option.input_favoriteColor == 0) {
}else if( !TSD_GetFlagUserColor() ) {
ow->sel = 2;
pad.trg |= PAD_BUTTON_A;
}else if(GetNCDWork()->option.input_birthday == 0) {
}else if( !TSD_GetFlagBirthday() ) {
ow->sel = 1;
pad.trg |= PAD_BUTTON_A;
}else if ( GetNCDWork()->option.input_nickname
|| GetNCDWork()->option.input_favoriteColor
|| GetNCDWork()->option.input_birthday ) {
}else if ( TSD_GetFlagNickname() ||
TSD_GetFlagUserColor() ||
TSD_GetFlagBirthday() ) {
pad.trg |= PAD_BUTTON_B; // メニューに戻らす
}
}
@ -313,7 +315,7 @@ int SEQ_OwnerInfo(void)
break;
}
}else if((pad.trg & PAD_BUTTON_B) || (tp_return)) { // メニューに戻る
NNS_FndFreeToAllocator( &g_allocator, ow ); // ワークの解放
Free( ow ); // ワークの解放
ow = NULL;
OS_Printf("Free :OwnerWork\n");
SEQ_MainMenu_init();
@ -331,10 +333,10 @@ int SEQ_OwnerInfo(void)
static void SEQ_InputBirthday_init(void)
{
// 生年月日の表示
DrawBirthday((u16)(ownerInfoSel.pos_x + 13), (u16)(ownerInfoSel.pos_y + OWNER_INFO_CSR_NEXT_Y_NUM * 1), WHITE, &GetNCDWork()->owner.birthday);
DrawBirthday((u16)(ownerInfoSel.pos_x + 13), (u16)(ownerInfoSel.pos_y + OWNER_INFO_CSR_NEXT_Y_NUM * 1), WHITE, TSD_GetBirthday() );
// 生年月日情報のロード
ow->birthday.month = (int)GetNCDWork()->owner.birthday.month;
ow->birthday.day = (int)GetNCDWork()->owner.birthday.day;
ow->birthday.month = (int)TSD_GetBirthday()->month;
ow->birthday.day = (int)TSD_GetBirthday()->day;
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
ow->seq = 0;
}
@ -444,18 +446,18 @@ static int SEQ_InputBirthday(void)
break;
case SEQ_END:
GetNCDWork()->owner.birthday.month = (u8 )ow->birthday.month;
GetNCDWork()->owner.birthday.day = (u8 )ow->birthday.day;
GetNCDWork()->option.input_birthday = 1;
GetSYSMWork()->ncd_invalid = 0;
GetSYSMWork()->ncd_invalid = 0;
TSD_GetBirthday()->month = (u8 )ow->birthday.month;
TSD_GetBirthday()->day = (u8 )ow->birthday.day;
TSD_SetFlagBirthday( TRUE );
if ( GetNCDWork()->option.destroyFlashFlag ) {
GetNCDWork()->option.destroyFlashFlag = 0;
if( TSD_IsInitialSequence() ) {
TSD_SetFlagInitialSequence( FALSE );
}
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
(void)SYSM_WriteTWLSettingsFile();
// SEQ_ENDの時はこのままリターンする。
@ -501,9 +503,9 @@ static void DrawBirthday(u16 x, u16 y, u16 color, NvDate *birthp)
static void SEQ_InputFavoriteColor_init(void)
{
// 好きな色のロード
ow->favoriteColor = (int)GetNCDWork()->owner.favoriteColor;
ow->favoriteColor = TSD_GetUserColor();
// 好きな色の表示
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
ow->seq = 0;
if( g_initialSet ) {
@ -558,7 +560,7 @@ static int SEQ_InputFavoriteColor(void)
ow->inp.pos_x = FCOLOR_LT_X;
ow->inp.pos_y = FCOLOR_LT_Y;
ow->inp.keta_max = 2;
ow->inp.value_max = NCD_FAVORITE_COLOR_MAX_NUM - 1;
ow->inp.value_max = TWL_FAVORITE_COLOR_MAX_NUM - 1;
ow->inp.value_min = 0;
ow->inp.y_offset = 0;
ow->tgtp = (int *)&ow->favoriteColor;
@ -569,14 +571,14 @@ static int SEQ_InputFavoriteColor(void)
break;
case SEQ_END:
GetNCDWork()->option.input_favoriteColor = 1;
GetNCDWork()->owner.favoriteColor = (u8 )ow->favoriteColor;
GetSYSMWork()->ncd_invalid = 0;
TSD_SetUserColor( (u8 )ow->favoriteColor );
TSD_SetFlagUserColor( TRUE );
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
(void)SYSM_WriteTWLSettingsFile();
// SEQ_ENDの時はこのままリターンする。
@ -619,10 +621,10 @@ static void SEQ_InputNickname_init(void)
}
// ニックネームをUTF16からSJISに変換してコピー
SVC_CpuClear(CHAR_USCORE, ow->nickname.str, NCD_NICKNAME_LENGTH * 2, 16);
SVC_CpuClear(CHAR_USCORE, ow->nickname.str, TWL_NICKNAME_LENGTH * 2, 16);
if(GetSYSMWork()->ncd_invalid == 0) {
ExUTF16_LEtoSJIS_BE( (u8 *)ow->nickname.str, GetNCDWork()->owner.nickname.str, GetNCDWork()->owner.nickname.length);
ow->nickname.length = GetNCDWork()->owner.nickname.length;
ExUTF16_LEtoSJIS_BE( (u8 *)ow->nickname.str, TSD_GetNickname()->buffer, TSD_GetNickname()->length );
ow->nickname.length = TSD_GetNickname()->length;
ow->nickname.input_flag = 1;
}
ow->nickname.change_flag = 0;
@ -744,7 +746,7 @@ static int SEQ_InputNickname(void)
}else if(charCode == DEL_BUTTON_) { // 1文字削除
DeleteName1Char();
}else {
if(ow->nickname.length < NCD_NICKNAME_LENGTH) { // 一文字入力
if( ow->nickname.length < TWL_NICKNAME_LENGTH ) { // 一文字入力
ow->nickname.str[ow->nickname.length] = (u16)((charCode >> 8) | (charCode << 8));
// SJIS・ASCII混載文字列の際にこれらを判別できるよう、SJISをHi,Loの順で格納。
ow->nickname.length++;
@ -771,18 +773,18 @@ static void ReturnMenu(int save_flag)
if((save_flag)&&(ow->nickname.change_flag)) {
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_nickname = 1; // ニックネーム入力フラグを立てる。
TSD_SetFlagNickname( TRUE ); // ニックネーム入力フラグを立てる。
ExSJIS_BEtoUTF16_LE( (u8 *)ow->nickname.str, GetNCDWork()->owner.nickname.str, ow->nickname.length);
ExSJIS_BEtoUTF16_LE( (u8 *)ow->nickname.str, TSD_GetNickname()->buffer, ow->nickname.length);
// 入力されたネームをSJISからUTF16へ変換する。
GetNCDWork()->owner.nickname.length = ow->nickname.length;
for(i = ow->nickname.length; i < NCD_NICKNAME_LENGTH; i++) {// 入力された名前以降を0x0000で埋める。
GetNCDWork()->owner.nickname.str[i] = 0x0000;
TSD_GetNickname()->length = ow->nickname.length;
for(i = ow->nickname.length; i < TWL_NICKNAME_LENGTH; i++) {// 入力された名前以降を0x0000で埋める。
TSD_GetNickname()->buffer[ i ] = 0x0000;
}
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData(GetNCDWork());
(void)SYSM_WriteTWLSettingsFile();
}
SEQ_OwnerInfo_init();
g_pNowProcess = SEQ_OwnerInfo; // オーナー情報編集に戻る

View File

@ -121,7 +121,7 @@ void SetRTCInit( void )
}
}
s_pWork = NNS_FndAllocFromAllocator( &g_allocator, sizeof(SetRtcWork) ); // RTC設定用ワークの確保
s_pWork = Alloc( sizeof(SetRtcWork) ); // RTC設定用ワークの確保
if( s_pWork == NULL ) {
OS_Panic( "ARM9- Fail to allocate memory...\n" );
}
@ -176,7 +176,7 @@ int SetRTCMain( void )
tp_return = WithinRangeTP( RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y,
RETURN_BUTTON_BOTTOM_X, RETURN_BUTTON_BOTTOM_Y, &tpd.disp );
}
if( g_initialSet && !GetNCDWork()->option.input_rtc ) {
if( g_initialSet && !TSD_IsSetDateTime() ) {
tp_set = TRUE;
}
//--------------------------------------
@ -186,7 +186,7 @@ int SetRTCMain( void )
InputRtcDateTimeInit( 1 );
g_pNowProcess = InputRtcDateTimeMain;
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_return ) { // メニューに戻る
NNS_FndFreeToAllocator( &g_allocator, s_pWork ); // RTC設定用ワークの解放
Free( s_pWork ); // RTC設定用ワークの解放
s_pWork = NULL;
MachineSettingInit();
}
@ -377,15 +377,15 @@ static int InputRtcDateTimeMain( void )
MI_CpuCopy32( &s_pWork->dtp.Date, &date, sizeof(RTCDate) );
date.year -= 2000;
(void)RTC_SetDateTime( &date, &s_pWork->dtp.Time );
NCD_SetRtcOffset( SYSM_CalcRtcOffsetAndSetDateTime( &date, &s_pWork->dtp.Time ) );
TSD_SetRTCOffset( SYSM_CalcRTCOffsetAndSetDateTime( &date, &s_pWork->dtp.Time ) );
}
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_rtc = 1; // RTC入力フラグを立てる。
TSD_SetFlagDateTime( TRUE ); // RTC入力フラグを立てる。
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
(void)SYSM_WriteTWLSettingsFile();
// 上画面の表示更新
GetAndDrawRTCData( &g_rtcDraw, TRUE );
@ -542,16 +542,14 @@ void InputDecimal( int *pTgt, InputNumParam *pInp )
// RTC設定のクリア
void ClearRTC( void )
{
SVC_CpuClear( 0x0000, &GetSYSMWork()->rtc[0].Time, sizeof(RTCTime), 16 );
GetSYSMWork()->rtc[0].Date.year = 0;
GetSYSMWork()->rtc[0].Date.month = 1;
GetSYSMWork()->rtc[0].Date.day = 1;
(void)RTC_SetDateTime( &GetSYSMWork()->rtc[0].Date, &GetSYSMWork()->rtc[0].Time );
GetNCDWork()->option.input_rtc = 0;
GetNCDWork()->option.rtcOffset = 0;
NCD_SetRtcLastSetYear( 0 );
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
RTCDate date = { 0, 1, 1, RTC_WEEK_SUNDAY };
RTCTime time = { 0, 0, 0 };
(void)RTC_SetDateTime( &date, &time );
TSD_SetFlagDateTime( TRUE );
TSD_SetRTCOffset( 0 );
TSD_SetRTCLastSetYear( 0 );
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)SYSM_WriteTWLSettingsFile();
}

View File

@ -24,12 +24,9 @@
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static void InitAllocator( NNSFndAllocator* pAllocator );
static void InitAllocSystem( void );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
NNSFndAllocator g_allocator;
// static variable-------------------------------------------------------------
@ -61,7 +58,7 @@ void TwlMain(void)
(void)RTC_Init();
// システムの初期化------------------
InitAllocator( &g_allocator );
InitAllocator();
CMN_InitFileSystem( &g_allocator );
InitBG();
@ -78,23 +75,6 @@ void TwlMain(void)
}
// ƒAƒ<41>ƒP<C692>[ƒ^Ì<E2809A>‰Šú‰»
static void InitAllocator( NNSFndAllocator* pAllocator )
{
u32 arenaLow = MATH_ROUNDUP ((u32)OS_GetMainArenaLo(), 16);
u32 arenaHigh = MATH_ROUNDDOWN((u32)OS_GetMainArenaHi(), 16);
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo(heapSize, 16);
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap(heapMemory, heapSize);
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap(pAllocator, heapHandle, 4);
}
// ============================================================================
// 割り込み処理
// ============================================================================

View File

@ -19,6 +19,7 @@
#define SYSM_MACHINE_SETTINGS_H_
#include <sysmenu/machineSettings/common/nitroSettings.h>
#include <sysmenu/machineSettings/common/TWLSettings.h>
#ifdef __cplusplus
extern "C" {
@ -28,5 +29,5 @@ extern "C" {
} /* extern "C" */
#endif
/* SYSM_MACHINE_SETTINGs_H_ */
/* SYSM_MACHINE_SETTINGS_H_ */
#endif

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: NitroSettings.c
File: NTRSettings.c
Copyright 2007 Nintendo. All rights reserved.
@ -16,9 +16,9 @@
*---------------------------------------------------------------------------*/
#ifndef NITRO_SETTINGS_H_
#define NITRO_SETTINGS_H_
#if defined(SDK_CW) // NitroConfigDataにビットフィールドを使っているので、コンパイラ依存で不具合が発生する可能性がある。
#ifndef NTR_SETTINGS_H_
#define NTR_SETTINGS_H_
#if defined(SDK_CW) // NTRConfigDataにビットフィールドを使っているので、コンパイラ依存で不具合が発生する可能性がある。
// よって、CW以外のコンパイラの場合は、このヘッダを無効にしてエラーを出させるようにして再確認する。
#include <twl.h>
@ -29,78 +29,96 @@ extern "C" {
// define data ------------------------------------
#define NITRO_CONFIG_DATA_VERSION 5 // NITRO設定データフォーマットバージョン
#define NITRO_CONFIG_DATA_EX_VERSION 1 // 拡張NITRO設定データフォーマットバージョン
#define NCD_NICKNAME_LENGTH 10 // ニックネーム長
#define NCD_COMMENT_LENGTH 26 // コメント長
#define NCD_FAVORITE_COLOR_MAX_NUM 16 // 好きな色の最大数
#define NTR_SETTINGS_DATA_VERSION 5 // NTR設定データフォーマットバージョン
#define NTR_SETTINGS_DATA_EX_VERSION 1 // 拡張NTR設定データフォーマットバージョン
#define NTR_NICKNAME_LENGTH 10 // ニックネーム長
#define NTR_NICKNAME_BUFFERSIZE ( NTR_NICKNAME_LENGTH * 2 ) // ニックネームバッファサイズ
#define NTR_COMMENT_LENGTH 26 // コメント長
#define NTR_COMMENT_BUFFERSIZE ( NTR_COMMENT_LENGTH * 2 )
#define NTR_USER_COLOR_MAX_NUM 16 // ユーザーカラーの最大数
#define NSD_TEMP_BUFFER_SIZE ( sizeof(NSDStoreEx) * 2 ) // NSD_ReadSettingsで必要なTempBufferサイズ
// 言語設定コード
typedef enum NvLangCode{
LANG_JAPANESE =0, // 日本語
LANG_ENGLISH =1, // 英語
LANG_FRENCH =2, // フランス語
LANG_GERMAN =3, // ドイツ語
LANG_ITALIAN =4, // イタリア語
LANG_SPANISH =5, // スペイン語
LANG_CHINESE =6, // 中国語
LANG_HANGUL =7, // 韓国語
LANG_CODE_MAX
}NvLangCode;
typedef enum NTRLangCode{
NTR_LANG_JAPANESE = 0, // 日本語
NTR_LANG_ENGLISH = 1, // 英語
NTR_LANG_FRENCH = 2, // フランス語
NTR_LANG_GERMAN = 3, // ドイツ語
NTR_LANG_ITALIAN = 4, // イタリア語
NTR_LANG_SPANISH = 5, // スペイン語
NTR_LANG_CHINESE = 6, // 中国語
NTR_LANG_KOREAN = 7, // 韓国語
NTR_LANG_CODE_MAX
}NTRLangCode;
#define LANG_CODE_MAX_WW ( LANG_SPANISH + 1 )
#define LANG_BITMAP_WW ( ( 0x0001 << LANG_JAPANESE ) \
| ( 0x0001 << LANG_ENGLISH ) \
| ( 0x0001 << LANG_FRENCH ) \
| ( 0x0001 << LANG_GERMAN ) \
| ( 0x0001 << LANG_ITALIAN ) \
| ( 0x0001 << LANG_SPANISH ) ) // 通常版での対応言語ビットマップ
#define NTR_LANG_CODE_MAX_WW ( NTR_LANG_SPANISH + 1 )
#define VALID_LANG_BITMAP LANG_BITMAP_WW // 本IPL2の対応言語ビットマップ
#define NTR_LANG_BITMAP_WW ( ( 0x0001 << NTR_LANG_JAPANESE ) | \
( 0x0001 << NTR_LANG_ENGLISH ) | \
( 0x0001 << NTR_LANG_FRENCH ) | \
( 0x0001 << NTR_LANG_GERMAN ) | \
( 0x0001 << NTR_LANG_ITALIAN ) | \
( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-WW版での対応言語ビットマップ
#define NTR_LANG_BITMAP_CHINA ( ( 0x0001 << NTR_LANG_CHINESE ) | \
( 0x0001 << NTR_LANG_ENGLISH ) | \
( 0x0001 << NTR_LANG_FRENCH ) | \
( 0x0001 << NTR_LANG_GERMAN ) | \
( 0x0001 << NTR_LANG_ITALIAN ) | \
( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-CN版での対応言語ビットマップ
#define NTR_LANG_BITMAP_KOREA ( ( 0x0001 << NTR_LANG_KOREAN ) | \
( 0x0001 << NTR_LANG_JAPANESE ) | \
( 0x0001 << NTR_LANG_ENGLISH ) | \
( 0x0001 << NTR_LANG_FRENCH ) | \
( 0x0001 << NTR_LANG_GERMAN ) | \
( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-KR版での対応言語ビットマップ
// 日付データ
typedef struct NvDate{
typedef struct NTRDate{
u8 month; // 月:0112
u8 day; // 日:0131
}NvDate; // 2byte
}NTRDate; // 2byte
// ニックネーム
typedef struct NvNickname{
u16 str[NCD_NICKNAME_LENGTH]; // ニックネームUnicode(UTF16)で最大10文字、終端コードなし
typedef struct NTRNickname{
u16 buffer[ NTR_NICKNAME_LENGTH ]; // ニックネームUnicode(UTF16)で最大10文字、終端コードなし
u8 length; // 文字数
u8 rsv;
}NvNickname; // 22byte
}NTRNickname; // 22byte
// コメント
typedef struct NvComment{
u16 str[NCD_COMMENT_LENGTH]; //コメントUnicode(UTF16)で最大26文字、終端コードなし
typedef struct NTRComment{
u16 buffer[ NTR_COMMENT_LENGTH ]; //コメントUnicode(UTF16)で最大26文字、終端コードなし
u8 length; // 文字数
u8 rsv;
}NvComment; // 54byte
}NTRComment; // 54byte
// オーナー情報
typedef struct NvOwnerInfo{
u8 favoriteColor : 4; // 好きな色
typedef struct NTROwnerInfo{
u8 userColor : 4; // ユーザーカラー
u8 rsv : 4; // 予約。
NvDate birthday; // 生年月日
NTRDate birthday; // 生年月日
u8 pad;
NvNickname nickname; // ニックネーム
NvComment comment; // コメント
}NvOwnerInfo; // 80byte
NTRNickname nickname; // ニックネーム
NTRComment comment; // コメント
}NTROwnerInfo; // 80byte
// IPL用目覚まし時計データ
typedef struct NvAlarm{
typedef struct NTRAlarm{
u8 hour; // アラーム時:0023
u8 minute; // アラーム分:0059
u8 rsv1; // 予約
u8 pad;
u16 alarmOn : 1; // アラームON,OFF0:OFF, 1:ON
u16 rsv2 : 15; // 予約
}NvAlarm; // 6byte
}NTRAlarm; // 6byte
// タッチパネルキャリブレーションデータ
typedef struct NvTpCalibData{
typedef struct NTRTPCalibData{
u16 raw_x1; // 第キャリブレーション点のTP取得値X
u16 raw_y1; //             TP取得値Y
u8 dx1; //             LCD座標 X
@ -109,370 +127,423 @@ typedef struct NvTpCalibData{
u16 raw_y2; //             TP取得値Y
u8 dx2; //             LCD座標 X
u8 dy2; //             LCD座標 Y
}NvTpCalibData; // 12byte
}NTRTPCalibData; // 12byte
// オプション情報
typedef struct NvOption{
u16 language : 3; // 言語コード(LANG_SPANISHまでの標準言語コードが入る
u16 agbLcd : 1; // AGBモードで起動する時にどちらのLCDで起動するか0:TOP,1:BOTTOM
u16 backLightBrightness : 2; // バックライト輝度データ
u16 autoBootFlag : 1; // 起動シーケンスで、メニュー停止なしで自動起動するかどうか?(0:OFF, 1:ON)
u16 backLightOffFlag : 1; // バックライトON,OFFフラグ0:ON, 1:OFF
typedef struct NTROption{
u16 language : 3; // 言語コード(NTR_LANG_SPANISHまでの標準言語コードが入る
u16 isGBUseTopLCD : 1; // AGBモードで起動する時にどちらのLCDで起動するか0:TOP,1:BOTTOM
u16 backlightBrightness : 2; // バックライト輝度データ
u16 isAutoBoot : 1; // 起動シーケンスで、メニュー停止なしで自動起動するかどうか?(0:OFF, 1:ON)
u16 isBacklightOff : 1; // バックライトON,OFFフラグ0:ON, 1:OFF
u16 rsv2 : 1; // 予約
u16 destroyFlashFlag : 1; // フラッシュ壊れシーケンス中フラグ
u16 input_birthday : 1; // 誕生日が入力されたか?
u16 input_favoriteColor : 1; // 好きな色が入力されたか?
u16 input_tp : 1; // タッチパネルがキャリブレーションされたか?( 〃 )
u16 input_language : 1; // 言語入力がされたか?  (0:未設定, 1:設定済み)
u16 input_rtc : 1; // RTC設定がされたか ( 〃      )
u16 input_nickname : 1; // ニックネームが入力されたか? ( 〃      )
u16 initialSequence : 1; // 初回起動シーケンス中フラグ
u16 isSetBirthday : 1; // 誕生日が入力されたか?
u16 isSetUserColor : 1; // ユーザーカラーが入力されたか?
u16 isSetTP : 1; // タッチパネルがキャリブレーションされたか?( 〃 )
u16 isSetLanguage : 1; // 言語入力がされたか?  (0:未設定, 1:設定済み)
u16 isSetDateTime : 1; // 日付・時刻設定がされたか? ( 〃      )
u16 isSetNickname : 1; // ニックネームが入力されたか? ( 〃      )
u8 rtcLastSetYear; // RTCの前回設定年
u8 rtcClockAdjust; // RTCクロック調整値
s64 rtcOffset; // RTC設定時のオフセット値ユーザーがRTC設定を変更する度にその値に応じて増減します。
}NvOption; // 12byte
}NTROption; // 12byte
// NITRO各種設定データ
typedef struct NitroConfigData{
// NTR各種設定データ
typedef struct NTRSettingsData{
u8 version; // フラッシュ格納データフォーマットのバージョン
u8 pad;
NvOwnerInfo owner; // オーナー情報
NvAlarm alarm; // IPL用目覚まし時計データ
NvTpCalibData tp; // タッチパネルキャリブレーションデータ
NvOption option; // オプション
}NitroConfigData; // 112byte
// NITRO各種設定データのNVRAM保存時フォーマット
typedef struct NCDStore{
NitroConfigData ncd; // NITRO各種設定データ
u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。
u16 crc16; // NITRO各種設定データの16bitCRC
u8 pad[ 128 - sizeof(NitroConfigData) - 4];
}NCDStore; // 128byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。
NTROwnerInfo owner; // オーナー情報
NTRAlarm alarm; // IPL用目覚まし時計データ
NTRTPCalibData tp; // タッチパネルキャリブレーションデータ
NTROption option; // オプション
}NTRSettingsData; // 112byte
//----------------------------------------------
// IPL2中国・韓国版での拡張フォーマット
//----------------------------------------------
// 拡張NITRO設定データ
typedef struct NitroConfigDataEx{
// 拡張NTR設定データ
typedef struct NTRSettingsDataEx{
u8 version; // バージョン
u8 language; // 言語コード(LANG_CHINESE以降に拡張された値が入る。
u8 language; // 言語コードNTR_LANG_CHINESE以降に拡張された値が入る。
u16 valid_language_bitmap; // 本IPL2で有効な言語コードを示したビットマップ
u8 pad[ 256 - sizeof(NitroConfigData) - 4 - 4 - 2 ]; // 4:saveCount+crc16, 2:NCDEx.version+NCDEx.language, 2:crc16_ex
}NitroConfigDataEx; // 138bytes
u8 pad[ 256 - sizeof(NTRSettingsData) - 4 - 4 - 2 ]; // 4:saveCount+crc16, 2:NSDEx.version+NSDEx.language, 2:crc16_ex
}NTRSettingsDataEx; // 138bytes
// NITRO各種設定データのNVRAM保存時フォーマット
typedef struct NCDStoreEx{
NitroConfigData ncd; // NITRO各種設定データ
u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。
u16 crc16; // NITRO各種設定データの16bitCRC
NitroConfigDataEx ncd_ex;
// NTR各種設定データのNVRAM保存時フォーマット
typedef struct NSDStore{
NTRSettingsData nsd; // NTR各種設定データ
u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。
u16 crc16; // NTR各種設定データの16bitCRC
u8 pad[ 128 - sizeof(NTRSettingsData) - 4];
}NSDStore; // 128byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。
// NTR各種設定データEXのNVRAM保存時フォーマット上記NCDStoreと互換をとるための無理やり拡張
typedef struct NSDStoreEx{
NTRSettingsData nsd; // NTR各種設定データ
u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。
u16 crc16; // NTR各種設定データの16bitCRC
NTRSettingsDataEx nsd_ex;
u16 crc16_ex;
}NCDStoreEx; // 256byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。
}NSDStoreEx; // 256byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。
#ifdef SDK_ARM9
//=========================================================
// グローバル変数
//=========================================================
extern NTRSettingsData *g_pNSD;
extern NTRSettingsDataEx *g_pNSDEx;
#define GetNSD() ( g_pNSD )
#define GetNSDEx() ( g_pNSDEx )
//=========================================================
// NVRAMへのリードライト関数
//=========================================================
#ifdef SDK_ARM9
extern int NVRAMm_ReadNitroConfigData (NitroConfigData *dstp);
extern void NVRAMm_WriteNitroConfigData(NitroConfigData *dstp);
#endif
extern void NSD_ClearSettings( void );
extern BOOL NSD_IsReadSettings( void );
extern BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ); // NSD_TEMP_BUFFER_SIZEのpTempBufferが必要。
extern BOOL NSD_WriteSettings( u8 region ); // 先にNSD_ReadSettingsを実行しておく必要がある。
//=========================================================
// NITRO設定データへのアクセス関数
//=========================================================
extern NitroConfigDataEx ncdEx;
#define GetNCDWork() ( (NitroConfigData *)( HW_NVRAM_USER_INFO ) )
#define GetNCDExWork() ( &ncdEx )
// NITRO設定データ領域のアドレス獲得
extern void NCD_ClearOwnerInfo( void ); // ニックネーム・誕生日・好きな色のクリア
extern u8 NCD_GetIPL2Type( void );
extern u8 *NCD_GetIPL2Version( void );
extern u32 NCD_GetNCDRomAddr( void );
//=========================================================
// データ取得
// データ取得NSD_ReadSettingsで内部ワークに読み出した情報の取得
//=========================================================
//-----------------------------------
// オーナー情報全体の取得。
static inline NvOwnerInfo *NCD_GetOwnerInfo(void)
// バージョンの取得。
static inline u8 NSD_GetVersion( void )
{
return &GetNCDWork()->owner;
return (u8)GetNSD()->version;
}
// 好きな色の取得。
static inline u8 NCD_GetFavoriteColor(void)
// EXバージョンの取得。
static inline u8 NSD_GetExVersion( void )
{
return (u8)GetNCDWork()->owner.favoriteColor;
return (u8)GetNSDEx()->version;
}
// オーナー情報全体の取得。
static inline NTROwnerInfo *NSD_GetOwnerInfo( void )
{
return &GetNSD()->owner;
}
// ユーザーカラーの取得。
static inline u8 NSD_GetUserColor( void )
{
return (u8)GetNSD()->owner.userColor;
}
// 誕生日の取得。
static inline NvDate *NCD_GetBirthday(void)
static inline NTRDate *NSD_GetBirthday( void )
{
return &GetNCDWork()->owner.birthday;
return &GetNSD()->owner.birthday;
}
// ニックネームの取得。
static inline NvNickname *NCD_GetNickname(void)
static inline NTRNickname *NSD_GetNickname( void )
{
return &GetNCDWork()->owner.nickname;
return &GetNSD()->owner.nickname;
}
// コメントの取得。
static inline NvComment *NCD_GetComment(void)
static inline NTRComment *NSD_GetComment( void )
{
return &GetNCDWork()->owner.comment;
return &GetNSD()->owner.comment;
}
//-----------------------------------
// アラーム情報の取得。
static inline NvAlarm *NCD_GetAlarmData(void)
static inline NTRAlarm *NSD_GetAlarmData( void )
{
return &GetNCDWork()->alarm;
return &GetNSD()->alarm;
}
//-----------------------------------
// タッチパネルキャリブレーションデータの取得。
static inline NvTpCalibData *NCD_GetTPCalibration(void)
static inline NTRTPCalibData *NSD_GetTPCalibration( void )
{
return &GetNCDWork()->tp;
return &GetNSD()->tp;
}
//-----------------------------------
// オプション情報の取得。
// 言語コードの取得
static inline NvLangCode NCD_GetLanguage(void)
static inline NTRLangCode NSD_GetLanguage( void )
{
return (NvLangCode)GetNCDExWork()->language;
return (NTRLangCode)GetNSD()->option.language;
}
static inline NvLangCode NCD_GetLanguageOrg(void)
static inline NTRLangCode NSD_GetLanguageEx( void )
{
return (NvLangCode)GetNCDWork()->option.language;
return (NTRLangCode)GetNSDEx()->language;
}
// 対応言語ビットマップの取得
static inline u16 NSD_GetLanguageBitmap( void )
{
return GetNSDEx()->valid_language_bitmap;
}
// RTCオフセット値の取得
static inline s64 NCD_GetRtcOffset(void)
static inline s64 NSD_GetRTCOffset( void )
{
return GetNCDWork()->option.rtcOffset;
return GetNSD()->option.rtcOffset;
}
// RTCクロック調整値の取得
static inline u8 NCD_GetRtcClockAdjust(void)
static inline u8 NSD_GetRTCClockAdjust( void )
{
return GetNCDWork()->option.rtcClockAdjust;
return GetNSD()->option.rtcClockAdjust;
}
// RTCの前回セットした年の取得
static inline u8 NCD_GetRtcLastSetYear(void)
static inline u8 NSD_GetRTCLastSetYear( void )
{
return GetNCDWork()->option.rtcLastSetYear;
return GetNSD()->option.rtcLastSetYear;
}
// 起動シーケンスの自動起動ONか0:OFF, 1:ON
static inline int NCD_GetAutoBootFlag(void)
static inline int NSD_IsAutoBoot( void )
{
return (int)GetNCDWork()->option.autoBootFlag;
return (int)GetNSD()->option.isAutoBoot;
}
// バックライト輝度取得0-3
static inline int NCD_GetBackLightBrightness(void)
static inline BOOL NSD_IsBacklightOff( void )
{
return (int)GetNCDWork()->option.backLightBrightness;
return (BOOL)GetNSD()->option.isBacklightOff;
}
// バックライト輝度取得0-3
static inline int NSD_GetBacklightBrightness( void )
{
return (int)GetNSD()->option.backlightBrightness;
}
// フラッシュ壊れシーケンス中かどうか?
static inline int NCD_GetDestroyFlash(void)
static inline BOOL NSD_IsInitialSequence( void )
{
return (int)GetNCDWork()->option.destroyFlashFlag;
return (int)GetNSD()->option.initialSequence;
}
// 誕生日データがセットされているか?
static inline int NCD_GetInputBirthday(void)
static inline BOOL NSD_IsSetBirthday( void )
{
return (int)GetNCDWork()->option.input_birthday;
return (int)GetNSD()->option.isSetBirthday;
}
// 好きな色データがセットされているか?
static inline int NCD_GetInputFavoriteColor(void)
// ユーザーカラーデータがセットされているか?
static inline int NSD_IsSetUserColor( void )
{
return (int)GetNCDWork()->option.input_favoriteColor;
return (int)GetNSD()->option.isSetUserColor;
}
// TPキャリブレーションデータがセットされているか
static inline int NCD_GetInputTP(void)
static inline int NSD_IsSetTP( void )
{
return (int)GetNCDWork()->option.input_tp;
return (int)GetNSD()->option.isSetTP;
}
// 言語コードがセットされているか?
static inline int NCD_GetInputLanguage(void)
static inline int NSD_IsSetLanguage( void )
{
return (int)GetNCDWork()->option.input_language;
return (int)GetNSD()->option.isSetLanguage;
}
// RTCデータがセットされているか?
static inline int NCD_GetInputRTC(void)
// 日付・時刻がセットされているか?
static inline int NSD_IsSetDateTime( void )
{
return (int)GetNCDWork()->option.input_rtc;
return (int)GetNSD()->option.isSetDateTime;
}
// オーナー情報のニックネームがセットされているか?
static inline int NCD_GetInputNickname(void)
static inline int NSD_IsSetNickname( void )
{
return (int)GetNCDWork()->option.input_nickname;
return (int)GetNSD()->option.isSetNickname;
}
// GBアプリなど画面ソフトが使うのは上画面
static inline BOOL NSD_IsGBUseTopLCD( void )
{
return (BOOL)GetNSD()->option.isGBUseTopLCD;
}
//=========================================================
// データセット
//=========================================================
//-----------------------------------
// オーナー情報全体のセット。
static inline void NCD_SetOwnerInfo(NvOwnerInfo *owinfop)
// バージョンのセット。
static inline void NSD_SetVersion( u8 version )
{
SVC_CpuCopy( owinfop, &GetNCDWork()->owner, sizeof(NvOwnerInfo), 16);
GetNSD()->version = version;
}
// 好きな色のセット。
static inline void NCD_SetFavoriteColor(u8 favoriteColor)
// バージョンEXのセット。
static inline void NSD_SetExVersion( u8 version )
{
GetNCDWork()->owner.favoriteColor = favoriteColor;
GetNSDEx()->version = version;
}
// オーナー情報のクリア
extern void NSD_ClearOwnerInfo( void );
// オーナー情報全体のセット。
static inline void NSD_SetOwnerInfo( NTROwnerInfo *pOwner )
{
MI_CpuCopy16( pOwner, &GetNSD()->owner, sizeof(NTROwnerInfo) );
}
// ユーザーカラーのセット。
static inline void NSD_SetUserColor( u8 userColor )
{
GetNSD()->owner.userColor = userColor;
}
// 誕生日のセット。
static inline void NCD_SetBirthday(NvDate *birthp)
static inline void NSD_SetBirthday( NTRDate *pBirthday )
{
GetNCDWork()->owner.birthday.month = birthp->month;
GetNCDWork()->owner.birthday.day = birthp->day;
GetNSD()->owner.birthday.month = pBirthday->month;
GetNSD()->owner.birthday.day = pBirthday->day;
}
// ニックネームのセット。
static inline void NCD_SetNickname(NvNickname *namep)
static inline void NSD_SetNickname( NTRNickname *pName )
{
SVC_CpuCopy( namep, &GetNCDWork()->owner.nickname, sizeof(NvNickname), 16);
MI_CpuCopy16( pName, &GetNSD()->owner.nickname, sizeof(NTRNickname) );
}
// コメントのセット。
static inline void NCD_SetComment(NvComment *commentp)
static inline void NSD_SetComment( NTRComment *pComment )
{
SVC_CpuCopy( commentp, &GetNCDWork()->owner.comment, sizeof(NvComment), 16);
MI_CpuCopy16( pComment, &GetNSD()->owner.comment, sizeof(NTRComment) );
}
//-----------------------------------
// アラーム情報のセット。
static inline void NCD_SetAlarmData(NvAlarm *alarmp)
static inline void NSD_SetAlarmData( NTRAlarm *pAlarm )
{
SVC_CpuCopy( alarmp, &GetNCDWork()->alarm, sizeof(NvAlarm), 16);
MI_CpuCopy16( pAlarm, &GetNSD()->alarm, sizeof(NTRAlarm) );
}
//-----------------------------------
// タッチパネルキャリブレーションデータのセット。
static inline void NCD_SetTPCalibration(NvTpCalibData *tp_calibp)
static inline void NSD_SetTPCalibration( NTRTPCalibData *pTPCalib )
{
SVC_CpuCopy( tp_calibp, &GetNCDWork()->tp, sizeof(NvTpCalibData), 16);
MI_CpuCopy16( pTPCalib, &GetNSD()->tp, sizeof(NTRTPCalibData) );
}
//-----------------------------------
// オプション情報のセット。
// 言語コードのセット
static inline void NCD_SetLanguage(NvLangCode language)
#if 0
static inline void NSD_SetLanguage( NTRLangCode language )
{
GetNCDExWork()->language = language;
GetNSDEx()->language = language;
if( language >= LANG_CODE_MAX_WW ) {
GetNCDWork()->option.language = LANG_ENGLISH;
if( language >= NTR_LANG_CODE_MAX_WW ) {
GetNSD()->option.language = NTR_LANG_ENGLISH;
}else {
GetNCDWork()->option.language = language;
GetNSD()->option.language = language;
}
}
#else
static inline void NSD_SetLanguage( NTRLangCode language )
{
GetNSD()->option.language = language;
}
static inline void NSD_SetLanguageEx( NTRLangCode language )
{
GetNSDEx()->language = language;
}
#endif
// 対応言語ビットマップのセット
static inline void NSD_SetLanguageBitmap( u16 valid_language_bitmap )
{
GetNSDEx()->valid_language_bitmap = valid_language_bitmap;
}
// RTCオフセット値のセット
static inline void NCD_SetRtcOffset(s64 rtcOffset)
static inline void NSD_SetRTCOffset( s64 rtcOffset )
{
GetNCDWork()->option.rtcOffset = rtcOffset;
GetNSD()->option.rtcOffset = rtcOffset;
}
// RTCクロック調整値のセット
static inline void NCD_SetRtcClockAdjust(u8 rtcClockAdjust)
static inline void NSD_SetRTCClockAdjust( u8 rtcClockAdjust )
{
GetNCDWork()->option.rtcClockAdjust = rtcClockAdjust;
GetNSD()->option.rtcClockAdjust = rtcClockAdjust;
}
// RTCのLastSetYearへのセット
static inline void NCD_SetRtcLastSetYear(u8 rtcLastSetYear)
static inline void NSD_SetRTCLastSetYear( u8 rtcLastSetYear )
{
GetNCDWork()->option.rtcLastSetYear = rtcLastSetYear;
GetNSD()->option.rtcLastSetYear = rtcLastSetYear;
}
// 起動シーケンスの自動起動ON,OFFフラグをセット。
static inline void NCD_SetAutoBootFlag(BOOL autoBootFlag)
static inline void NSD_SetFlagAutoBoot( BOOL set )
{
GetNCDWork()->option.autoBootFlag = (u16)autoBootFlag;
GetNSD()->option.isAutoBoot = (u16)set;
}
// バックライトON/OFFをセット。
static inline void NSD_SetFlagBacklightOff( BOOL set )
{
GetNSD()->option.isBacklightOff = (u16)set;
}
// バックライト輝度情報をセット。
static inline void NCD_SetBackLightBrightness(BOOL backLightBrightness )
static inline void NSD_SetBacklightBrightness( BOOL backlightBrightness )
{
GetNCDWork()->option.backLightBrightness = (u16)backLightBrightness;
GetNSD()->option.backlightBrightness = (u16)backlightBrightness;
}
// フラッシュ壊れシーケンス中かどうかのフラグセット。
static inline void NCD_SetDestroyFlash(BOOL destroy)
// 初回起動シーケンス中かどうかのフラグセット。
static inline void NSD_SetFlagInitialSequence( BOOL set )
{
GetNCDWork()->option.destroyFlashFlag = (u16)destroy;
GetNSD()->option.initialSequence = (u16)set;
}
// 誕生日データの入力済みフラグセット。
static inline void NCD_SetInputBirthday(BOOL input)
static inline void NSD_SetFlagBirthday( BOOL set )
{
GetNCDWork()->option.input_birthday = (u16)input;
GetNSD()->option.isSetBirthday = (u16)set;
}
// 好きな色データの入力済みフラグセット。
static inline void NCD_SetInputFavoriteColor(BOOL input)
// ユーザーカラーの入力済みフラグセット。
static inline void NSD_SetFlagUserColor( BOOL set )
{
GetNCDWork()->option.input_favoriteColor = (u16)input;
GetNSD()->option.isSetUserColor = (u16)set;
}
// TPキャリブレーションデータの入力済みフラグセット。
static inline void NCD_SetInputTP(BOOL input)
static inline void NSD_SetFlagTP( BOOL set )
{
GetNCDWork()->option.input_tp = (u16)input;
GetNSD()->option.isSetTP = (u16)set;
}
// 言語コードの入力済みフラグセット。
static inline void NCD_SetInputLanguage(BOOL input)
static inline void NSD_SetFlagLanguage( BOOL set )
{
GetNCDWork()->option.input_language = (u16)input;
GetNSD()->option.isSetLanguage = (u16)set;
}
// RTCデータの入力済みフラグセット。
static inline void NCD_SetInputRTC(BOOL input)
// 日付・時刻入力済みフラグセット。
static inline void NSD_SetFlagDateTime( BOOL set )
{
GetNCDWork()->option.input_rtc = (u16)input;
GetNSD()->option.isSetDateTime = (u16)set;
}
// オーナー情報のニックネームの入力済みフラグセット。
static inline void NCD_SetInputNickname(BOOL input)
static inline void NSD_SetFlagNickname( BOOL set )
{
GetNCDWork()->option.input_nickname = (u16)input;
GetNSD()->option.isSetNickname = (u16)set;
}
// GBアプリなど画面ソフトが使う画面フラグをセット
static inline void NSD_SetFlagGBUseTopLCD( BOOL set )
{
GetNSD()->option.isGBUseTopLCD = (u32)set;
}
#endif // SDK_ARM9
#ifdef __cplusplus
@ -480,4 +551,4 @@ static inline void NCD_SetInputNickname(BOOL input)
#endif
#endif // SDK_CW
#endif // NITRO_SETTINGS_H_
#endif // NTR_SETTINGS_H_

View File

@ -22,6 +22,7 @@
#include <sysmenu/rom_header.h>
#include <sysmenu/banner.h>
#include <sysmenu/sysmenu_work.h>
#include <sysmenu/machineSettings.h>
#ifdef __cplusplus
extern "C" {
@ -56,9 +57,13 @@ typedef enum AuthResult {
// global variable------------------------------------------------------
extern void *(*SYSM_Alloc)( u32 size );
extern void (*SYSM_Free)( void *ptr );
// function-------------------------------------------------------------
extern void SYSM_Init( void );
extern void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) );
extern BOOL SYSM_IsLogoDemoSkip( void );
extern void SYSM_CaribrateTP( void );
extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card );
@ -66,6 +71,12 @@ extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size );
extern AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle );
extern void SYSM_Finalize( void );
extern BOOL SYSM_ReadTWLSettingsFile( void );
extern BOOL SYSM_WriteTWLSettingsFile( void );
extern void SYSM_VerifyAndRecoveryNTRSettings( void );
extern void SYSM_SetBackLightBrightness( void );
extern void SYSM_PermitToBootSelectedTarget( void );
extern void SYSM_LoadSYSMData( void );
extern BOOL SYSM_BootNITRO( void );
@ -85,13 +96,12 @@ extern void SYSM_ClearBootFlag( u32 value );
extern void SYSM_GoSleepMode( void );
extern void PMm_SetBackLightBrightness( void );
extern void NCD_ClearOwnerInfo( void ); // ニックネーム・誕生日・好きな色のクリア
extern BOOL SYSM_CheckRTCDate( RTCDate *datep );
extern BOOL SYSM_CheckRTCTime( RTCTime *timep );
extern s64 SYSM_CalcRtcOffsetAndSetDateTime( RTCDate *newDate, RTCTime *newTime );
extern s64 SYSM_CalcRTCOffsetAndSetDateTime( RTCDate *newDate, RTCTime *newTime );
extern u32 SYSM_GetDayNum( u32 year, u32 month );
extern BOOL SYSM_IsLeapYear100( u32 year );