sysmenuライブラリのソース分割および不要なファイルの削除。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@501 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-01-23 02:28:09 +00:00
parent 6ae41fdeb0
commit d4fcce89e6
11 changed files with 889 additions and 1282 deletions

View File

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

View File

@ -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 <twl.h>
#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_

View File

@ -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 <twl.h>
#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 // データスクランブル
#define CARD_SCRAMBLE_UNIT_ON 0x00004000 // スクランブル回路
#define CARD_CMD_SCRAMBLE_ON 0x00400000 // コマンドスクランブル
// スクランブルフラグ群のセット
#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 // リセット信号レベル
#define CARD_RESET_HI 0x20000000 //
#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_

View File

@ -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 <twl.h>
#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__

View File

@ -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 <twl.h>
#include <sysmenu.h>
#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;
}

View File

@ -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 <twl.h>
#include <sysmenu.h>
#include <spi.h>
#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

View File

@ -18,6 +18,7 @@
#include <twl.h>
#include <twl/nam.h>
#include <sysmenu.h>
#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 );

View File

@ -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 <sysmenu/sysmenu_lib/ARM9/sysmenu_api.h>
#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);
}
}

View File

@ -17,39 +17,18 @@
#include <twl.h>
#include <sysmenu.h>
#include "sysmenu_define.h"
#include <spi.h>
#include <es.h>
#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;l<gotten;l++)
{
//ヘッダからバナーを読み込む
FSFile file[1];
BOOL bSuccess;
static const int PATH_LENGTH=1024;
char path[PATH_LENGTH];
static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32);
s32 readLen;
s32 offset;
start = OS_GetTick();
readLen = NAM_GetTitleBootContentPathFast(path, titleIdArray[l]);
OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
if(readLen != NAM_OK){
OS_TPrintf("NAM_GetTitleBootContentPath failed %d,%lld,%d\n",l,titleIdArray[l],readLen);
}
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path);
return -1;
}
// バナーデータオフセットを読み込む
bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n");
FS_CloseFile(file);
return -1;
}
readLen = FS_ReadFile(file, &offset, sizeof(offset));
if( readLen != sizeof(offset) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n");
FS_CloseFile(file);
return -1;
}
bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n");
FS_CloseFile(file);
return -1;
}
readLen = ReadFile(file, &s_bannerBuf[l], (s32)sizeof(TWLBannerFile));
if( readLen != (s32)sizeof(TWLBannerFile) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
FS_CloseFile(file);
return -1;
}
FS_CloseFile(file);
}
for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
// 念のため0にクリア
titleIdArray[l] = 0;
}
// カードアプリ部分を除いたリストクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum = (gotten<listNum) ? gotten : listNum;
for(l=0;l<listNum;l++)
{
pTitleList_Nand[l+1].titleID = titleIdArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIdArray[l] ) {
pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.bootType = OS_BOOTTYPE_NAND;
}
}
// return : *TitleProperty Array
return listNum;
}
// ランチャーパラメータの取得
const LauncherParamBody *SYSM_GetLauncherParamBody( void )
{
@ -471,15 +273,6 @@ static BOOL SYSMi_IsDebuggerBannerViewMode( void )
}
// 指定タイトルがブート可能なポインタかチェック
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
{
#pragma unused( pBootTitle )
return TRUE;
}
// TPリード可能状態か
BOOL SYSM_IsTPReadable( void )
{
@ -500,490 +293,6 @@ BOOL SYSM_IsValidTSD( void )
return (BOOL)SYSMi_GetWork()->isValidTSD;
}
// ============================================================================
//
// アプリ起動
//
// ============================================================================
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<RELOCATE_INFO_NUM; i++ )
{
if ( !isTwlApp && 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();
}
}
//======================================================================
// デバッグ
//======================================================================

View File

@ -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 <twl.h>
#include <sysmenu.h>
#include <es.h>
#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;l<gotten;l++)
{
//ヘッダからバナーを読み込む
FSFile file[1];
BOOL bSuccess;
static const int PATH_LENGTH=1024;
char path[PATH_LENGTH];
static u8 header[HW_TWL_ROM_HEADER_BUF_SIZE] ATTRIBUTE_ALIGN(32);
s32 readLen;
s32 offset;
start = OS_GetTick();
readLen = NAM_GetTitleBootContentPathFast(path, titleIdArray[l]);
OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
if(readLen != NAM_OK){
OS_TPrintf("NAM_GetTitleBootContentPath failed %d,%lld,%d\n",l,titleIdArray[l],readLen);
}
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path);
return -1;
}
// バナーデータオフセットを読み込む
bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n");
FS_CloseFile(file);
return -1;
}
readLen = FS_ReadFile(file, &offset, sizeof(offset));
if( readLen != sizeof(offset) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n");
FS_CloseFile(file);
return -1;
}
bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n");
FS_CloseFile(file);
return -1;
}
readLen = ReadFile(file, &s_bannerBuf[l], (s32)sizeof(TWLBannerFile));
if( readLen != (s32)sizeof(TWLBannerFile) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
FS_CloseFile(file);
return -1;
}
FS_CloseFile(file);
}
for(l=gotten;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
// 念のため0にクリア
titleIdArray[l] = 0;
}
// カードアプリ部分を除いたリストクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum = (gotten<listNum) ? gotten : listNum;
for(l=0;l<listNum;l++)
{
pTitleList_Nand[l+1].titleID = titleIdArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIdArray[l] ) {
pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.bootType = OS_BOOTTYPE_NAND;
}
}
// return : *TitleProperty Array
return listNum;
}
// ============================================================================
//
// アプリ起動
//
// ============================================================================
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<RELOCATE_INFO_NUM; i++ )
{
if ( !isTwlApp && 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;
}