mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
sysmenuライブラリのソース分割および不要なファイルの削除。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@501 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
6ae41fdeb0
commit
d4fcce89e6
@ -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
|
||||
|
||||
|
||||
63
build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h
Normal file
63
build/libraries_sysmenu/sysmenu/ARM9/include/internal_api.h
Normal 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_
|
||||
@ -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 // データスクランブル 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_
|
||||
@ -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__
|
||||
107
build/libraries_sysmenu/sysmenu/ARM9/src/banner.c
Normal file
107
build/libraries_sysmenu/sysmenu/ARM9/src/banner.c
Normal 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;
|
||||
}
|
||||
|
||||
134
build/libraries_sysmenu/sysmenu/ARM9/src/device.c
Normal file
134
build/libraries_sysmenu/sysmenu/ARM9/src/device.c
Normal 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
|
||||
@ -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 );
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//======================================================================
|
||||
// デバッグ
|
||||
//======================================================================
|
||||
|
||||
568
build/libraries_sysmenu/sysmenu/ARM9/src/title.c
Normal file
568
build/libraries_sysmenu/sysmenu/ARM9/src/title.c
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user