・HWInfoWriterのランチャーTitleID_Loをビッグエンディアンに修正。

・TwlBanner.xlsドキュメント更新。
・NANDアプリリスト取得時に、TitleID_Hiの値によって取捨選択を行うよう変更。
・PXIを使ってARM9からHotSWを制御できるようにしようと試み中。
・SYSM_workのフラグ構成を修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@539 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-01-29 08:34:32 +00:00
parent 9a21a243a4
commit e0b3985431
37 changed files with 530 additions and 187 deletions

View File

@ -24,6 +24,7 @@ export TWL_ARCHGEN = ALL
SUBDIRS = \ SUBDIRS = \
$(ROOT)/build/libraries/reboot \ $(ROOT)/build/libraries/reboot \
$(ROOT)/build/demos/gx/UnitTours/DEMOLib \
$(TWLSYSTEM_ROOT) \ $(TWLSYSTEM_ROOT) \
build build

View File

@ -66,14 +66,14 @@ SYSMENU_LIBS ?= \
libmbloader$(TWL_LIBSUFFIX).a \ libmbloader$(TWL_LIBSUFFIX).a \
libacsign$(TWL_LIBSUFFIX).a \ libacsign$(TWL_LIBSUFFIX).a \
libboot$(TWL_LIBSUFFIX).a \ libboot$(TWL_LIBSUFFIX).a \
# libcardboot$(TWL_LIBSUFFIX).a
else # ($(CODEGEN_PROC),ARM7) else # ($(CODEGEN_PROC),ARM7)
SYSMENU_LIBS ?= \ SYSMENU_LIBS ?= \
libsysmenu_sp$(TWL_LIBSUFFIX).a \
libmbloader_sp$(TWL_LIBSUFFIX).a \ libmbloader_sp$(TWL_LIBSUFFIX).a \
libboot_sp$(TWL_LIBSUFFIX).a \ libboot_sp$(TWL_LIBSUFFIX).a \
libcardboot_sp$(TWL_LIBSUFFIX).a libhotsw_sp$(TWL_LIBSUFFIX).a
endif endif

View File

@ -72,7 +72,8 @@ INSTALL_TARGETS = $(BINDIR)/$(TARGET_NAME).tef \
INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE) INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE)
LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \
$(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include
LLIBRARIES += libwl_sp.TWL.LTD.a LLIBRARIES += libwl_sp.TWL.LTD.a
LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES)

View File

@ -56,9 +56,9 @@ Autoload WRAM
libmcu_sp$(LIBSUFFIX).a \ libmcu_sp$(LIBSUFFIX).a \
libboot_sp$(LIBSUFFIX).a \ libboot_sp$(LIBSUFFIX).a \
libreboot_sp$(LIBSUFFIX).a \ libreboot_sp$(LIBSUFFIX).a \
libcardboot_sp$(LIBSUFFIX).a \ libhotsw_sp$(LIBSUFFIX).a \
libreloc_info_sp$(LIBSUFFIX).a libreloc_info_sp$(LIBSUFFIX).a \
libsysmenu_sp$(LIBSUFFIX).a
Library libsdio_sp$(LIBSUFFIX).a Library libsdio_sp$(LIBSUFFIX).a

View File

@ -37,6 +37,7 @@
#include <twl/hw/common/mmap_wramEnv.h> #include <twl/hw/common/mmap_wramEnv.h>
#include <sysmenu.h> #include <sysmenu.h>
#include "nvram_sp.h" #include "nvram_sp.h"
#include "internal_api.h"
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -112,6 +113,9 @@ TwlSpMain(void)
OS_InitTick(); OS_InitTick();
PrintDebugInfo(); PrintDebugInfo();
// PXIコールバックの設定
PXI_SetFifoRecvCallback( SYSMENU_PXI_FIFO_TAG, SYSMi_PXIFifoRecvCallback );
// ランチャーパラメター取得Cold/Hotスタート判定含む // ランチャーパラメター取得Cold/Hotスタート判定含む
ReadLauncherParameter(); ReadLauncherParameter();
@ -123,7 +127,7 @@ TwlSpMain(void)
// [TODO:] カード電源ONして、ROMヘッダのみリードチェックくらいはやっておきたい // [TODO:] カード電源ONして、ROMヘッダのみリードチェックくらいはやっておきたい
SYSMi_GetWork()->isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
// ヒープ領域設定 // ヒープ領域設定
{ {
@ -247,7 +251,7 @@ static void ResetRTC( void )
// リセット実行 // リセット実行
stat1.reset = 1; stat1.reset = 1;
RTC_WriteStatus1( &stat1 ); RTC_WriteStatus1( &stat1 );
SYSMi_GetWork()->isResetRTC = TRUE; SYSMi_GetWork()->flags.common.isResetRTC = TRUE;
} }
} }
@ -256,8 +260,8 @@ static void ResetRTC( void )
void ReadLauncherParameter( void ) void ReadLauncherParameter( void )
{ {
BOOL hot; BOOL hot;
SYSMi_GetWork()->isValidLauncherParam = OS_ReadLauncherParameter( (LauncherParam *)&(SYSMi_GetWork()->launcherParam), &hot ); SYSMi_GetWork()->flags.common.isValidLauncherParam = OS_ReadLauncherParameter( (LauncherParam *)&(SYSMi_GetWork()->launcherParam), &hot );
SYSMi_GetWork()->isHotStart = hot; SYSMi_GetWork()->flags.common.isHotStart = hot;
// メインメモリのリセットパラメータをクリアしておく // メインメモリのリセットパラメータをクリアしておく
MI_CpuClear32( SYSMi_GetLauncherParamAddr(), 0x100 ); MI_CpuClear32( SYSMi_GetLauncherParamAddr(), 0x100 );
} }
@ -618,7 +622,7 @@ extern u16 WMSP_GetAllowedChannel(u16 bitField);
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void ReadUserInfo(void) static void ReadUserInfo(void)
{ {
u8 *p; u8 *p = OS_GetSystemWork()->nvramUserInfo;
// 無線MACアドレスをユーザー情報の後ろに展開 // 無線MACアドレスをユーザー情報の後ろに展開
{ {
@ -668,3 +672,4 @@ VBlankIntr(void)
PM_SelfBlinkProc(); PM_SelfBlinkProc();
} }
} }

View File

