From d4fcce89e6bebfec269525899299c1ff9f693cc5 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 23 Jan 2008 02:28:09 +0000 Subject: [PATCH] =?UTF-8?q?sysmenu=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=83=AA=E3=81=AE=E3=82=BD=E3=83=BC=E3=82=B9=E5=88=86=E5=89=B2?= =?UTF-8?q?=E3=81=8A=E3=82=88=E3=81=B3=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@501 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries_sysmenu/sysmenu/ARM9/Makefile | 10 +- .../sysmenu/ARM9/include/internal_api.h | 63 ++ .../sysmenu/ARM9/include/sysmenu_card.h | 248 ------ .../sysmenu/ARM9/include/sysmenu_define.h | 50 -- .../sysmenu/ARM9/src/banner.c | 107 +++ .../sysmenu/ARM9/src/device.c | 134 ++++ .../sysmenu/ARM9/src/mountInfo.c | 9 +- .../sysmenu/ARM9/src/sysmenu_card.c | 253 ------ .../sysmenu/ARM9/src/sysmenu_lib.c | 729 +----------------- .../sysmenu/ARM9/src/title.c | 568 ++++++++++++++ .../ARM9/src/{sysmenu_util.c => util.c} | 0 11 files changed, 889 insertions(+), 1282 deletions(-) create mode 100644 build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h delete mode 100644 build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_card.h delete mode 100644 build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_define.h create mode 100644 build/libraries_sysmenu/sysmenu/ARM9/src/banner.c create mode 100644 build/libraries_sysmenu/sysmenu/ARM9/src/device.c delete mode 100644 build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_card.c create mode 100644 build/libraries_sysmenu/sysmenu/ARM9/src/title.c rename build/libraries_sysmenu/sysmenu/ARM9/src/{sysmenu_util.c => util.c} (100%) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/Makefile b/build/libraries_sysmenu/sysmenu/ARM9/Makefile index 7a133db4..4929690b 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/Makefile +++ b/build/libraries_sysmenu/sysmenu/ARM9/Makefile @@ -26,8 +26,14 @@ TARGET_PLATFORM = TWL TWL_ARCHGEN = LIMITED TWL_PROC = ARM9 -SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c ninLogoFunc.c \ - mountInfo.c +SRCS = sysmenu_lib.c \ + sysmenu_util.c \ + ninLogoFunc.c \ + mountInfo.c \ + device.c \ + title.c \ + banner.c + TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h b/build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h new file mode 100644 index 00000000..5cdda1f6 --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h @@ -0,0 +1,63 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: internal_api.h + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#ifndef SYSM_INTERNAL_API_H_ +#define SYSM_INTERNAL_API_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +//------------------------------------------------------- +// マウント情報セット +//------------------------------------------------------- + +// ランチャー用 +void SYSMi_SetLauncherMountInfo( void ); + +// 起動アプリ用 +void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle ); + + +//------------------------------------------------------- +// デバイス +//------------------------------------------------------- + +// RTC補正 +void SYSMi_WriteAdjustRTC( void ); + +// RTCチェック +void SYSMi_CheckRTC( void ); + + +//------------------------------------------------------- +// バナー +//------------------------------------------------------- + +// カードバナーリード(※NTR-IPL2仕様) +BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ); + + +#ifdef __cplusplus +} +#endif + +#endif // SYSM_INTERNAL_API_H_ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_card.h b/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_card.h deleted file mode 100644 index eeee6e8d..00000000 --- a/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_card.h +++ /dev/null @@ -1,248 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlIPL - File: SYSM_card.h - - Copyright 2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Date:: $ - $Rev$ - $Author$ - *---------------------------------------------------------------------------*/ - -#ifndef SYSM_CARD_H_ -#define SYSM_CARD_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -//---------------------------------------------------------------------- -// カード抜け検出 -// -//・ARM7 がカードからのダウンロードを完了するまでは検出を開始しません。 -//・検出処理中はカードバスへのアクセスをロックします。 -//・アプリケーションを起動する前に SYSM_FinalizeCardPulledOut() -// を呼び出して確実に検出処理を完了させるようにして下さい。 -//---------------------------------------------------------------------- - -BOOL SYSM_IsCardPulledOut(void); - - -//---------------------------------------------------------------------- -// カード抜け検出終了処理 -//---------------------------------------------------------------------- - -void SYSM_FinalizeCardPulledOut(void); - - -//---------------------------------------------------------------------- -// カード抜け検出処理中か -//---------------------------------------------------------------------- - -BOOL SYSM_IsDetectingCardPulledOut(void); - - -//---------------------------------------------------------------------- -// カード抜け検出初期化 -//---------------------------------------------------------------------- - -void SYSMi_InitCardPulledOut(void); - - -//---------------------------------------------------------------------- -// カードID読み込み -//---------------------------------------------------------------------- - -u32 SYSMi_ReadCardID(void); - - -//---------------------------------------------------------------------- -// カードデータ読み込み -//---------------------------------------------------------------------- - -void SYSM_ReadCard(void *romp, void *ramp, s32 size); - - -//---------------------------------------------------------------------- -// カードのデータ転送はレディか? -//---------------------------------------------------------------------- - -#define SYSMi_IsCardDataReady() \ - \ - (*(vu32 *)REG_CARDCNT & CARD_DATA_READY) - -//・カードのデータ転送はレディかどうかを返します。 - -//---------------------------------------------------------------------- -// カードデータ待ち -//---------------------------------------------------------------------- - -#define SYSMi_WaitCardData() \ -{ \ - while (!SYSMi_IsCardDataReady()) ; \ -} - -//・カードデータ転送の終了を待ちます。 - - -//---------------------------------------------------------------------- -// カードはビジーか? -//---------------------------------------------------------------------- - -#define SYSMi_IsCardBusy() \ - \ - (*(vu32 *)REG_CARDCNT & CARD_START) - -//・カードがビジーかどうかを返します。 - -//---------------------------------------------------------------------- -// カード待ち -//---------------------------------------------------------------------- - -#define SYSMi_WaitCard() \ -{ \ - while (SYSMi_IsCardBusy()) ; \ -} - -//・カードの終了を待ちます。 - - -//---------------------------------------------------------------------- -// コントロールパラメータ獲得(GAMEモード) -//---------------------------------------------------------------------- - -#define SYSMi_GetCardCnt4Game() \ - \ - (*(vu32 *)MROMCNT_GAME_BUF) - -//・GAMEモードのコントロールパラメータを獲得します。 - - - -//---------------------------------------------------------------------- -// ROMエリア・マップ -//---------------------------------------------------------------------- - -#define MROM_SECURE_AREA 0x4000 // SECUREエリア -#define MROM_GAME_AREA 0x8000 // GAMEエリア - -//---------------------------------------------------------------------- -// ROMエリア・サイズ -//---------------------------------------------------------------------- - -#define MROM_SEGMENT_SIZE 0x1000 // セグメントサイズ -#define MROM_SECURE_SIZE 0x4000 // SECUREエリアサイズ - -#ifndef MROM_PAGE_SIZE -#define MROM_PAGE_SIZE 512 // マスクROM・ページ -#endif - -//---------------------------------------------------------------------- -// メモリ・マップ -//---------------------------------------------------------------------- - -#define MROMCNT_GAME_BUF (HW_ROM_HEADER_BUF + 0x60) // GAMEモード・コントロールデータ -#define MROMCNT_SECURE_BUF (HW_ROM_HEADER_BUF + 0x64) // SECUREモード・コントロールデータ - - -//---------------------------------------------------------------------- -// レジスタ・アドレス -//---------------------------------------------------------------------- - -#ifndef REG_BASE -#define REG_BASE 0x04000000 // レジスタ群 -#endif -#ifndef REG_IME -#define REG_IME (REG_BASE + 0x208) // 割り込みマスタイネーブル -#endif - -#define REG_CARDMST_SPI_CNT (REG_BASE + 0x1a0) // カードマスター&SPIコントロール - -#define REG_CARD_MASTER_CNT (REG_BASE + 0x1a1) // カードマスターコントロール - -#define REG_CARD_SPI_CNT (REG_BASE + 0x1a0) // カードSPIコントロール -#define REG_CARD_SPI_DATA (REG_BASE + 0x1a2) // データ - -#define REG_CARDCNT (REG_BASE + 0x1a4) // カードコントロール -#define REG_CARD_CMD (REG_BASE + 0x1a8) // コマンド設定 -#define REG_CARD_DATA (REG_BASE + 0x100010) // データ - - -//---------------------------------------------------------------------- -// カード マスターコントロール -//---------------------------------------------------------------------- - -#define CARDMST_SEL_DEVICE 0x20 // デバイス選択 -#define CARDMST_SEL_ROM 0x00 // マスクROM/3Dメモリ選択 -#define CARDMST_SEL_SPI 0x20 // SPI選択 - -#define CARDMST_IF_ENABLE 0x40 // 割り込み要求 許可 -#define CARDMST_ENABLE 0x80 // カードイネーブル - - -//---------------------------------------------------------------------- -// カードアクセス コントロール -//---------------------------------------------------------------------- - -#define CARD_LATENCY1_CYCLES_MASK 0x00001fff // レイテンシ1のサイクル数 -#define CARD_LATENCY2_CYCLES_MASK 0x003f0000 // レイテンシ2のサイクル数 -#define CARD_LATENCY_MASK 0x003f1fff // 上記を合わせたマスク - -#define CARD_LATENCY1_CYCLES_SHIFT 0 -#define CARD_LATENCY2_CYCLES_SHIFT 16 - -#define CARD_DATA_SCRAMBLE_ON 0x00002000 // データスクランブル ON -#define CARD_SCRAMBLE_UNIT_ON 0x00004000 // スクランブル回路 ON -#define CARD_CMD_SCRAMBLE_ON 0x00400000 // コマンドスクランブル ON - // スクランブルフラグ群のセット -#define CARD_SCRAMBLE_SET_MASK ( CARD_SCRAMBLE_UNIT_ON | CARD_DATA_SCRAMBLE_ON \ - | CARD_CMD_SCRAMBLE_ON) - -#define CARD_DATA_READY 0x00800000 // データ レディ - -#define CARD_1_PAGE 0x01000000 // 1ページ -#define CARD_STATUS 0x07000000 // ステータスリード - -#define CARD_RESET_LO 0x00000000 // リセット信号レベル Lo -#define CARD_RESET_HI 0x20000000 // Hi -#define CARD_ACCESS_MODE 0x40000000 // アクセス モード -#define CARD_READ_MODE 0x00000000 // リードモード -#define CARD_WRITE_MODE 0x40000000 // ライトモード -#define CARD_START 0x80000000 // スタート - -// 構造体メンバ用定数 - -#define ST_CARD_1_PAGE 1 // 1ページ -#define ST_CARD_STATUS 7 // ステータスリード - -#define ST_CARD_READ_MODE 0 // リードモード -#define ST_CARD_WRITE_MODE 1 // ライトモード - - -//---------------------------------------------------------------------- -// マスクROMコマンド -//---------------------------------------------------------------------- - -// GAMEモード - -#define MROMOP_G_OP_MASK 0xff000000 // コマンドマスク - -#define MROMOP_G_READ_ID 0xb8000000 // ID読み込み -#define MROMOP_G_READ_PAGE 0xb7000000 // ページ読み込み - - - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // SYSM_CARD_H_ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_define.h b/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_define.h deleted file mode 100644 index 05e8886f..00000000 --- a/build/libraries_sysmenu/sysmenu/ARM9/include/sysmenu_define.h +++ /dev/null @@ -1,50 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlIPL - File: SYSM_define.h - - Copyright 2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Date:: $ - $Rev$ - $Author$ - *---------------------------------------------------------------------------*/ - -#ifndef __SYSM_DEFINE_H__ -#define __SYSM_DEFINE_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// define data------------------------------------------- - - // 定数 -#define POW_LCDC_SW_TOP 0x0000 // LCD上に画面表示 -#define POW_LCDC_SW_BOTTOM 0x8000 // LCD下に画面表示 -#define POW_E2D2 0x0200 // 2D回路2 の電源ON -#define POW_E2D1 0x0002 // 2D回路1 の電源ON -#define POW_ELC 0x0001 // LCDC回路の電源ON - -#define SUBP_RECV_IF_ENABLE 0x4000 // 割り込み要求受信 許可 - - // 排他制御用ロックID -#define BOOTFLAG_LOCK_ID (OS_MAINP_LOCK_ID_END-1) -#define CARTRIDGE_LOCK_ID (OS_MAINP_LOCK_ID_END-2) - - // SetBootFlag関数の引数int set_clear_flagで指定する定数 -#define SBF_CLEAR 0 -#define SBF_SET 1 - -#ifdef __cplusplus -} -#endif - -#endif // __SYSM_DEFINE_H__ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c b/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c new file mode 100644 index 00000000..b848b23c --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: SYSM_lib.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include +#include "internal_api.h" + +// define data----------------------------------------------------------------- +typedef struct BannerCheckParam { + u8 *pSrc; + u32 size; +}BannerCheckParam; + +// extern data----------------------------------------------------------------- +// function's prototype------------------------------------------------------- +static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner ); + +// global variable------------------------------------------------------------- +// static variable------------------------------------------------------------- + +// const data------------------------------------------------------------------ + +// ============================================================================ +// +// バナー +// +// ============================================================================ + +// カードバナーリード(※NTR-IPL2仕様) +BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ) +{ +#ifndef DEBUG_USED_CARD_SLOT_B_ + // ※スロットAからのリードなら問題ないが、スロットBからは直接読めないので + BOOL isRead; + u16 id = (u16)OS_GetLockID(); + + // ROMカードからのバナーデータのリード + DC_FlushRange( pBanner, sizeof(TWLBannerFile) ); + CARD_LockRom( id ); + CARD_ReadRom( 4, (void *)bannerOffset, pBanner, sizeof(TWLBannerFile) ); + CARD_UnlockRom( id ); + OS_ReleaseLockID( id ); + + isRead = SYSMi_CheckBannerFile( (NTRBannerFile *)pBanner ); + + if( !isRead ) { + MI_CpuClearFast( pBanner, sizeof(TWLBannerFile) ); + } + return isRead; +#else +#pragma unused(bannerOffset) + if( SYSMi_GetWork()->isValidCardBanner ) { + DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 ); + MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) ); + } + return (BOOL)SYSMi_GetWork()->isValidCardBanner; +#endif +} + + + // バナーデータの正誤チェック +static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner ) +{ + int i; + BOOL retval = TRUE; + u16 calc_crc = 0xffff; + u16 *pHeaderCRC = (u16 *)&pBanner->h.crc16_v1; + BannerCheckParam bannerCheckList[ NTR_BNR_VER_MAX ]; + BannerCheckParam *pChk = &bannerCheckList[ 0 ]; + + bannerCheckList[ 0 ].pSrc = (u8 *)&( pBanner->v1 ); + bannerCheckList[ 0 ].size = sizeof( BannerFileV1 ); + bannerCheckList[ 1 ].pSrc = (u8 *)&( pBanner->v2 ); + bannerCheckList[ 1 ].size = sizeof( BannerFileV2 ); + bannerCheckList[ 2 ].pSrc = (u8 *)&( pBanner->v3 ); + bannerCheckList[ 2 ].size = sizeof( BannerFileV3 ); + + for( i = 0; i < NTR_BNR_VER_MAX; i++ ) { + if( i < pBanner->h.version ) { + calc_crc = SVC_GetCRC16( calc_crc, pChk->pSrc, pChk->size ); + if( calc_crc != *pHeaderCRC++ ) { + retval = FALSE; + break; + } + }else { + MI_CpuClear16( pChk->pSrc, pChk->size ); + } + pChk++; + } + + return retval; +} + diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/device.c b/build/libraries_sysmenu/sysmenu/ARM9/src/device.c new file mode 100644 index 00000000..52149cf5 --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/device.c @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: SYSM_lib.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include +#include +#include "internal_api.h" + +// define data----------------------------------------------------------------- +// extern data----------------------------------------------------------------- +// function's prototype------------------------------------------------------- +#ifdef SDK_FINALROM +u32 PM_SendUtilityCommandAsync(u32 number, u16 parameter, u16* retValue, PMCallback callback, void *arg); +u32 PM_SendUtilityCommand(u32 number, u16 parameter, u16* retValue); +u32 PMi_WriteRegister(u16 registerAddr, u16 data); +u32 PMi_WriteRegisterAsync(u16 registerAddr, u16 data, PMCallback callback, void *arg); +#endif // SDK_FINALROM + +// global variable------------------------------------------------------------- +// static variable------------------------------------------------------------- +// const data------------------------------------------------------------------ + +// ============================================================================ +// +// デバイス制御 +// +// ============================================================================ + +// バックライト輝度調整 +void SYSM_SetBackLightBrightness( u8 brightness ) +{ + if( brightness > LCFG_TWL_BACKLIGHT_LEVEL_MAX ) { + OS_Panic( "Backlight brightness over : %d\n", brightness ); + } + ( void )PMi_WriteRegister( 0x20, (u16)brightness ); + LCFG_TSD_SetBacklightBrightness( brightness ); + + // [TODO:] バックライト輝度は毎回セーブせずに、アプリ起動やリセット、電源OFF時に値が変わっていたらセーブするようにする。 + LCFG_WriteTWLSettings(); +} + + +// タッチパネルキャリブレーション +void SYSM_CaribrateTP( void ) +{ + LCFGTWLTPCalibData store; + TPCalibrateParam calibParam; + + // 本体設定データからキャリブレーション情報を取得 + LCFG_TSD_GetTPCalibration( &store ); + + // TPキャリブレーション + ( void )TP_CalcCalibrateParam( &calibParam, // タッチパネル初期化 + store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1, + store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 ); + TP_SetCalibrateParam( &calibParam ); + OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n", + store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1, + store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 ); +} + + +// RTCクロック補正値をセット +void SYSMi_WriteAdjustRTC( void ) +{ + RTCRawAdjust raw; + raw.adjust = LCFG_THW_GetRTCAdjust(); + ( void )RTCi_SetRegAdjust( &raw ); +} + + +// 起動時のRTCチェック +void SYSMi_CheckRTC( void ) +{ + RTCDate date; + RTCTime time; + + // RTCのリセット or おかしい値を検出した場合は初回起動シーケンスへ。 + ( void )RTC_GetDateTime( &date, &time ); + if( !SYSM_CheckRTCDate( &date ) || + !SYSM_CheckRTCTime( &time ) +#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。 + || + SYSMi_GetWork()->isResetRTC +#endif + ) { // RTCの異常を検出したら、rtc入力フラグ&rtcOffsetを0にしてNVRAMに書き込み。 + OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n"); + LCFG_TSD_SetFlagDateTime( FALSE ); + LCFG_TSD_SetRTCOffset( 0 ); + LCFG_TSD_SetRTCLastSetYear( 0 ); + LCFG_WriteTWLSettings(); + } +} + + +#ifdef SDK_FINALROM +/*---------------------------------------------------------------------------* + Name: PMi_WriteRegisterAsync + + Description: send write register command to ARM7 + + Arguments: registerAddr : PMIC register number (0-3) + data : data written to PMIC register + callback : callback function + arg : callback argument + + Returns: result of issueing command + PM_RESULT_BUSY : busy + PM_RESULT_SUCCESS : success + *---------------------------------------------------------------------------*/ +u32 PMi_WriteRegisterAsync(u16 registerAddr, u16 data, PMCallback callback, void *arg) +{ + return PM_SendUtilityCommandAsync(PMi_UTIL_WRITEREG, (u16)((registerAddr<<16) | (data&0xff)), NULL, callback, arg); +} + +u32 PMi_WriteRegister(u16 registerAddr, u16 data) +{ + return PM_SendUtilityCommand(PMi_UTIL_WRITEREG, (u16)((registerAddr<<16) | (data&0xff)), NULL); +} +#endif // SDK_FINALROM diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c index c51e2fc4..8a4d7e28 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c @@ -18,6 +18,7 @@ #include #include #include +#include "internal_api.h" // define data----------------------------------------------------------------- #define DEFAULT_MOUNT_LIST_NUM 7 @@ -33,20 +34,14 @@ // extern data----------------------------------------------------------------- - // function's prototype-------------------------------------------------------- -void SYSMi_SetLauncherMountInfo( void ); -void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ); - static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ); static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ); static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); // global variable------------------------------------------------------------- - // static variable------------------------------------------------------------- - // const data------------------------------------------------------------------ // デフォルトマウント情報リスト @@ -98,7 +93,7 @@ void SYSMi_SetLauncherMountInfo( void ) // システム領域に、ブートするアプリのマウント情報を登録する -void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ) +void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle ) { // マウント情報のクリア MI_CpuClearFast( (void *)HW_TWL_FS_MOUNT_INFO_BUF, HW_TWL_ROM_HEADER_BUF - HW_TWL_FS_MOUNT_INFO_BUF ); diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_card.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_card.c deleted file mode 100644 index 642ca914..00000000 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_card.c +++ /dev/null @@ -1,253 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlIPL - File: SYSM_card.c - - Copyright 2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Date:: $ - $Rev$ - $Author$ - *---------------------------------------------------------------------------*/ - -#include -#include "sysmenu_card.h" - - -typedef enum { - CARD_NOT_DETECTING = 0, - CARD_DETECTING -} CARDPullStatus; - - -typedef struct SYSMCardPullWork -{ - CARDPullStatus pullStatus; - u32 cardCnt; - u16 lockID; - u16 detectPullOut; - -} SYSMCardPullWork; - - -static SYSMCardPullWork cpw; - - -// 内部関数 -void SYSMi_InitCardPulledOut(void); -BOOL SYSMi_IsDetectableCardPulledOut(void); -void SYSMi_StartReadCardID(void); -void SYSMi_ReadCardPage(void *romp, void *ramp, s32 size); -static void SYSMi_SetCardOp(const u32 *op); - - -//---------------------------------------------------------------------- -// カード抜け検出初期化 -//---------------------------------------------------------------------- - -void SYSMi_InitCardPulledOut(void) -{ - cpw.lockID = (u16 )OS_GetLockID(); - cpw.cardCnt = *(vu32 *)MROMCNT_GAME_BUF; -} - - -//---------------------------------------------------------------------- -// カード抜け検出 -//---------------------------------------------------------------------- - -BOOL SYSM_IsCardPulledOut(void) -{ - if (SYSMi_IsDetectableCardPulledOut() == FALSE) return FALSE; - - switch (cpw.pullStatus) { - case CARD_NOT_DETECTING: - if (OS_TryLockCard( cpw.lockID ) == OS_LOCK_SUCCESS ) - { - SYSMi_StartReadCardID(); - cpw.pullStatus = CARD_DETECTING; - } - break; - - case CARD_DETECTING: - if (SYSMi_IsCardDataReady()) { - u32 cardID = *(vu32 *)REG_CARD_DATA; - if ( ( cardID != SYSMi_GetWork()->nCardID ) && - SYSM_IsExistCard() ) - { - cpw.detectPullOut = TRUE; - } - - (void)OS_UnlockCard( cpw.lockID ); - cpw.pullStatus = CARD_NOT_DETECTING; - } - break; - } - - return cpw.detectPullOut; -} - - -//---------------------------------------------------------------------- -// カード抜け検出終了処理 -//---------------------------------------------------------------------- - -void SYSM_FinalizeCardPulledOut(void) -{ - while (SYSM_IsDetectingCardPulledOut()) { - (void)SYSM_IsCardPulledOut(); - } -} - - -//---------------------------------------------------------------------- -// カード抜け検出処理中か -//---------------------------------------------------------------------- - -BOOL SYSM_IsDetectingCardPulledOut(void) -{ - return (cpw.pullStatus == CARD_DETECTING); -} - - -//---------------------------------------------------------------------- -// カード抜け検出の準備ができているか -//---------------------------------------------------------------------- - -BOOL SYSMi_IsDetectableCardPulledOut(void) -{ - return SYSM_IsExistCard(); -} - - -//---------------------------------------------------------------------- -// カードID読み込み開始 -//---------------------------------------------------------------------- - -void SYSMi_StartReadCardID(void) -{ - u32 op[2]; - - op[0] = 0; // コマンド設定 - op[1] = MROMOP_G_READ_ID; - - SYSMi_SetCardOp( op ); - // コントロール設定 - *(vu32 *)REG_CARDCNT = cpw.cardCnt - | CARD_READ_MODE | CARD_STATUS - | CARD_START | CARD_RESET_HI; -} - - -//---------------------------------------------------------------------- -// カードID読み込み -//---------------------------------------------------------------------- - -u32 SYSMi_ReadCardID(void) -{ - u32 op[2]; - - op[0] = 0; // コマンド設定 - op[1] = MROMOP_G_READ_ID; - - SYSMi_SetCardOp( op ); - // コントロール設定 - *(vu32 *)REG_CARDCNT = *(vu32 *)MROMCNT_GAME_BUF - | CARD_READ_MODE | CARD_STATUS - | CARD_START | CARD_RESET_HI; - - SYSMi_WaitCardData(); - - return *(vu32 *)REG_CARD_DATA; -} - - -//---------------------------------------------------------------------- -// カードデータ同期読み込み -//---------------------------------------------------------------------- - -void SYSM_ReadCard(void *romp, void *ramp, s32 size) -{ - s32 restSize = size; - s32 blockSize = MROM_PAGE_SIZE; - - while (restSize > 0) { // ブロック分割読み込み - if (restSize >= MROM_PAGE_SIZE) { size = MROM_PAGE_SIZE; - } else { size = restSize; - } - - SYSMi_ReadCardPage(romp, ramp, size); - - (u8 *)romp += size; - (u8 *)ramp += size; - restSize -= size; - } -} - - -//---------------------------------------------------------------------- -// ページ読み込み -//---------------------------------------------------------------------- - -void SYSMi_ReadCardPage(void *romp, void *ramp, s32 size) -{ - { u32 op[2]; - - op[0] = (u32 )romp <<24; // コマンド設定 - op[1] = MROMOP_G_READ_PAGE | (u32 )romp >>8; - - SYSMi_SetCardOp( op ); - } - - // ページリード - { void *ramEndp; - u32 cardCntTmp; - - *(vu32 *)REG_CARDCNT = *(vu32 *)MROMCNT_GAME_BUF // コントロール設定 - | CARD_READ_MODE | CARD_1_PAGE - | CARD_START | CARD_RESET_HI; - - ramEndp = (u8 *)ramp + size; // 格納終了アドレス算出 - - do { // CPU読み込み - cardCntTmp = *(vu32 *)REG_CARDCNT; - - if (cardCntTmp & CARD_DATA_READY) { - u32 dataTmp = *(vu32 *)REG_CARD_DATA; - - if (ramp < ramEndp) - *((vu32 *)ramp) = dataTmp; // 指定サイズまで格納(後続データは読み捨て) - ((vu32 *)ramp)++; - } - } while (cardCntTmp & CARD_START); - } -} - - -//---------------------------------------------------------------------- -// コマンド設定 -//---------------------------------------------------------------------- - -static void SYSMi_SetCardOp(const u32 *op) -{ - int i; - - *(vu8 *)REG_CARD_MASTER_CNT = CARDMST_SEL_ROM // マスターイネーブル - | CARDMST_ENABLE; - - for (i=0; i<2; i++) { // コマンド設定 - u32 opTmp = op[1 - i]; - vu8 *opDestBasep = (vu8 *)(REG_CARD_CMD + i*4); - - opDestBasep[0] = (u8 )(opTmp >>24); - opDestBasep[1] = (u8 )(opTmp >>16); - opDestBasep[2] = (u8 )(opTmp >>8); - opDestBasep[3] = (u8 )(opTmp >>0); - } -} - diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index dd8aeb85..5f369596 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -17,39 +17,18 @@ #include #include -#include "sysmenu_define.h" -#include -#include +#include "internal_api.h" // define data----------------------------------------------------------------- -#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 ) - -typedef struct BannerCheckParam { - u8 *pSrc; - u32 size; -}BannerCheckParam; - // extern data----------------------------------------------------------------- extern void LCFG_VerifyAndRecoveryNTRSettings( void ); -extern void SYSMi_SetLauncherMountInfo( void ); -extern void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ); // マウント情報のセット - // function's prototype------------------------------------------------------- static TitleProperty *SYSMi_CheckShortcutBoot( void ); static BOOL SYSMi_IsDebuggerBannerViewMode( void ); -static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); -static void SYSMi_WriteAdjustRTC( void ); static int SYSMi_IsValidCard( void ); static BOOL SYSMi_CheckEntryAddress( void ); static void SYSMi_CheckCardCloneBoot( void ); -static void SYSMi_CheckRTC( void ); - -static s32 ReadFile(FSFile* pf, void* buffer, s32 size); - -static void SYSMi_Relocate( void ); -static BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ); -static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner ); // global variable------------------------------------------------------------- void *(*SYSMi_Alloc)( u32 size ); @@ -60,13 +39,9 @@ SYSM_work *pSysm; // #endif // static variable------------------------------------------------------------- -static OSThread thread; -static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); - // const data------------------------------------------------------------------ - // ============================================================================ // // 初期化 @@ -92,12 +67,14 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) ) } +// アリーナ再設定 void SYSM_SetArena( void ) { // ARM9用ブートコード配置のため、アリーナHi位置を下げる OS_SetMainArenaHi( (void *)SYSM_OWN_ARM9_MMEM_ADDR_END ); } + // システムメニューライブラリ用メモリアロケータの設定 void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) ) { @@ -106,6 +83,7 @@ void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) ) } +// メモリAlloc void *SYSM_Alloc( u32 size ) { void *p = SYSMi_Alloc( size ); @@ -113,12 +91,15 @@ void *SYSM_Alloc( u32 size ) return p; } + +// メモリFree void SYSM_Free( void *ptr ) { OS_TPrintf( "SYSM_Free : %08x\n", ptr ); SYSMi_Free( ptr ); } + // ============================================================================ // // 情報取得 @@ -258,185 +239,6 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void ) } -// カードタイトルの取得 -BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) -{ - BOOL retval = FALSE; - - if( SYSMi_GetWork()->isCardStateChanged ) { - - MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) ); - - // ROMヘッダバッファのコピー - if( SYSM_IsExistCard() ) { - u16 id = (u16)OS_GetLockID(); - (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する - DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // キャッシュケア - MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_CARD_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); // ROMヘッダコピー - SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16; // ROMヘッダCRCコピー - SYSMi_GetWork()->isCardStateChanged = FALSE; // カード情報更新フラグを落とす - (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する - OS_ReleaseLockID( id ); - - pTitleList_Card->flags.isValid = TRUE; - pTitleList_Card->flags.isAppLoadCompleted = TRUE; - pTitleList_Card->flags.isAppRelocate = TRUE; - pTitleList_Card->pBanner = NULL; - - // バナーデータのリード - if( SYSM_GetCardRomHeader()->banner_offset && - SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ) ) { - pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; - }else { - MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) ); - } - } - - retval = TRUE; - } - - // タイトル情報フラグのセット - pTitleList_Card->flags.bootType = OS_BOOTTYPE_ROM; - pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo ); - - return retval; -} - - -// 指定ファイルリード -static s32 ReadFile(FSFile* pf, void* buffer, s32 size) -{ - u8* p = (u8*)buffer; - s32 remain = size; - - while( remain > 0 ) - { - const s32 len = MATH_IMin(1024, remain); - const s32 readLen = FS_ReadFile(pf, p, len); - - if( readLen < 0 ) - { - return readLen; - } - if( readLen != len ) - { - return size - remain + readLen; - } - - remain -= readLen; - p += readLen; - } - - return size; -} - - -// NANDタイトルリストの取得 -int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) -{ - // filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。 - // とりあえずALL - OSTick start; - int l; - int gotten; - NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; - - if( listNum > LAUNCHER_TITLE_LIST_NUM ) { - OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM ); - } - - start = OS_GetTick(); - gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 ); - OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); - start = OS_GetTick(); - gotten = NAM_GetNumTitles(); // [TODO:]本来だったら必要ないが、現在はNAM_GetTitleListがアプリ個数をちゃんと返してくれないので。 - OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); - - for(l=0;lisValidTSD; } -// ============================================================================ -// -// アプリ起動 -// -// ============================================================================ - -static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ) -{ - enum - { - region_header = 0, - region_arm9_ntr, - region_arm7_ntr, - region_arm9_twl, - region_arm7_twl, - region_max - }; - // メインメモリのクリア - // DSダウンロードプレイの時は、ROMヘッダを退避する - // アプリロード - // アプリ認証 - - - // ロード - char path[256]; - FSFile file[1]; - BOOL bSuccess; - BOOL isTwlApp = TRUE; - if(pBootTitle->flags.bootType == OS_BOOTTYPE_NAND) - { - // NAND - NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID); - } - else if(pBootTitle->flags.bootType == OS_BOOTTYPE_ROM) - { - // TODO:CARD未読の場合の処理 - } - else if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) - { - // tmpフォルダ - STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID ); - } - else - { - // unknown - return; - } - - bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); - - if( ! bSuccess ) - { -OS_TPrintf("RebootSystem failed: cant open file\n"); - return; - } - - { - int i; - u32 source[region_max]; - u32 length[region_max]; - u32 destaddr[region_max]; - static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32); - s32 readLen; - - // まずROMヘッダを読み込む - // (本来ならここでSRLの正当性判定) - bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET); - - if( ! bSuccess ) - { -OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); - FS_CloseFile(file); - return; - } - - readLen = ReadFile(file, header, (s32)sizeof(header)); - - if( readLen != (s32)sizeof(header) ) - { -OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen); - FS_CloseFile(file); - return; - } - - if( header[0x15C] != 0x56 || header[0x15D] != 0xCF ) - { -int i, j; -for( i = 0; i < 0x20; ++i ) -{ -for( j = 0; j < 0x10; ++j ) -{ -OS_TPrintf("%02X ", header[i * 0x10 + j]); -} -OS_TPrintf("\n"); -} -OS_TPrintf("RebootSystem failed: logo CRC error\n"); - FS_CloseFile(file); - return; - } - - if( header[0x12] && 0x03 == 0 ) - { - //NTR専用ROM - isTwlApp = FALSE; - } - - // 各領域を読み込む - source [region_header ] = 0x00000000; - length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE; - destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF; - - source [region_arm9_ntr] = *(const u32*)&header[0x020]; - length [region_arm9_ntr] = *(const u32*)&header[0x02C]; - destaddr[region_arm9_ntr] = *(const u32*)&header[0x028]; - - source [region_arm7_ntr] = *(const u32*)&header[0x030]; - length [region_arm7_ntr] = *(const u32*)&header[0x03C]; - destaddr[region_arm7_ntr] = *(const u32*)&header[0x038]; - - if( isTwlApp ) - { - source [region_arm9_twl] = *(const u32*)&header[0x1C0]; - length [region_arm9_twl] = *(const u32*)&header[0x1CC]; - destaddr[region_arm9_twl] = *(const u32*)&header[0x1C8]; - - source [region_arm7_twl] = *(const u32*)&header[0x1D0]; - length [region_arm7_twl] = *(const u32*)&header[0x1DC]; - destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8]; - } - - // 領域読み込み先のチェック及び再配置情報データの作成 - // ゲームカードの再配置情報が書き込まれているので、nandアプリロード前に一旦クリア - MI_CpuClearFast(SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info) * RELOCATE_INFO_NUM); - for( i=0; i= ARM9_LTD_STATIC ) continue;// nitroでは読み込まない領域 - if ( !SYSM_CheckLoadRegionAndSetRelocateInfo( (RomSegmentName)i, &(destaddr[i+region_arm9_ntr]), length[i+region_arm9_ntr], - &(SYSMi_GetWork()->romRelocateInfo[i]), isTwlApp ) ) - { - OS_TPrintf("RebootSystem failed: ROM Load Region error\n"); - FS_CloseFile(file); - return; - } - } - - for (i = region_header; i < region_max; ++i) - { - u32 len = length[i]; - - if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 - - bSuccess = FS_SeekFile(file, (s32)source[i], FS_SEEK_SET); - - if( ! bSuccess ) - { -OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]); - FS_CloseFile(file); - return; - } - - readLen = ReadFile(file, (void *)destaddr[i], (s32)len); - - if( readLen != (s32)len ) - { -OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); - FS_CloseFile(file); - return; - } - } - - (void)FS_CloseFile(file); - - if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) - { - // tmpアプリの場合はファイル削除 - // TODO:その他読み込み等の失敗時にもDeleteする必要あり? - (void)FS_DeleteFile(path); - } - } - - // ROMヘッダバッファをコピー - MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - - SYSMi_GetWork()->isLoadSucceeded = TRUE; -} - - -// 指定タイトルを別スレッドでロード開始する -void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) -{ -#define THREAD_PRIO 17 -#define STACK_SIZE 0xc00 - static u64 stack[ STACK_SIZE / sizeof(u64) ]; - - // アプリ未ロード状態なら、ロード開始 - if( !pBootTitle->flags.isAppLoadCompleted ) { - SYSMi_GetWork()->isLoadSucceeded = FALSE; - OS_InitThread(); - OS_CreateThread( &thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); - OS_WakeupThreadDirect( &thread ); - }else if( pBootTitle->flags.isAppRelocate ) { - // アプリロード済みで、再配置要求ありなら、再配置(カードのみ対応) - SYSMi_Relocate(); - SYSMi_GetWork()->isLoadSucceeded = TRUE; - }else - { - // アプリロード済みで、再配置要求なし - SYSMi_GetWork()->isLoadSucceeded = TRUE; - } - - if( pBootTitle->flags.bootType == OS_BOOTTYPE_ROM ) { - SYSMi_GetWork()->isCardBoot = TRUE; - }else if(pBootTitle->flags.isAppLoadCompleted) - { - // カードブートでなく、ロード済みの場合、再配置情報をランチャーパラメタから読み込み - MI_CpuCopy8( SYSM_GetLauncherParamBody()->v1.relocInfo, SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info)*RELOCATE_INFO_NUM ); - // 更にヘッダを再配置 - if( ((ROM_Header_Short *)(OS_TWL_HEADER_PRELOAD_MMEM))->platform_code & PLATFORM_CODE_FLAG_TWL ) { - // TWL-ROMヘッダ情報の再配置 - MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); - MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - }else { - // TWL-ROMヘッダ情報の再配置 - MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - // NTR-ROMヘッダ情報の再配置は、rebootライブラリで行う。 - } - } -} - - -// カードアプリケーションの再配置 -static void SYSMi_Relocate( void ) -{ - u32 size; - u32 *dest = SYSM_GetCardRomHeader()->main_ram_address; - // NTRセキュア領域の再配置 - DC_InvalidateRange( (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア - size = ( SYSM_GetCardRomHeader()->main_size < SECURE_AREA_SIZE ) ? - SYSM_GetCardRomHeader()->main_size : SECURE_AREA_SIZE; - // romの再配置情報を参照して、セキュア領域の再配置先を変更する必要が無いか調べる - if( SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src != NULL ) - { - dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src; - } - MI_CpuCopyFast( (void *)SYSM_CARD_NTR_SECURE_BUF, dest, size ); - - if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) { - // TWLセキュア領域の再配置 - dest = SYSM_GetCardRomHeader()->main_ltd_ram_address; - DC_InvalidateRange( (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア - size = ( SYSM_GetCardRomHeader()->main_ltd_size < SECURE_AREA_SIZE ) ? - SYSM_GetCardRomHeader()->main_ltd_size : SECURE_AREA_SIZE; - // romの再配置情報を参照して、セキュア領域の再配置先を変更する必要が無いか調べる - if( SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src != NULL ) - { - dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src; - } - MI_CpuCopyFast( (void *)SYSM_CARD_TWL_SECURE_BUF, dest, size ); - // TWL-ROMヘッダ情報の再配置 - MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); - MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - }else { - // TWL-ROMヘッダ情報の再配置 - MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); - } -} - - -// アプリロード済み? -BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ) -{ - if( pBootTitle->flags.isAppLoadCompleted ) { - return TRUE; - } - return OS_IsThreadTerminated( &thread ); -} - - -// ロード済みの指定タイトルの認証とブートを行う -AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) -{ - // ロード中 - if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) { - return AUTH_RESULT_PROCESSING; - } - // ロード成功? - if( SYSMi_GetWork()->isLoadSucceeded == FALSE ) - { - return AUTH_RESULT_TITLE_LOAD_FAILED; - } - // パラメータチェック - if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { - return AUTH_RESULT_TITLE_POINTER_ERROR; - } -#if 0 - // エントリアドレスの正当性をチェック - if( !SYSMi_CheckEntryAddress() ) { - return AUTH_RESULT_ENTRY_ADDRESS_ERROR; - } -#endif - - - // ※ROMヘッダ認証 - - - // マウント情報の登録 - SYSM_SetBootAppMountInfo( pBootTitle ); - - // HW_WM_BOOT_BUFへのブート情報セット - { - OSBootInfo *pBootInfo = (OSBootInfo *)OS_GetBootInfo(); - pBootInfo->boot_type = (OSBootType)pBootTitle->flags.bootType; - } - - BOOT_Ready(); // never return. - - return AUTH_RESULT_SUCCEEDED; -} - -#if 0 -// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 -// もしかすると使わないかも -void SYSM_LoadAndAuthenticateTitleThread( TitleProperty *pBootTitle ) -{ - SYSMi_LoadTitleThreadFunc( pBootTitle ); - OS_JoinThread(&thread); - - // 認証 - return SYSM_AuthenticateTitle( pBootTitle ); -} -#endif - - -// ============================================================================ -// -// デバイス制御 -// -// ============================================================================ -#ifdef SDK_FINALROM -u32 PM_SendUtilityCommandAsync(u32 number, u16 parameter, u16* retValue, PMCallback callback, void *arg); -u32 PM_SendUtilityCommand(u32 number, u16 parameter, u16* retValue); -u32 PMi_WriteRegister(u16 registerAddr, u16 data); -u32 PMi_WriteRegisterAsync(u16 registerAddr, u16 data, PMCallback callback, void *arg); -/*---------------------------------------------------------------------------* - Name: PMi_WriteRegisterAsync - - Description: send write register command to ARM7 - - Arguments: registerAddr : PMIC register number (0-3) - data : data written to PMIC register - callback : callback function - arg : callback argument - - Returns: result of issueing command - PM_RESULT_BUSY : busy - PM_RESULT_SUCCESS : success - *---------------------------------------------------------------------------*/ -u32 PMi_WriteRegisterAsync(u16 registerAddr, u16 data, PMCallback callback, void *arg) -{ - return PM_SendUtilityCommandAsync(PMi_UTIL_WRITEREG, (u16)((registerAddr<<16) | (data&0xff)), NULL, callback, arg); -} - -u32 PMi_WriteRegister(u16 registerAddr, u16 data) -{ - return PM_SendUtilityCommand(PMi_UTIL_WRITEREG, (u16)((registerAddr<<16) | (data&0xff)), NULL); -} -#endif - -// バックライト輝度調整 -void SYSM_SetBackLightBrightness( u8 brightness ) -{ - if( brightness > LCFG_TWL_BACKLIGHT_LEVEL_MAX ) { - OS_Panic( "Backlight brightness over : %d\n", brightness ); - } - ( void )PMi_WriteRegister( 0x20, (u16)brightness ); - LCFG_TSD_SetBacklightBrightness( brightness ); - - // [TODO:] バックライト輝度は毎回セーブせずに、アプリ起動やリセット、電源OFF時に値が変わっていたらセーブするようにする。 - LCFG_WriteTWLSettings(); -} - - -// タッチパネルキャリブレーション -void SYSM_CaribrateTP( void ) -{ - LCFGTWLTPCalibData store; - TPCalibrateParam calibParam; - - // 本体設定データからキャリブレーション情報を取得 - LCFG_TSD_GetTPCalibration( &store ); - - // TPキャリブレーション - ( void )TP_CalcCalibrateParam( &calibParam, // タッチパネル初期化 - store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1, - store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 ); - TP_SetCalibrateParam( &calibParam ); - OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n", - store.data.raw_x1, store.data.raw_y1, (u16)store.data.dx1, (u16)store.data.dy1, - store.data.raw_x2, store.data.raw_y2, (u16)store.data.dx2, (u16)store.data.dy2 ); -} - - -// RTCクロック補正値をセット -static void SYSMi_WriteAdjustRTC( void ) -{ - RTCRawAdjust raw; - raw.adjust = LCFG_THW_GetRTCAdjust(); - ( void )RTCi_SetRegAdjust( &raw ); -} - - -// ============================================================================ -// -// バナー -// -// ============================================================================ - -// バナーファイルの読み込みの実体 -static BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ) -{ -#ifndef DEBUG_USED_CARD_SLOT_B_ - // ※スロットAからのリードなら問題ないが、スロットBからは直接読めないので - BOOL isRead; - u16 id = (u16)OS_GetLockID(); - - // ROMカードからのバナーデータのリード - DC_FlushRange( pBanner, sizeof(TWLBannerFile) ); - CARD_LockRom( id ); - CARD_ReadRom( 4, (void *)bannerOffset, pBanner, sizeof(TWLBannerFile) ); - CARD_UnlockRom( id ); - OS_ReleaseLockID( id ); - - isRead = SYSMi_CheckBannerFile( (NTRBannerFile *)pBanner ); - - if( !isRead ) { - MI_CpuClearFast( pBanner, sizeof(TWLBannerFile) ); - } - return isRead; -#else -#pragma unused(bannerOffset) - if( SYSMi_GetWork()->isValidCardBanner ) { - DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 ); - MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) ); - } - return (BOOL)SYSMi_GetWork()->isValidCardBanner; -#endif -} - - - // バナーデータの正誤チェック -static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner ) -{ - int i; - BOOL retval = TRUE; - u16 calc_crc = 0xffff; - u16 *pHeaderCRC = (u16 *)&pBanner->h.crc16_v1; - BannerCheckParam bannerCheckList[ NTR_BNR_VER_MAX ]; - BannerCheckParam *pChk = &bannerCheckList[ 0 ]; - - bannerCheckList[ 0 ].pSrc = (u8 *)&( pBanner->v1 ); - bannerCheckList[ 0 ].size = sizeof( BannerFileV1 ); - bannerCheckList[ 1 ].pSrc = (u8 *)&( pBanner->v2 ); - bannerCheckList[ 1 ].size = sizeof( BannerFileV2 ); - bannerCheckList[ 2 ].pSrc = (u8 *)&( pBanner->v3 ); - bannerCheckList[ 2 ].size = sizeof( BannerFileV3 ); - - for( i = 0; i < NTR_BNR_VER_MAX; i++ ) { - if( i < pBanner->h.version ) { - calc_crc = SVC_GetCRC16( calc_crc, pChk->pSrc, pChk->size ); - if( calc_crc != *pHeaderCRC++ ) { - retval = FALSE; - break; - } - }else { - MI_CpuClear16( pChk->pSrc, pChk->size ); - } - pChk++; - } - - return retval; -} - //====================================================================== // @@ -1083,30 +392,6 @@ static void SYSMi_CheckCardCloneBoot( void ) } -// 起動時のRTCチェック -static void SYSMi_CheckRTC( void ) -{ - RTCDate date; - RTCTime time; - - // RTCのリセット or おかしい値を検出した場合は初回起動シーケンスへ。 - ( void )RTC_GetDateTime( &date, &time ); - if( !SYSM_CheckRTCDate( &date ) || - !SYSM_CheckRTCTime( &time ) -#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。 - || - SYSMi_GetWork()->isResetRTC -#endif - ) { // RTCの異常を検出したら、rtc入力フラグ&rtcOffsetを0にしてNVRAMに書き込み。 - OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n"); - LCFG_TSD_SetFlagDateTime( FALSE ); - LCFG_TSD_SetRTCOffset( 0 ); - LCFG_TSD_SetRTCLastSetYear( 0 ); - LCFG_WriteTWLSettings(); - } -} - - //====================================================================== // デバッグ //====================================================================== diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c new file mode 100644 index 00000000..9c2f77de --- /dev/null +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -0,0 +1,568 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: SYSM_lib.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ + +#include +#include +#include +#include "internal_api.h" + +// define data----------------------------------------------------------------- +#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 ) + +// extern data----------------------------------------------------------------- +// function's prototype------------------------------------------------------- +static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); +static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); +static void SYSMi_Relocate( void ); +static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); + +// global variable------------------------------------------------------------- +// static variable------------------------------------------------------------- +static OSThread s_thread; +static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); + +// const data------------------------------------------------------------------ + +// ============================================================================ +// +// 情報取得 +// +// ============================================================================ + +// カードタイトルの取得 +BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) +{ + BOOL retval = FALSE; + + if( SYSMi_GetWork()->isCardStateChanged ) { + + MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) ); + + // ROMヘッダバッファのコピー + if( SYSM_IsExistCard() ) { + u16 id = (u16)OS_GetLockID(); + (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する + DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // キャッシュケア + MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_CARD_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); // ROMヘッダコピー + SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16; // ROMヘッダCRCコピー + SYSMi_GetWork()->isCardStateChanged = FALSE; // カード情報更新フラグを落とす + (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する + OS_ReleaseLockID( id ); + + pTitleList_Card->flags.isValid = TRUE; + pTitleList_Card->flags.isAppLoadCompleted = TRUE; + pTitleList_Card->flags.isAppRelocate = TRUE; + pTitleList_Card->pBanner = NULL; + + // バナーデータのリード + if( SYSM_GetCardRomHeader()->banner_offset && + SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ) ) { + pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; + }else { + MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) ); + } + } + + retval = TRUE; + } + + // タイトル情報フラグのセット + pTitleList_Card->flags.bootType = OS_BOOTTYPE_ROM; + pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo ); + + return retval; +} + + +// 指定ファイルリード +static s32 ReadFile(FSFile* pf, void* buffer, s32 size) +{ + u8* p = (u8*)buffer; + s32 remain = size; + + while( remain > 0 ) + { + const s32 len = MATH_IMin(1024, remain); + const s32 readLen = FS_ReadFile(pf, p, len); + + if( readLen < 0 ) + { + return readLen; + } + if( readLen != len ) + { + return size - remain + readLen; + } + + remain -= readLen; + p += readLen; + } + + return size; +} + + +// NANDタイトルリストの取得 +int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) +{ + // filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。 + // とりあえずALL + OSTick start; + int l; + int gotten; + NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; + + if( listNum > LAUNCHER_TITLE_LIST_NUM ) { + OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM ); + } + + start = OS_GetTick(); + gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 ); + OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + start = OS_GetTick(); + gotten = NAM_GetNumTitles(); // [TODO:]本来だったら必要ないが、現在はNAM_GetTitleListがアプリ個数をちゃんと返してくれないので。 + OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + + for(l=0;lflags.bootType == OS_BOOTTYPE_NAND) + { + // NAND + NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID); + } + else if(pBootTitle->flags.bootType == OS_BOOTTYPE_ROM) + { + // TODO:CARD未読の場合の処理 + } + else if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) + { + // tmpフォルダ + STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID ); + } + else + { + // unknown + return; + } + + bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); + + if( ! bSuccess ) + { +OS_TPrintf("RebootSystem failed: cant open file\n"); + return; + } + + { + int i; + u32 source[region_max]; + u32 length[region_max]; + u32 destaddr[region_max]; + static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32); + s32 readLen; + + // まずROMヘッダを読み込む + // (本来ならここでSRLの正当性判定) + bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET); + + if( ! bSuccess ) + { +OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); + FS_CloseFile(file); + return; + } + + readLen = ReadFile(file, header, (s32)sizeof(header)); + + if( readLen != (s32)sizeof(header) ) + { +OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen); + FS_CloseFile(file); + return; + } + + if( header[0x15C] != 0x56 || header[0x15D] != 0xCF ) + { +int i, j; +for( i = 0; i < 0x20; ++i ) +{ +for( j = 0; j < 0x10; ++j ) +{ +OS_TPrintf("%02X ", header[i * 0x10 + j]); +} +OS_TPrintf("\n"); +} +OS_TPrintf("RebootSystem failed: logo CRC error\n"); + FS_CloseFile(file); + return; + } + + if( header[0x12] && 0x03 == 0 ) + { + //NTR専用ROM + isTwlApp = FALSE; + } + + // 各領域を読み込む + source [region_header ] = 0x00000000; + length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE; + destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF; + + source [region_arm9_ntr] = *(const u32*)&header[0x020]; + length [region_arm9_ntr] = *(const u32*)&header[0x02C]; + destaddr[region_arm9_ntr] = *(const u32*)&header[0x028]; + + source [region_arm7_ntr] = *(const u32*)&header[0x030]; + length [region_arm7_ntr] = *(const u32*)&header[0x03C]; + destaddr[region_arm7_ntr] = *(const u32*)&header[0x038]; + + if( isTwlApp ) + { + source [region_arm9_twl] = *(const u32*)&header[0x1C0]; + length [region_arm9_twl] = *(const u32*)&header[0x1CC]; + destaddr[region_arm9_twl] = *(const u32*)&header[0x1C8]; + + source [region_arm7_twl] = *(const u32*)&header[0x1D0]; + length [region_arm7_twl] = *(const u32*)&header[0x1DC]; + destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8]; + } + + // 領域読み込み先のチェック及び再配置情報データの作成 + // ゲームカードの再配置情報が書き込まれているので、nandアプリロード前に一旦クリア + MI_CpuClearFast(SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info) * RELOCATE_INFO_NUM); + for( i=0; i= ARM9_LTD_STATIC ) continue;// nitroでは読み込まない領域 + if ( !SYSM_CheckLoadRegionAndSetRelocateInfo( (RomSegmentName)i, &(destaddr[i+region_arm9_ntr]), length[i+region_arm9_ntr], + &(SYSMi_GetWork()->romRelocateInfo[i]), isTwlApp ) ) + { + OS_TPrintf("RebootSystem failed: ROM Load Region error\n"); + FS_CloseFile(file); + return; + } + } + + for (i = region_header; i < region_max; ++i) + { + u32 len = length[i]; + + if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 + + bSuccess = FS_SeekFile(file, (s32)source[i], FS_SEEK_SET); + + if( ! bSuccess ) + { +OS_TPrintf("RebootSystem failed: cant seek file(%d)\n", source[i]); + FS_CloseFile(file); + return; + } + + readLen = ReadFile(file, (void *)destaddr[i], (s32)len); + + if( readLen != (s32)len ) + { +OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); + FS_CloseFile(file); + return; + } + } + + (void)FS_CloseFile(file); + + if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP) + { + // tmpアプリの場合はファイル削除 + // TODO:その他読み込み等の失敗時にもDeleteする必要あり? + (void)FS_DeleteFile(path); + } + } + + // ROMヘッダバッファをコピー + MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + + SYSMi_GetWork()->isLoadSucceeded = TRUE; +} + + +// 指定タイトルを別スレッドでロード開始する +void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) +{ +#define THREAD_PRIO 17 +#define STACK_SIZE 0xc00 + static u64 stack[ STACK_SIZE / sizeof(u64) ]; + + // アプリ未ロード状態なら、ロード開始 + if( !pBootTitle->flags.isAppLoadCompleted ) { + SYSMi_GetWork()->isLoadSucceeded = FALSE; + OS_InitThread(); + OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); + OS_WakeupThreadDirect( &s_thread ); + }else if( pBootTitle->flags.isAppRelocate ) { + // アプリロード済みで、再配置要求ありなら、再配置(カードのみ対応) + SYSMi_Relocate(); + SYSMi_GetWork()->isLoadSucceeded = TRUE; + }else + { + // アプリロード済みで、再配置要求なし + SYSMi_GetWork()->isLoadSucceeded = TRUE; + } + + if( pBootTitle->flags.bootType == OS_BOOTTYPE_ROM ) { + SYSMi_GetWork()->isCardBoot = TRUE; + }else if(pBootTitle->flags.isAppLoadCompleted) + { + // カードブートでなく、ロード済みの場合、再配置情報をランチャーパラメタから読み込み + MI_CpuCopy8( SYSM_GetLauncherParamBody()->v1.relocInfo, SYSMi_GetWork()->romRelocateInfo, sizeof(Relocate_Info)*RELOCATE_INFO_NUM ); + // 更にヘッダを再配置 + if( ((ROM_Header_Short *)(OS_TWL_HEADER_PRELOAD_MMEM))->platform_code & PLATFORM_CODE_FLAG_TWL ) { + // TWL-ROMヘッダ情報の再配置 + MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); + MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + }else { + // TWL-ROMヘッダ情報の再配置 + MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + // NTR-ROMヘッダ情報の再配置は、rebootライブラリで行う。 + } + } +} + + +// カードアプリケーションの再配置 +static void SYSMi_Relocate( void ) +{ + u32 size; + u32 *dest = SYSM_GetCardRomHeader()->main_ram_address; + // NTRセキュア領域の再配置 + DC_InvalidateRange( (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア + size = ( SYSM_GetCardRomHeader()->main_size < SECURE_AREA_SIZE ) ? + SYSM_GetCardRomHeader()->main_size : SECURE_AREA_SIZE; + // romの再配置情報を参照して、セキュア領域の再配置先を変更する必要が無いか調べる + if( SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src != NULL ) + { + dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC].src; + } + MI_CpuCopyFast( (void *)SYSM_CARD_NTR_SECURE_BUF, dest, size ); + + if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) { + // TWLセキュア領域の再配置 + dest = SYSM_GetCardRomHeader()->main_ltd_ram_address; + DC_InvalidateRange( (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア + size = ( SYSM_GetCardRomHeader()->main_ltd_size < SECURE_AREA_SIZE ) ? + SYSM_GetCardRomHeader()->main_ltd_size : SECURE_AREA_SIZE; + // romの再配置情報を参照して、セキュア領域の再配置先を変更する必要が無いか調べる + if( SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src != NULL ) + { + dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src; + } + MI_CpuCopyFast( (void *)SYSM_CARD_TWL_SECURE_BUF, dest, size ); + // TWL-ROMヘッダ情報の再配置 + MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, SYSM_CARD_ROM_HEADER_SIZE ); + MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + }else { + // TWL-ROMヘッダ情報の再配置 + MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + } +} + + +// アプリロード済み? +BOOL SYSM_IsLoadTitleFinished( TitleProperty *pBootTitle ) +{ + if( pBootTitle->flags.isAppLoadCompleted ) { + return TRUE; + } + return OS_IsThreadTerminated( &s_thread ); +} + + +// ロード済みの指定タイトルの認証とブートを行う +AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) +{ + // ロード中 + if( !SYSM_IsLoadTitleFinished( pBootTitle ) ) { + return AUTH_RESULT_PROCESSING; + } + // ロード成功? + if( SYSMi_GetWork()->isLoadSucceeded == FALSE ) + { + return AUTH_RESULT_TITLE_LOAD_FAILED; + } + // パラメータチェック + if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { + return AUTH_RESULT_TITLE_POINTER_ERROR; + } +#if 0 + // エントリアドレスの正当性をチェック + if( !SYSMi_CheckEntryAddress() ) { + return AUTH_RESULT_ENTRY_ADDRESS_ERROR; + } +#endif + + + // ※ROMヘッダ認証 + + + // マウント情報の登録 + SYSMi_SetBootAppMountInfo( pBootTitle ); + + // HW_WM_BOOT_BUFへのブート情報セット + { + OSBootInfo *pBootInfo = (OSBootInfo *)OS_GetBootInfo(); + pBootInfo->boot_type = (OSBootType)pBootTitle->flags.bootType; + } + + BOOT_Ready(); // never return. + + return AUTH_RESULT_SUCCEEDED; +} + +#if 0 +// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 +// もしかすると使わないかも +void SYSM_LoadAndAuthenticateTitleThread( TitleProperty *pBootTitle ) +{ + SYSMi_LoadTitleThreadFunc( pBootTitle ); + OS_JoinThread(&s_thread); + + // 認証 + return SYSM_AuthenticateTitle( pBootTitle ); +} +#endif + + +// 指定タイトルがブート可能なポインタかチェック +static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ) +{ +#pragma unused( pBootTitle ) + + return TRUE; +} + + diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c b/build/libraries_sysmenu/sysmenu/ARM9/src/util.c similarity index 100% rename from build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_util.c rename to build/libraries_sysmenu/sysmenu/ARM9/src/util.c