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_ARCHGEN = LIMITED
|
||||||
TWL_PROC = ARM9
|
TWL_PROC = ARM9
|
||||||
|
|
||||||
SRCS = sysmenu_lib.c sysmenu_card.c sysmenu_util.c ninLogoFunc.c \
|
SRCS = sysmenu_lib.c \
|
||||||
mountInfo.c
|
sysmenu_util.c \
|
||||||
|
ninLogoFunc.c \
|
||||||
|
mountInfo.c \
|
||||||
|
device.c \
|
||||||
|
title.c \
|
||||||
|
banner.c
|
||||||
|
|
||||||
|
|
||||||
TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a
|
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.h>
|
||||||
#include <twl/nam.h>
|
#include <twl/nam.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
#include "internal_api.h"
|
||||||
|
|
||||||
// define data-----------------------------------------------------------------
|
// define data-----------------------------------------------------------------
|
||||||
#define DEFAULT_MOUNT_LIST_NUM 7
|
#define DEFAULT_MOUNT_LIST_NUM 7
|
||||||
@ -33,20 +34,14 @@
|
|||||||
|
|
||||||
|
|
||||||
// extern data-----------------------------------------------------------------
|
// extern data-----------------------------------------------------------------
|
||||||
|
|
||||||
// function's prototype--------------------------------------------------------
|
// function's prototype--------------------------------------------------------
|
||||||
void SYSMi_SetLauncherMountInfo( void );
|
|
||||||
void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle );
|
|
||||||
|
|
||||||
static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID );
|
static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID );
|
||||||
static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc );
|
static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc );
|
||||||
static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
|
static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
|
||||||
static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
|
static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
|
||||||
|
|
||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
|
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// 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 );
|
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 <twl.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
#include "sysmenu_define.h"
|
#include "internal_api.h"
|
||||||
#include <spi.h>
|
|
||||||
#include <es.h>
|
|
||||||
|
|
||||||
// define data-----------------------------------------------------------------
|
// define data-----------------------------------------------------------------
|
||||||
#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 )
|
|
||||||
|
|
||||||
typedef struct BannerCheckParam {
|
|
||||||
u8 *pSrc;
|
|
||||||
u32 size;
|
|
||||||
}BannerCheckParam;
|
|
||||||
|
|
||||||
// extern data-----------------------------------------------------------------
|
// extern data-----------------------------------------------------------------
|
||||||
extern void LCFG_VerifyAndRecoveryNTRSettings( void );
|
extern void LCFG_VerifyAndRecoveryNTRSettings( void );
|
||||||
|
|
||||||
extern void SYSMi_SetLauncherMountInfo( void );
|
|
||||||
extern void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ); // マウント情報のセット
|
|
||||||
|
|
||||||
// function's prototype-------------------------------------------------------
|
// function's prototype-------------------------------------------------------
|
||||||
static TitleProperty *SYSMi_CheckShortcutBoot( void );
|
static TitleProperty *SYSMi_CheckShortcutBoot( void );
|
||||||
static BOOL SYSMi_IsDebuggerBannerViewMode( void );
|
static BOOL SYSMi_IsDebuggerBannerViewMode( void );
|
||||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
|
||||||
static void SYSMi_WriteAdjustRTC( void );
|
|
||||||
static int SYSMi_IsValidCard( void );
|
static int SYSMi_IsValidCard( void );
|
||||||
static BOOL SYSMi_CheckEntryAddress( void );
|
static BOOL SYSMi_CheckEntryAddress( void );
|
||||||
static void SYSMi_CheckCardCloneBoot( 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-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
void *(*SYSMi_Alloc)( u32 size );
|
void *(*SYSMi_Alloc)( u32 size );
|
||||||
@ -60,13 +39,9 @@ SYSM_work *pSysm; //
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
static OSThread thread;
|
|
||||||
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
|
|
||||||
|
|
||||||
|
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
//
|
//
|
||||||
// 初期化
|
// 初期化
|
||||||
@ -92,12 +67,14 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// アリーナ再設定
|
||||||
void SYSM_SetArena( void )
|
void SYSM_SetArena( void )
|
||||||
{
|
{
|
||||||
// ARM9用ブートコード配置のため、アリーナHi位置を下げる
|
// ARM9用ブートコード配置のため、アリーナHi位置を下げる
|
||||||
OS_SetMainArenaHi( (void *)SYSM_OWN_ARM9_MMEM_ADDR_END );
|
OS_SetMainArenaHi( (void *)SYSM_OWN_ARM9_MMEM_ADDR_END );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// システムメニューライブラリ用メモリアロケータの設定
|
// システムメニューライブラリ用メモリアロケータの設定
|
||||||
void SYSM_SetAllocFunc( void *(*pAlloc)(u32), void (*pFree)(void*) )
|
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 *SYSM_Alloc( u32 size )
|
||||||
{
|
{
|
||||||
void *p = SYSMi_Alloc( size );
|
void *p = SYSMi_Alloc( size );
|
||||||
@ -113,12 +91,15 @@ void *SYSM_Alloc( u32 size )
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// メモリFree
|
||||||
void SYSM_Free( void *ptr )
|
void SYSM_Free( void *ptr )
|
||||||
{
|
{
|
||||||
OS_TPrintf( "SYSM_Free : %08x\n", ptr );
|
OS_TPrintf( "SYSM_Free : %08x\n", ptr );
|
||||||
SYSMi_Free( 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 )
|
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リード可能状態か?
|
// TPリード可能状態か?
|
||||||
BOOL SYSM_IsTPReadable( void )
|
BOOL SYSM_IsTPReadable( void )
|
||||||
{
|
{
|
||||||
@ -500,490 +293,6 @@ BOOL SYSM_IsValidTSD( void )
|
|||||||
return (BOOL)SYSMi_GetWork()->isValidTSD;
|
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