@ -213,7 +213,7 @@ BOOL BOOT_WaitStart( void )
static void BOOTi_ClearREG_RAM( void ) static void BOOTi_ClearREG_RAM( void )
{ {
if( SYSMi_GetWork()->isCardBoot ) { if( SYSMi_GetWork()->flags.common.isCardBoot ) {
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
reg_MI_MC_SWP = 0x80; // カードスロットのスワップ reg_MI_MC_SWP = 0x80; // カードスロットのスワップ
#endif #endif

View File

@ -31,7 +31,7 @@ INCDIR = ./include
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c
TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs

View File

@ -180,7 +180,7 @@ void HOTSW_Init(void)
else{ else{
OS_PutString("No Card...\n"); OS_PutString("No Card...\n");
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->is1stCardChecked = TRUE; SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
#endif #endif
} }
} }
@ -297,8 +297,8 @@ BOOL HOTSW_Boot(void)
retval = FALSE; retval = FALSE;
} }
SYSMi_GetWork()->isExistCard = retval; SYSMi_GetWork()->flags.common.isExistCard = retval;
SYSMi_GetWork()->isCardStateChanged = TRUE; // 本当は挿抜単位でここを立てる。 SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; // 本当は挿抜単位でここを立てる。
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
@ -376,10 +376,10 @@ BOOL HOTSW_Boot(void)
// [TODO:]暫定処置。ちゃんとした流れでLauncher側に渡すようにする。 // [TODO:]暫定処置。ちゃんとした流れでLauncher側に渡すようにする。
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE ); MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
SYSMi_GetWork()->isOnDebugger = s_cbData.debuggerFlg; SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->is1stCardChecked = TRUE; SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
#endif #endif
return retval; return retval;
@ -412,7 +412,7 @@ void HOTSW_LoadStaticModule(void)
s_cbData.pBootSegBuf->rh.s.banner_offset, s_cbData.pBootSegBuf->rh.s.banner_offset,
(u32 *)SYSM_CARD_BANNER_BUF, (u32 *)SYSM_CARD_BANNER_BUF,
sizeof(TWLBannerFile) ); sizeof(TWLBannerFile) );
SYSMi_GetWork()->isValidCardBanner = TRUE; SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE;
} }
#endif #endif

View File

@ -0,0 +1,45 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# 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$
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM7
SRCS = ../common/src/pxi.c
TARGET_LIB = libsysmenu_sp$(TWL_LIBSUFFIX).a
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
LINCLUDES = $(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -32,7 +32,8 @@ SRCS = sysmenu_lib.c \
mountInfo.c \ mountInfo.c \
device.c \ device.c \
title.c \ title.c \
banner.c banner.c \
../common/src/pxi.c
TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a TARGET_LIB = libsysmenu$(TWL_LIBSUFFIX).a
@ -44,8 +45,8 @@ INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
LINCLUDES = $(ROOT)/build/libraries/mb/common/include \ LINCLUDES = $(ROOT)/build/libraries/mb/common/include \
$(ROOT)/build/libraries/spi/ARM9/include \ $(ROOT)/build/libraries/spi/ARM9/include \
$(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -63,11 +63,11 @@ BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner )
return isRead; return isRead;
#else #else
#pragma unused(bannerOffset) #pragma unused(bannerOffset)
if( SYSMi_GetWork()->isValidCardBanner ) { if( SYSMi_GetWork()->flags.common.isValidCardBanner ) {
DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 ); DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 );
MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) ); MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) );
} }
return (BOOL)SYSMi_GetWork()->isValidCardBanner; return (BOOL)SYSMi_GetWork()->flags.common.isValidCardBanner;
#endif #endif
} }

View File

@ -95,7 +95,7 @@ void SYSMi_CheckRTC( void )
!SYSM_CheckRTCTime( &time ) !SYSM_CheckRTCTime( &time )
#ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。 #ifndef __IS_DEBUGGER_BUILD // 青デバッガではRTCの電池がないので、毎回ここにひっかかって設定データが片方クリアされてしまう。これを防ぐスイッチ。
|| ||
SYSMi_GetWork()->isResetRTC SYSMi_GetWork()->flags.common.isResetRTC
#endif #endif
) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。 ) { // RTCの異常を検出したら、rtc入力フラグrtcOffsetを0にしてNVRAMに書き込み。
OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n"); OS_TPrintf("\"RTC reset\" or \"Illegal RTC data\" detect!\n");

View File

@ -196,7 +196,7 @@ static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId tit
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) || ( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 ( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) && ( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->isOnDebugger ) ) ( SYSMi_GetWork()->flags.common.isOnDebugger ) )
) { ) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ]; char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ]; u32 saveDataSize[ 2 ];
@ -240,7 +240,7 @@ static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAM
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) || ( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 ( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) && ( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->isOnDebugger ) ) ( SYSMi_GetWork()->flags.common.isOnDebugger ) )
) { ) {
char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ]; char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ];
u32 saveDataSize[ 2 ]; u32 saveDataSize[ 2 ];

View File

