From 08e5305a93150c5d74a69a3a9813e11fa5da4d88 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 23 Jan 2008 01:50:41 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBMountInfo=E3=81=AE=E3=83=90=E3=82=B0?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82=20=E3=83=BBIS=E3=83=87=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=ACv0.40=E3=81=A7=E3=80=81=E3=82=A8=E3=83=9F?= =?UTF-8?q?=E3=83=A5=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3ROM?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=81=8C=E3=83=87=E3=83=90=E3=83=83=E3=82=AC?= =?UTF-8?q?=E3=81=A7=E8=B5=B7=E5=8B=95=E3=81=97=E3=81=9F=E3=82=A2=E3=83=97?= =?UTF-8?q?=E3=83=AA=E3=81=A7=E3=82=82=E8=AA=AD=E3=82=81=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E3=81=9F=E3=82=81=E3=80=81=20=E3=80=80SYSMi?= =?UTF-8?q?=5FCheckShortcutBoot=E9=96=A2=E6=95=B0=E3=81=A7=E3=81=AEIS?= =?UTF-8?q?=E3=83=87=E3=83=90=E3=83=83=E3=82=AC=E5=88=A4=E5=AE=9A=E3=81=AB?= =?UTF-8?q?=E3=80=8CJTAG=E6=9C=89=E5=8A=B9=E3=81=8B=EF=BC=9F=E3=80=8D?= =?UTF-8?q?=E3=81=AE=E6=9D=A1=E4=BB=B6=E3=82=92=E5=BE=A9=E6=B4=BB=E3=81=95?= =?UTF-8?q?=E3=81=9B=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@499 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/mountInfo.c | 52 +++++++++++++++++-- .../sysmenu/ARM9/src/sysmenu_lib.c | 4 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 6 +-- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c index c7701a75..c51e2fc4 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c @@ -41,6 +41,7 @@ void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ); static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ); static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ); static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); +static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); // global variable------------------------------------------------------------- @@ -84,9 +85,10 @@ void SYSMi_SetLauncherMountInfo( void ) // SYSMi_SetBootSRLPath( OS_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。 // セーブデータ有無によるマウント情報の編集 - SYSMi_ModifySaveDataMount( OS_BOOTTYPE_NAND, - titleID, - &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); + // ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。 + SYSMi_ModifySaveDataMountForLauncher( OS_BOOTTYPE_NAND, + titleID, + &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); // マウント情報のセット SYSMi_SetMountInfoCore( OS_BOOTTYPE_NAND, @@ -233,3 +235,47 @@ static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, } } + +// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。 +static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) +{ + int i; + u32 titleID_Hi = (u32)( titleID >> 32 ); // u64で論理演算はできない? + + // ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。 + + // セーブデータ有無を判定して、パスをセット + if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 + ( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) ) || + ( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 + ( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) && + ( SYSMi_GetWork()->isOnDebugger ) ) + ) { + char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ]; + u32 saveDataSize[ 2 ]; + saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size; + saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size; + + // セーブデータのファイルパスを取得 + STD_TSNPrintf( saveFilePath[ 0 ], FS_ENTRY_LONGNAME_MAX, + "nand:/title/%08x/%08x/data/private.sav", (u32)( titleID >> 32 ), titleID ); + STD_TSNPrintf( saveFilePath[ 1 ], FS_ENTRY_LONGNAME_MAX, + "nand:/title/%08x/%08x/data/public.sav", (u32)( titleID >> 32 ), titleID ); + + // "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録 + for( i = 0; i < 2; i++ ) { + if( saveDataSize[ i ] ) { + STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN ); + }else { + pMountTgt->drive[ 0 ] = 0; + } + pMountTgt++; + } + }else { + // タイトルID指定なしのカードアプリの場合は、セーブデータ無効 + for( i = 0; i < 2; i++ ) { + pMountTgt->drive[ 0 ] = 0; + } + } +} + diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 23dc7242..dd8aeb85 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -218,7 +218,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void ) // 検査カード起動 //----------------------------------------------------- if( SYSM_IsExistCard() ) { - if( SYSMi_GetWork()->isOnDebugger || + if( ( SYSMi_GetWork()->isOnDebugger && // ISデバッガが有効かつJTAGがまだ有効でない時 + !( *(u8 *)( HW_SYS_CONF_BUF + HWi_WSYS09_OFFSET ) & HWi_WSYS09_JTAG_CPUJE_MASK ) ) || SYSM_IsInspectCard() || ( ( PAD_Read() & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) == PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) @@ -724,6 +725,7 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) // 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ライブラリで行う。 } } } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index c7bc9dae..395b1919 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -75,10 +75,10 @@ void TwlMain( void ) OSTick start, end = 0; BOOL direct_boot = FALSE; - OS_Init(); // システムメニュー初期化---------- - SYSM_SetArena(); - SYSM_Init( Alloc, Free ); // OS_Initは、本関数内でコールしているので、コールする必要なし。 + SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。 + OS_Init(); + SYSM_SetArena(); // OS_Initの後でコールする必要あり。 // OS初期化------------------------ OS_InitTick();