diff --git a/build/libraries_sysmenu/acsign/ARM9/Makefile b/build/libraries_sysmenu/acsign/ARM9/Makefile index f9213837..88de2a3b 100644 --- a/build/libraries_sysmenu/acsign/ARM9/Makefile +++ b/build/libraries_sysmenu/acsign/ARM9/Makefile @@ -24,7 +24,7 @@ SUBDIRS = #---------------------------------------------------------------------------- TARGET_FIRM = SYSTEMMENU TARGET_PLATFORM = TWL -TWL_ARCHGEN = LIMITED +#TWL_ARCHGEN = LIMITED TWL_PROC = ARM9 INCDIR = include \ diff --git a/build/libraries_sysmenu/mb_loader/ARM7/Makefile b/build/libraries_sysmenu/mb_loader/ARM7/Makefile index c678ae77..e53833a2 100644 --- a/build/libraries_sysmenu/mb_loader/ARM7/Makefile +++ b/build/libraries_sysmenu/mb_loader/ARM7/Makefile @@ -21,7 +21,7 @@ SUBDIRS = #---------------------------------------------------------------------------- TARGET_FIRM = SYSTEMMENU TARGET_PLATFORM = TWL -TWL_ARCHGEN = LIMITED +#TWL_ARCHGEN = LIMITED TWL_PROC = ARM7 #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/mb_loader/ARM9/Makefile b/build/libraries_sysmenu/mb_loader/ARM9/Makefile index 257cddcd..c65be8d9 100644 --- a/build/libraries_sysmenu/mb_loader/ARM9/Makefile +++ b/build/libraries_sysmenu/mb_loader/ARM9/Makefile @@ -21,7 +21,7 @@ SUBDIRS = #---------------------------------------------------------------------------- TARGET_FIRM = SYSTEMMENU TARGET_PLATFORM = TWL -TWL_ARCHGEN = LIMITED +#TWL_ARCHGEN = LIMITED TWL_PROC = ARM9 #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index 4a3123e1..7fafe336 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -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 diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c b/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c index 6cfbd2b8..6f50f113 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c @@ -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は、日・英・独・仏・伊・西の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 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"); } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 95d58f14..ffa27f17 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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 ); -} - - //====================================================================== -// デバッグ関数 +// デバッグ //====================================================================== // 初期データのデバッグ表示 diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c index 76c45b10..06a1f992 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c @@ -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のとりうる範2000〜2100年に限定する。 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; +} + diff --git a/build/systemMenu_RED/MachineSettings/ARM9/Makefile b/build/systemMenu_RED/MachineSettings/ARM9/Makefile index 6454a1f9..1dd5136b 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/Makefile +++ b/build/systemMenu_RED/MachineSettings/ARM9/Makefile @@ -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 diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c index 9105a7de..a3570bed 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c @@ -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(); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c index 8cd7d8bd..f60287f5 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c @@ -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 ) // メニューに戻る 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"); } diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c index a0e86317..4d2fb393 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -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 ); -} - - // ============================================================================ // 割り込み処理 // ============================================================================ diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c b/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c index 03f8c502..b04065ff 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c @@ -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; diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h b/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h index e0f0a404..c2178276 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h @@ -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 ); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c index 49b3f64f..2b564e22 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c @@ -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 ) { diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c index 20f9457a..2bdf848b 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c @@ -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; // オーナー情報編集に戻る diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c index 3c6ffe32..05463abe 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c @@ -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(); } diff --git a/build/systemMenu_RED/PictoChat/ARM9/src/main.c b/build/systemMenu_RED/PictoChat/ARM9/src/main.c index c4325585..9c9a10ba 100644 --- a/build/systemMenu_RED/PictoChat/ARM9/src/main.c +++ b/build/systemMenu_RED/PictoChat/ARM9/src/main.c @@ -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) } -// アロケータの初期化 -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); -} - - // ============================================================================ // 割り込み処理 // ============================================================================ diff --git a/include/sysmenu/machineSettings.h b/include/sysmenu/machineSettings.h index be955cd0..e9e425e1 100644 --- a/include/sysmenu/machineSettings.h +++ b/include/sysmenu/machineSettings.h @@ -19,6 +19,7 @@ #define SYSM_MACHINE_SETTINGS_H_ #include +#include #ifdef __cplusplus extern "C" { @@ -28,5 +29,5 @@ extern "C" { } /* extern "C" */ #endif -/* SYSM_MACHINE_SETTINGs_H_ */ +/* SYSM_MACHINE_SETTINGS_H_ */ #endif diff --git a/include/sysmenu/machineSettings/common/nitroSettings.h b/include/sysmenu/machineSettings/common/nitroSettings.h index 9dca4b71..e4423617 100644 --- a/include/sysmenu/machineSettings/common/nitroSettings.h +++ b/include/sysmenu/machineSettings/common/nitroSettings.h @@ -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 @@ -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; // 月:01〜12 u8 day; // 日:01〜31 -}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; // アラーム時:00〜23 u8 minute; // アラーム分:00〜59 u8 rsv1; // 予約 u8 pad; u16 alarmOn : 1; // アラームON,OFF(0:OFF, 1:ON) u16 rsv2 : 15; // 予約 -}NvAlarm; // 6byte +}NTRAlarm; // 6byte // タッチパネルキャリブレーションデータ -typedef struct NvTpCalibData{ +typedef struct NTRTPCalibData{ u16 raw_x1; // 第1キャリブレーション点の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アプリなど1画面ソフトが使うのは上画面? +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アプリなど1画面ソフトが使う画面フラグをセット +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_ diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index a5d2c550..7d1495c6 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -22,6 +22,7 @@ #include #include #include +#include #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 );