@ -34,10 +34,11 @@ static void SYSMi_CheckCardCloneBoot( void );
void *(*SYSMi_Alloc)( u32 size ); void *(*SYSMi_Alloc)( u32 size );
void (*SYSMi_Free )( void *ptr ); void (*SYSMi_Free )( void *ptr );
#define SYSM_DEBUG_
#ifdef SYSM_DEBUG_ #ifdef SYSM_DEBUG_
SYSM_work *pSysm; // デバッガでのSYSMワークのウォッチ用 SYSM_work *pSysm; // デバッガでのSYSMワークのウォッチ用
ROM_Header_Short *pRomHeader;
#endif #endif
// static variable------------------------------------------------------------- // static variable-------------------------------------------------------------
// const data------------------------------------------------------------------ // const data------------------------------------------------------------------
@ -53,6 +54,7 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
{ {
#ifdef SYSM_DEBUG_ #ifdef SYSM_DEBUG_
pSysm = SYSMi_GetWork(); pSysm = SYSMi_GetWork();
pRomHeader = (ROM_Header_Short *)0x027fc000;
#endif /* SYSM_DEBUG_ */ #endif /* SYSM_DEBUG_ */
// ランチャーのマウント情報セット // ランチャーのマウント情報セット
@ -62,6 +64,7 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB ); OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB );
SYSM_SetAllocFunc( pAlloc, pFree ); SYSM_SetAllocFunc( pAlloc, pFree );
PXI_SetFifoRecvCallback( SYSMENU_PXI_FIFO_TAG, SYSMi_PXIFifoRecvCallback );
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
} }
@ -113,12 +116,12 @@ TitleProperty *SYSM_ReadParameters( void )
u8 brightness = LCFG_TWL_BACKLIGHT_LEVEL_MAX; u8 brightness = LCFG_TWL_BACKLIGHT_LEVEL_MAX;
// ARM7のリセットパラメータ取得が完了するのを待つ // ARM7のリセットパラメータ取得が完了するのを待つ
while( !SYSMi_GetWork()->isARM9Start ) { while( !SYSMi_GetWork()->flags.common.isARM9Start ) {
SVC_WaitByLoop( 0x1000 ); SVC_WaitByLoop( 0x1000 );
} }
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
// ARM7のカードチェック完了を待つ // ARM7のカードチェック完了を待つ
while( !SYSMi_GetWork()->is1stCardChecked ) { while( !SYSMi_GetWork()->flags.common.is1stCardChecked ) {
SVC_WaitByLoop( 0x1000 ); SVC_WaitByLoop( 0x1000 );
} }
#endif #endif
@ -151,13 +154,13 @@ TitleProperty *SYSM_ReadParameters( void )
// ノーマル情報リード // ノーマル情報リード
if( !LCFG_ReadHWNormalInfo() ) { if( !LCFG_ReadHWNormalInfo() ) {
OS_TPrintf( "HW Normal Info Broken!\n" ); OS_TPrintf( "HW Normal Info Broken!\n" );
SYSMi_GetWork()->isBrokenHWNormalInfo = TRUE; SYSMi_GetWork()->flags.common.isBrokenHWNormalInfo = TRUE;
} }
// セキュア情報リード // セキュア情報リード
if( !LCFG_ReadHWSecureInfo() ) { if( !LCFG_ReadHWSecureInfo() ) {
OS_TPrintf( "HW Secure Info Broken!\n" ); OS_TPrintf( "HW Secure Info Broken!\n" );
SYSMi_GetWork()->isBrokenHWSecureInfo = TRUE; SYSMi_GetWork()->flags.common.isBrokenHWSecureInfo = TRUE;
SYSMi_GetWork()->isFatalError = TRUE; SYSMi_GetWork()->flags.common.isFatalError = TRUE;
} }
//----------------------------------------------------- //-----------------------------------------------------
@ -200,7 +203,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
// 検査カード起動 // 検査カード起動
//----------------------------------------------------- //-----------------------------------------------------
if( SYSM_IsExistCard() ) { if( SYSM_IsExistCard() ) {
if( ( SYSMi_GetWork()->isOnDebugger && // ISデバッガが有効かつJTAGがまだ有効でない時 if( ( SYSMi_GetWork()->flags.common.isOnDebugger && // ISデバッガが有効かつJTAGがまだ有効でない時
!( *(u8 *)( HW_SYS_CONF_BUF + HWi_WSYS09_OFFSET ) & HWi_WSYS09_JTAG_CPUJE_MASK ) ) || !( *(u8 *)( HW_SYS_CONF_BUF + HWi_WSYS09_OFFSET ) & HWi_WSYS09_JTAG_CPUJE_MASK ) ) ||
SYSM_IsInspectCard() || SYSM_IsInspectCard() ||
( ( PAD_Read() & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) == ( ( PAD_Read() & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) ==
@ -250,14 +253,14 @@ const LauncherParamBody *SYSM_GetLauncherParamBody( void )
// ロゴデモスキップかどうかをセット // ロゴデモスキップかどうかをセット
void SYSM_SetLogoDemoSkip( BOOL skip ) void SYSM_SetLogoDemoSkip( BOOL skip )
{ {
SYSMi_GetWork()->isLogoSkip = skip; SYSMi_GetWork()->flags.common.isLogoSkip = skip;
} }
// ロゴデモスキップか? // ロゴデモスキップか?
BOOL SYSM_IsLogoDemoSkip( void ) BOOL SYSM_IsLogoDemoSkip( void )
{ {
return (BOOL)SYSMi_GetWork()->isLogoSkip; return (BOOL)SYSMi_GetWork()->flags.common.isLogoSkip;
} }
@ -265,7 +268,7 @@ BOOL SYSM_IsLogoDemoSkip( void )
static BOOL SYSMi_IsDebuggerBannerViewMode( void ) static BOOL SYSMi_IsDebuggerBannerViewMode( void )
{ {
#ifdef __IS_DEBUGGER_BUILD #ifdef __IS_DEBUGGER_BUILD
return ( SYSMi_GetWork()->isOnDebugger && return ( SYSMi_GetWork()->flags.common.isOnDebugger &&
SYSMi_IsValidCard() && SYSMi_IsValidCard() &&
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE; SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
#else #else
@ -284,14 +287,14 @@ BOOL SYSM_IsTPReadable( void )
// TSD有効/無効をセット // TSD有効/無効をセット
void SYSM_SetValidTSD( BOOL valid ) void SYSM_SetValidTSD( BOOL valid )
{ {
SYSMi_GetWork()->isValidTSD = valid; SYSMi_GetWork()->flags.common.isValidTSD = valid;
} }
// TSD有効 // TSD有効
BOOL SYSM_IsValidTSD( void ) BOOL SYSM_IsValidTSD( void )
{ {
return (BOOL)SYSMi_GetWork()->isValidTSD; return (BOOL)SYSMi_GetWork()->flags.common.isValidTSD;
} }
@ -304,7 +307,7 @@ BOOL SYSM_IsValidTSD( void )
// 有効なTWL/NTRカードが差さっているか // 有効なTWL/NTRカードが差さっているか
BOOL SYSM_IsExistCard( void ) BOOL SYSM_IsExistCard( void )
{ {
return (BOOL)SYSMi_GetWork()->isExistCard; return (BOOL)SYSMi_GetWork()->flags.common.isExistCard;
} }
@ -385,9 +388,9 @@ static void SYSMi_CheckCardCloneBoot( void )
buffp += total_rom_size & 0x000001FF; buffp += total_rom_size & 0x000001FF;
if( *buffp++ == 'a' && *buffp == 'c' ) { if( *buffp++ == 'a' && *buffp == 'c' ) {
SYSMi_GetWork()->cloneBootMode = CLONE_BOOT_MODE; SYSMi_GetWork()->flags.common.cloneBootMode = CLONE_BOOT_MODE;
}else { }else {
SYSMi_GetWork()->cloneBootMode = OTHER_BOOT_MODE; SYSMi_GetWork()->flags.common.cloneBootMode = OTHER_BOOT_MODE;
} }
#endif #endif
} }

View File

@ -26,6 +26,7 @@
// extern data----------------------------------------------------------------- // extern data-----------------------------------------------------------------
// function's prototype------------------------------------------------------- // function's prototype-------------------------------------------------------
static BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, u8 *pDst );
static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
static void SYSMi_Relocate( void ); static void SYSMi_Relocate( void );
@ -56,19 +57,19 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
{ {
BOOL retval = FALSE; BOOL retval = FALSE;
if( SYSMi_GetWork()->isCardStateChanged ) { if( SYSMi_GetWork()->flags.common.isCardStateChanged ) {
MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) ); MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) );
// ROMヘッダバッファのコピー // ROMヘッダバッファのコピー
if( SYSM_IsExistCard() ) { if( SYSM_IsExistCard() ) {
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する
DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); // キャッシュケア 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ヘッダコピー 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()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16; // ROMヘッダCRCコピー
SYSMi_GetWork()->isCardStateChanged = FALSE; // カード情報更新フラグを落とす SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE; // カード情報更新フラグを落とす
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM7と排他制御する
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
pTitleList_Card->flags.isValid = TRUE; pTitleList_Card->flags.isValid = TRUE;
@ -103,96 +104,55 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
// とりあえずALL // とりあえずALL
OSTick start; OSTick start;
int l; int l;
int gotten; int getNum;
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; int validNum = 0;
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM ];
NAMTitleId *pTitleIDList = NULL;
if( listNum > 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 ); OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM );
} }
// インストールされているタイトルの取得
start = OS_GetTick(); start = OS_GetTick();
gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 ); getNum = NAM_GetNumTitles();
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 ) ); OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * getNum );
for(l=0;l<gotten;l++) if( pTitleIDList == NULL ) {
{ OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
//ヘッダからバナーを読み込む return 0;
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++) start = OS_GetTick();
{ (void)NAM_GetTitleList( pTitleIDList, (u32)getNum );
// 念のため0にクリア OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
titleIdArray[l] = 0;
// 取得したタイトルがローンチ対象かどうかをチェック
for( l = 0; l < getNum; l++ ) {
// "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加
if( ( pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) {
titleIDArray[ validNum ] = pTitleIDList[ l ];
SYSMi_ReadBanner_NAND( pTitleIDList[ l ], (u8 *)&s_bannerBuf[ validNum ] );
validNum++;
}
}
SYSM_Free( pTitleIDList );
// 念のため残り領域を0クリア
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM; l++ ) {
titleIDArray[ l ] = 0;
} }
// カードアプリ部分を除いたリストクリア // 最終リストに対して、カードアプリ部分を除いた部分をクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) ); MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum = (gotten<listNum) ? gotten : listNum; listNum = ( validNum < listNum ) ? validNum : listNum;
for(l=0;l<listNum;l++) for(l=0;l<listNum;l++)
{ {
pTitleList_Nand[l+1].titleID = titleIdArray[l]; pTitleList_Nand[l+1].titleID = titleIDArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l]; pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIdArray[l] ) { if( titleIDArray[l] ) {
pTitleList_Nand[l+1].flags.isValid = TRUE; pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND; pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND;
} }
@ -201,6 +161,74 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
return listNum; return listNum;
} }
static BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, u8 *pDst )
{
#define PATH_LENGTH 1024
OSTick start;
FSFile file[1];
BOOL bSuccess;
char path[PATH_LENGTH];
s32 readLen;
s32 offset;
start = OS_GetTick();
readLen = NAM_GetTitleBootContentPathFast( path, titleID );
OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
// ファイルパスを取得
if(readLen != NAM_OK){
OS_TPrintf("NAM_GetTitleBootContentPath failed %lld,%d\n", titleID, readLen );
}
// ファイルオープン
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path);
return FALSE;
}
// ROMヘッダのバナーデータオフセットを読み込む
bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n");
FS_CloseFile(file);
return FALSE;
}
readLen = FS_ReadFile(file, &offset, sizeof(offset));
if( readLen != sizeof(offset) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n");
FS_CloseFile(file);
return FALSE;
}
// バナーが存在する場合のみリード
if( offset ) {
bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET);
if( ! bSuccess )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n");
FS_CloseFile(file);
return FALSE;
}
readLen = ReadFile( file, pDst, (s32)sizeof(TWLBannerFile) );
if( readLen != (s32)sizeof(TWLBannerFile) )
{
OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n");
FS_CloseFile(file);
return FALSE;
}
}else {
// バナーが存在しない場合はバッファクリア
MI_CpuClearFast( pDst, sizeof(TWLBannerFile) );
}
FS_CloseFile(file);
return TRUE;
}
// 指定ファイルリード // 指定ファイルリード
static s32 ReadFile(FSFile* pf, void* buffer, s32 size) static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
@ -418,10 +446,19 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
// ROMヘッダバッファをコピー // ROMヘッダバッファをコピー
MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); 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; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
} }
static void SYSMi_DisableHotSW( void )
{
if( SYSMi_GetWork()->flags.arm7.isEnableHotSW &&
SYSMi_GetWork()->flags.arm9.isEnableHotSW ) {
return;
}
SYSMi_SendPXICommand( SYSM_PXI_COMM_DISABLE_HOTSW );
}
// 指定タイトルを別スレッドでロード開始する // 指定タイトルを別スレッドでロード開始する
void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
{ {
@ -429,24 +466,26 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
#define STACK_SIZE 0xc00 #define STACK_SIZE 0xc00
static u64 stack[ STACK_SIZE / sizeof(u64) ]; static u64 stack[ STACK_SIZE / sizeof(u64) ];
SYSMi_DisableHotSW();
// アプリ未ロード状態なら、ロード開始 // アプリ未ロード状態なら、ロード開始
if( !pBootTitle->flags.isAppLoadCompleted ) { if( !pBootTitle->flags.isAppLoadCompleted ) {
SYSMi_GetWork()->isLoadSucceeded = FALSE; SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE;
OS_InitThread(); OS_InitThread();
OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
OS_WakeupThreadDirect( &s_thread ); OS_WakeupThreadDirect( &s_thread );
}else if( pBootTitle->flags.isAppRelocate ) { }else if( pBootTitle->flags.isAppRelocate ) {
// アプリロード済みで、再配置要求ありなら、再配置(カードのみ対応) // アプリロード済みで、再配置要求ありなら、再配置(カードのみ対応)
SYSMi_Relocate(); SYSMi_Relocate();
SYSMi_GetWork()->isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
}else }else
{ {
// アプリロード済みで、再配置要求なし // アプリロード済みで、再配置要求なし
SYSMi_GetWork()->isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
} }
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) { if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
SYSMi_GetWork()->isCardBoot = TRUE; SYSMi_GetWork()->flags.common.isCardBoot = TRUE;
}else if(pBootTitle->flags.isAppLoadCompleted) }else if(pBootTitle->flags.isAppLoadCompleted)
{ {
// カードブートでなく、ロード済みの場合、再配置情報をランチャーパラメタから読み込み // カードブートでなく、ロード済みの場合、再配置情報をランチャーパラメタから読み込み
@ -533,7 +572,7 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
return AUTH_RESULT_PROCESSING; return AUTH_RESULT_PROCESSING;
} }
// ロード成功? // ロード成功?
if( SYSMi_GetWork()->isLoadSucceeded == FALSE ) if( SYSMi_GetWork()->flags.common.isLoadSucceeded == FALSE )
{ {
return AUTH_RESULT_TITLE_LOAD_FAILED; return AUTH_RESULT_TITLE_LOAD_FAILED;
} }
@ -594,4 +633,15 @@ static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
return TRUE; return TRUE;
} }
#if 0
void CheckDigest( void )
{
int i;
for( i = 0; i < 4; i++ ) {
if( SYSMi_GetWork()->reloc_info[ i ].src ) {
}else {
}
}
}
#endif

View File

@ -23,7 +23,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
SUBDIRS = ARM9 SUBDIRS = ARM9 ARM7
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -32,7 +32,7 @@ extern "C" {
#define OS_PutString( ... ) ((void)0) #define OS_PutString( ... ) ((void)0)
#endif #endif
#ifdef SDK_ARM9
//------------------------------------------------------- //-------------------------------------------------------
// マウント情報セット // マウント情報セット
//------------------------------------------------------- //-------------------------------------------------------
@ -62,6 +62,11 @@ void SYSMi_CheckRTC( void );
// カードバナーリード※NTR-IPL2仕様 // カードバナーリード※NTR-IPL2仕様
BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ); BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner );
#endif
BOOL SYSMi_SendPXICommand( SYSMPXICommand command );
void SYSMi_PXIFifoRecvCallback( PXIFifoTag tag, u32 data, BOOL err );
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -0,0 +1,80 @@
/*---------------------------------------------------------------------------*
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
//#define SYSM_LIB_NO_MESSAGE // Printf抑制スイッチ
#ifdef SYSM_LIB_NO_MESSAGE
#define OS_Printf( ... ) ((void)0)
#define OS_TPrintf( ... ) ((void)0)
#define OS_PutString( ... ) ((void)0)
#endif
#ifdef SDK_ARM9
//-------------------------------------------------------
// マウント情報セット
//-------------------------------------------------------
// ランチャー用
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 );
#endif // SDK_ARM9
//-------------------------------------------------------
// PXI
//-------------------------------------------------------
extern void SYSMi_SendPXICommand( SYSMPXICommand command );
extern void SYSMi_PXIFifoCallback( PXIFifoTag tag, u32 data, BOOL err );
#ifdef __cplusplus
}
#endif
#endif // SYSM_INTERNAL_API_H_

View File

@ -0,0 +1,116 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: pxi.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-----------------------------------------------------------------
#define SYSM_PXI_COMM_STAT_REQ 0
#define SYSM_PXI_COMM_STAT_ACK 1
// PXIコマンド
typedef union SYSMPXIPacket {
struct {
u16 data;
u16 command : 14;
u16 stat : 2;
};
u32 raw;
}SYSMPXIPacket;
// extern data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
static volatile BOOL s_sending = FALSE;
// const data------------------------------------------------------------------
// PXIコマンド送信
BOOL SYSMi_SendPXICommand( SYSMPXICommand command )
{
SYSMPXIPacket packet;
OSIntrMode saved = OS_DisableInterrupts();
if( s_sending ) {
OS_RestoreInterrupts( saved );
return FALSE;
}
s_sending = TRUE;
OS_RestoreInterrupts( saved );
packet.stat = SYSM_PXI_COMM_STAT_REQ;
packet.command = (u16)command;
packet.data = 0;
while( PXI_SendWordByFifo( SYSMENU_PXI_FIFO_TAG, packet.raw, 0 ) < 0 ) {}
while( s_sending ) {
OS_WaitAnyIrq();
}
return TRUE;
}
void SYSMi_PXIFifoRecvCallback( PXIFifoTag tag, u32 data, BOOL err )
{
#pragma unused( tag, err )
SYSMPXIPacket packet;
packet.raw = data;
#ifdef SDK_ARM9
s_sending = FALSE;
if( packet.stat == SYSM_PXI_COMM_STAT_ACK ) {
switch( data ) {
case SYSM_PXI_COMM_DISABLE_HOTSW:
SYSMi_GetWork()->flags.arm9.isEnableHotSW = 0;
break;
default:
break;
}
}else { // SYSM_PXI_COMM_STAT_REQ
switch( data ) {
default:
break;
}
}
#else // !SDK_ARM9
if( packet.stat == SYSM_PXI_COMM_STAT_REQ ) {
switch( data ) {
case SYSM_PXI_COMM_DISABLE_HOTSW:
if( SYSMi_GetWork()->flags.arm7.isBusyHotSW ) {
SYSMi_GetWork()->flags.arm7.disableHotSW_REQ = 1;
}else {
SYSMi_GetWork()->flags.arm7.isEnableHotSW = 0;
// PXIで返信
}
break;
default:
break;
}
}else { // SYSM_PXI_COMM_STAT_ACK
switch( data ) {
default:
break;
}
}
#endif // SDK_ARM9
}

View File

@ -138,7 +138,7 @@ static BOOL TryResolveSrl(void)
OS_TPrintf("Failed to load HWSecureInfo.\n"); OS_TPrintf("Failed to load HWSecureInfo.\n");
return FALSE; return FALSE;
} }
LCFG_THW_GetLauncherGameCode( (u8*)&titleId ); LCFG_THW_GetLauncherTitleID_Lo( (u8*)&titleId );
// 4: after LCFG_ReadHWSecureInfo // 4: after LCFG_ReadHWSecureInfo
PUSH_PROFILE(); PUSH_PROFILE();

View File

@ -139,7 +139,7 @@ static BOOL TryResolveSrl(void)
OS_TPrintf("Failed to load HWSecureInfo.\n"); OS_TPrintf("Failed to load HWSecureInfo.\n");
return FALSE; return FALSE;
} }
LCFG_THW_GetLauncherGameCode( (u8*)&titleId ); LCFG_THW_GetLauncherTitleID_Lo( (u8*)&titleId );
// 4: after LCFG_ReadHWSecureInfo // 4: after LCFG_ReadHWSecureInfo
PUSH_PROFILE(); PUSH_PROFILE();

View File

@ -134,7 +134,6 @@ static const char *strLauncherGameCode[] = {
// HW情報ライターの初期化 // HW情報ライターの初期化
void HWInfoWriterInit( void ) void HWInfoWriterInit( void )
{ {
u8 gameCode[ 5 ] = { 0, 0, 0, 0, 0 };
GX_DispOff(); GX_DispOff();
GXS_DispOff(); GXS_DispOff();
@ -154,8 +153,15 @@ void HWInfoWriterInit( void )
OS_TPrintf( "region = %d\n", LCFG_THW_GetRegion() ); OS_TPrintf( "region = %d\n", LCFG_THW_GetRegion() );
PrintfSJISSub( 2 * 8, 16 * 8, TXT_COLOR_BLACK, "Region = %s", strRegion[ LCFG_THW_GetRegion() ] ); PrintfSJISSub( 2 * 8, 16 * 8, TXT_COLOR_BLACK, "Region = %s", strRegion[ LCFG_THW_GetRegion() ] );
PrintfSJISSub( 2 * 8, 18 * 8, TXT_COLOR_BLACK, "SerialNo = %s", LCFG_THW_GetSerialNoPtr() ); PrintfSJISSub( 2 * 8, 18 * 8, TXT_COLOR_BLACK, "SerialNo = %s", LCFG_THW_GetSerialNoPtr() );
// LCFG_THW_GetLauncherGameCode( gameCode ); if ( 1 )
// PrintfSJISSub( 2 * 8, 20 * 8, TXT_COLOR_BLACK, "LauncherGameCode = %s", gameCode ); {
int i;
u8 titleID_Lo[ 4 ];
u8 gameCode[ 5 ] = { 0, 0, 0, 0, 0 };
LCFG_THW_GetLauncherTitleID_Lo( titleID_Lo );
for( i = 0; i < 4; i++ ) gameCode[ i ] = titleID_Lo[ 4 - i - 1 ];
PrintfSJISSub( 2 * 8, 20 * 8, TXT_COLOR_BLACK, "LauncherTitleID_Lo = %s", gameCode );
}
s_region_old = LCFG_THW_GetRegion(); s_region_old = LCFG_THW_GetRegion();
s_csr = 0; s_csr = 0;
DrawMenu( s_csr, &s_writerParam ); DrawMenu( s_csr, &s_writerParam );
@ -410,8 +416,13 @@ static BOOL WriteHWSecureInfoFile( u8 region )
LCFG_THW_SetSerialNo( serialNo ); LCFG_THW_SetSerialNo( serialNo );
} }
// ランチャーゲームコード // ランチャーTitleID_Loのセット
LCFG_THW_SetLauncherGameCode( (const u8 *)strLauncherGameCode[ region ] ); {
int i;
u8 titleID_Lo[4];
for( i = 0; i < 4; i++ ) titleID_Lo[ i ] = (u8)strLauncherGameCode[ region ][ 4 - i - 1 ];
LCFG_THW_SetLauncherTitleID_Lo( (const u8 *)titleID_Lo );
}
// ライト // ライト
if( isWrite && if( isWrite &&

View File

@ -55,9 +55,7 @@ Autoload WRAM
libmicex_sp$(LIBSUFFIX).a \ libmicex_sp$(LIBSUFFIX).a \
libmcu_sp$(LIBSUFFIX).a \ libmcu_sp$(LIBSUFFIX).a \
Library libsdio_hcd_twl$(LIBSUFFIX).a \ Library libsdio_sp$(LIBSUFFIX).a
libsdio_busdriver$(LIBSUFFIX).a \
libsdio_lib$(LIBSUFFIX).a \
Object * (.etable) Object * (.etable)
Object * (.wram) Object * (.wram)
@ -143,10 +141,9 @@ Ltdautoload LTDMAIN
Object * (.ltdmain) Object * (.ltdmain)
Library libnvram_sp$(LIBSUFFIX).a Library libnvram_sp$(LIBSUFFIX).a
Library librtc_sp$(LIBSUFFIX).a Library librtc_sp$(LIBSUFFIX).a
Library librompatch_sp$(LIBSUFFIX).a \ Library libwm_sp$(LIBSUFFIX).a \
libwm_sp$(LIBSUFFIX).a \
libnwm_sp$(LIBSUFFIX).a \ libnwm_sp$(LIBSUFFIX).a \
libARM7athdrv$(LIBSUFFIX).a \ libathdrv_sp$(LIBSUFFIX).a \
libwvr_sp$(LIBSUFFIX).a \ libwvr_sp$(LIBSUFFIX).a \
libwl_sp$(LIBSUFFIX).a libwl_sp$(LIBSUFFIX).a
Library libfatfs_sp$(LIBSUFFIX).a \ Library libfatfs_sp$(LIBSUFFIX).a \

View File

@ -605,7 +605,7 @@ static BOOL WriteHWSecureInfoFile( u8 region )
} }
// ランチャーゲームコード // ランチャーゲームコード
LCFG_THW_SetLauncherGameCode( (const u8 *)strLauncherGameCode[ region ] ); LCFG_THW_SetLauncherTitleID_Lo( (const u8 *)strLauncherGameCode[ region ] );
// ライト // ライト
if( isWrite && if( isWrite &&

View File

@ -515,7 +515,7 @@ static void MenuScene(void)
// <20>‰Šú‰» // <20>‰Šú‰»
void CooperationAInit( void ) void CooperationAInit( void )
{ {
ChangeUserColor( TSD_GetUserColor() ); ChangeUserColor( LCFG_TSD_GetUserColor() );
s_work.parameter[0] = 0; s_work.parameter[0] = 0;
MenuInit(); MenuInit();

View File

@ -75,8 +75,8 @@ void TwlMain(void)
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み // TWL設定データファイルの読み込み
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
(void)THW_ReadSecureInfo(); (void)LCFG_ReadHWSecureInfo();
g_isValidTSD = SYSM_ReadTWLSettingsFile(); g_isValidTSD = LCFG_ReadTWLSettings();
if( g_isValidTSD ) { if( g_isValidTSD ) {
SYSM_CaribrateTP(); SYSM_CaribrateTP();
} }

View File

@ -181,7 +181,7 @@ static void MenuScene(void)
// <20>‰Šú‰» // <20>‰Šú‰»
void CooperationBInit( void ) void CooperationBInit( void )
{ {
ChangeUserColor( TSD_GetUserColor() ); ChangeUserColor( LCFG_TSD_GetUserColor() );
s_parameter[0] = 0; s_parameter[0] = 0;
MenuInit(); MenuInit();
} }

View File

@ -75,8 +75,8 @@ void TwlMain(void)
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み // TWL設定データファイルの読み込み
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
(void)THW_ReadSecureInfo(); (void)LCFG_ReadHWSecureInfo();
g_isValidTSD = SYSM_ReadTWLSettingsFile(); g_isValidTSD = LCFG_ReadTWLSettings();
if( g_isValidTSD ) { if( g_isValidTSD ) {
SYSM_CaribrateTP(); SYSM_CaribrateTP();
} }

View File

@ -515,7 +515,7 @@ static void MenuScene(void)
// <20>‰Šú‰» // <20>‰Šú‰»
void CooperationCInit( void ) void CooperationCInit( void )
{ {
ChangeUserColor( TSD_GetUserColor() ); ChangeUserColor( LCFG_TSD_GetUserColor() );
s_work.parameter[0] = 0; s_work.parameter[0] = 0;
MenuInit(); MenuInit();

View File

@ -75,8 +75,8 @@ void TwlMain(void)
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み // TWL設定データファイルの読み込み
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
(void)THW_ReadSecureInfo(); (void)LCFG_ReadHWSecureInfo();
g_isValidTSD = SYSM_ReadTWLSettingsFile(); g_isValidTSD = LCFG_ReadTWLSettings();
if( g_isValidTSD ) { if( g_isValidTSD ) {
SYSM_CaribrateTP(); SYSM_CaribrateTP();
} }

View File

@ -127,7 +127,7 @@ static BOOL LoadTitle( NAMTitleId bootTitleID )
return FALSE; return FALSE;
} }
SYSMi_GetWork()->isLoadSucceeded = TRUE; SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
return TRUE; return TRUE;
} }
@ -200,7 +200,7 @@ static void MenuScene(void)
// <20>‰Šú‰» // <20>‰Šú‰»
void ExecPreLoadedAppInit( void ) void ExecPreLoadedAppInit( void )
{ {
ChangeUserColor( TSD_GetUserColor() ); ChangeUserColor( LCFG_TSD_GetUserColor() );
MenuInit(); MenuInit();
} }

View File

@ -75,8 +75,8 @@ void TwlMain(void)
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み // TWL設定データファイルの読み込み
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
(void)THW_ReadSecureInfo(); (void)LCFG_ReadHWSecureInfo();
g_isValidTSD = SYSM_ReadTWLSettingsFile(); g_isValidTSD = LCFG_ReadTWLSettings();
if( g_isValidTSD ) { if( g_isValidTSD ) {
SYSM_CaribrateTP(); SYSM_CaribrateTP();
} }

View File

@ -57,7 +57,7 @@ Autoload WRAM
libmcu_sp$(LIBSUFFIX).a \ libmcu_sp$(LIBSUFFIX).a \
libboot_sp$(LIBSUFFIX).a \ libboot_sp$(LIBSUFFIX).a \
libreboot_sp$(LIBSUFFIX).a \ libreboot_sp$(LIBSUFFIX).a \
libcardboot_sp$(LIBSUFFIX).a \ libhotsw_sp$(LIBSUFFIX).a \
Library libsdio_sp$(LIBSUFFIX).a Library libsdio_sp$(LIBSUFFIX).a

View File

@ -50,7 +50,7 @@ Static $(TARGET_NAME)
libmcu_sp$(LIBSUFFIX).a \ libmcu_sp$(LIBSUFFIX).a \
libboot_sp$(LIBSUFFIX).a \ libboot_sp$(LIBSUFFIX).a \
libreboot_sp$(LIBSUFFIX).a \ libreboot_sp$(LIBSUFFIX).a \
libcardboot_sp$(LIBSUFFIX).a \ libhotsw_sp$(LIBSUFFIX).a \
Library libsdio_sp$(LIBSUFFIX).a Library libsdio_sp$(LIBSUFFIX).a

View File

@ -123,7 +123,7 @@ TwlSpMain(void)
// [TODO:] カード電源ONして、ROMヘッダのみリードチェックくらいはやっておきたい // [TODO:] カード電源ONして、ROMヘッダのみリードチェックくらいはやっておきたい
SYSMi_GetWork()->isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい
// ヒープ領域設定 // ヒープ領域設定
{ {
@ -240,9 +240,9 @@ void ReadLauncherParameter( void )
( SYSMi_GetMCUFreeRegisterValue() == 0 ) ) { // "JTAG有効"か"マイコンフリーレジスタ値=0"ならColdスタート ( SYSMi_GetMCUFreeRegisterValue() == 0 ) ) { // "JTAG有効"か"マイコンフリーレジスタ値=0"ならColdスタート
u8 data = 1; u8 data = 1;
MCU_SetFreeRegisters( MCU_RESET_VALUE_OFS, &data, MCU_RESET_VALUE_LEN ); // マイコンフリーレジスタにホットスタートフラグをセット MCU_SetFreeRegisters( MCU_RESET_VALUE_OFS, &data, MCU_RESET_VALUE_LEN ); // マイコンフリーレジスタにホットスタートフラグをセット
SYSMi_GetWork()->isHotStart = FALSE; SYSMi_GetWork()->flags.common.isHotStart = FALSE;
}else { }else {
SYSMi_GetWork()->isHotStart = TRUE; SYSMi_GetWork()->flags.common.isHotStart = TRUE;
// ランチャーパラメータ有効判定 // ランチャーパラメータ有効判定
if( ( STD_StrNCmp( (const char *)&SYSMi_GetLauncherParamAddr()->header.magicCode, if( ( STD_StrNCmp( (const char *)&SYSMi_GetLauncherParamAddr()->header.magicCode,
SYSM_LAUNCHER_PARAM_MAGIC_CODE, SYSM_LAUNCHER_PARAM_MAGIC_CODE,
@ -252,7 +252,7 @@ void ReadLauncherParameter( void )
) { ) {
// ランチャーパラメータが有効なら、ワークに退避 // ランチャーパラメータが有効なら、ワークに退避
MI_CpuCopy32 ( SYSMi_GetLauncherParamAddr(), &SYSMi_GetWork()->launcherParam, sizeof(LauncherParam) ); MI_CpuCopy32 ( SYSMi_GetLauncherParamAddr(), &SYSMi_GetWork()->launcherParam, sizeof(LauncherParam) );
SYSMi_GetWork()->isValidLauncherParam = TRUE; SYSMi_GetWork()->flags.common.isValidLauncherParam = TRUE;
} }
} }
// メインメモリのランチャーパラメータをクリアしておく // メインメモリのランチャーパラメータをクリアしておく

Binary file not shown.

View File

@ -29,7 +29,7 @@ extern "C" {
#endif #endif
// define data ------------------------------------ // define data ------------------------------------
#define TITLE_ID_LAUNCHER ( 0x0003000752434e4cLLU ) #define TITLE_ID_LAUNCHER ( 0x000300074c4e4352LLU )
#define CLONE_BOOT_MODE 1 #define CLONE_BOOT_MODE 1
#define OTHER_BOOT_MODE 2 #define OTHER_BOOT_MODE 2
@ -40,11 +40,21 @@ typedef struct TitleID_HiLo {
u32 Hi; u32 Hi;
}TitleID_HiLo; }TitleID_HiLo;
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// データ型定義 // PXIコマンド
//----------------------------------------------------------------------
#define SYSMENU_PXI_FIFO_TAG PXI_FIFO_TAG_USER_0
typedef enum SYSMPXICommand {
SYSM_PXI_COMM_DISABLE_HOTSW = 1
}SYSMPXICommand;
//----------------------------------------------------------------------
// ROMエミュレーション情報
//---------------------------------------------------------------------- //----------------------------------------------------------------------
#define ISD_ROM_EMULATION_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ #define ISD_ROM_EMULATION_INFO_SIZE 0x20 // ROMエミュレーションデータサイズ
#define ISD_ROM_EMULATION_INFO_MAGIC_CODE 0x444c5754 #define ISD_ROM_EMULATION_INFO_MAGIC_CODE 0x444c5754 // "TWLD"の文字列
// ISデバッガROMエミュレーション情報 // ISデバッガROMエミュレーション情報
typedef struct ISD_RomEmuInfo { typedef struct ISD_RomEmuInfo {
@ -67,30 +77,47 @@ typedef struct ISD_RomEmuInfo {
}ISD_RomEmuInfo; }ISD_RomEmuInfo;
//----------------------------------------------------------------------
// SYSMワーク
//----------------------------------------------------------------------
// SYSM共有ワーク構造体 // SYSM共有ワーク構造体
typedef struct SYSM_work { typedef struct SYSM_work {
Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報arm9,arm7それぞれltdとflxで最大4つ Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報arm9,arm7それぞれltdとflxで最大4つ
vu32 isFatalError :1; // FATALエラー struct {
vu32 isARM9Start :1; // ARM9スタートフラグ struct {
vu32 isHotStart :1; // Hot/Coldスタート判定 vu32 isFatalError :1; // FATALエラー
vu32 isValidLauncherParam :1; // リセットパラメータ有効 vu32 isARM9Start :1; // ARM9スタートフラグ
vu32 isValidTSD :1; // NITRO設定データ無効フラグ vu32 isHotStart :1; // Hot/Coldスタート判定
vu32 isLogoSkip :1; // ロゴデモスキップ vu32 isValidLauncherParam :1; // リセットパラメータ有効
vu32 isOnDebugger :1; // デバッガ動作か? vu32 isValidTSD :1; // NITRO設定データ無効フラグ
vu32 isExistCard :1; // 有効なNTR/TWLカードが存在するか vu32 isLogoSkip :1; // ロゴデモスキップ
vu32 isCardStateChanged :1; // カード状態更新フラグ vu32 isOnDebugger :1; // デバッガ動作か?
vu32 isLoadSucceeded :1; // アプリロード完了? vu32 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu32 isCardBoot :1; // カードブートか? vu32 isCardStateChanged :1; // カード状態更新フラグ
vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。 vu32 isLoadSucceeded :1; // アプリロード完了?
vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。 vu32 isCardBoot :1; // カードブートか?
vu32 isResetRTC :1; // RTCリセット発生 vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。
vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。
vu32 isResetRTC :1; // RTCリセット発生
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
vu32 isValidCardBanner :1; vu32 isValidCardBanner :1;
vu32 is1stCardChecked :1; vu32 is1stCardChecked :1;
vu32 rsv :17; vu32 rsv :17;
#else #else
vu32 rsv :19; vu32 rsv :19;
#endif #endif
}common;
struct {
vu16 isEnableHotSW :1;
vu16 rsv:15;
}arm9;
struct {
vu16 isEnableHotSW :1;
vu16 isBusyHotSW :1;
vu16 disableHotSW_REQ :1;
vu16 rsv:13;
}arm7;
}flags;
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側 u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側 u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側
@ -124,6 +151,7 @@ typedef struct SDKBootCheckInfo{
}SDKBootCheckInfo; }SDKBootCheckInfo;
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// SYSM共有ワーク領域のアドレス獲得 // SYSM共有ワーク領域のアドレス獲得
//---------------------------------------------------------------------- //----------------------------------------------------------------------