SDK3790に対応中。

BOOTTYPEの仕様変更に対応。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@508 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-01-23 12:00:21 +00:00
parent 301b8c21f9
commit 90d2377e65
11 changed files with 93 additions and 78 deletions

View File

@ -35,10 +35,10 @@
// extern data-----------------------------------------------------------------
// function's prototype--------------------------------------------------------
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 );
static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID );
static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc );
static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
@ -74,16 +74,16 @@ void SYSMi_SetLauncherMountInfo( void )
NAMTitleId titleID = TITLE_ID_LAUNCHER;
// ※とりあえず自身はROMブートで。[TODO:]後で修正
// SYSMi_SetBootSRLPath( OS_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
// SYSMi_SetBootSRLPath( LAUNCHER_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
// セーブデータ有無によるマウント情報の編集
// ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。
SYSMi_ModifySaveDataMountForLauncher( OS_BOOTTYPE_NAND,
SYSMi_ModifySaveDataMountForLauncher( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( OS_BOOTTYPE_NAND,
SYSMi_SetMountInfoCore( LAUNCHER_BOOTTYPE_NAND,
titleID,
&s_defaultMountList[0] );
}
@ -98,16 +98,16 @@ void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
}
// 起動アプリのSRLパスをセット
SYSMi_SetBootSRLPath( (OSBootType)pBootTitle->flags.bootType,
SYSMi_SetBootSRLPath( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID );
// セーブデータ有無によるマウント情報の編集
SYSMi_ModifySaveDataMount( (OSBootType)pBootTitle->flags.bootType,
SYSMi_ModifySaveDataMount( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] );
// マウント情報のセット
SYSMi_SetMountInfoCore( (OSBootType)pBootTitle->flags.bootType,
SYSMi_SetMountInfoCore( (LauncherBootType)pBootTitle->flags.bootType,
pBootTitle->titleID,
&s_defaultMountList[0] );
@ -121,18 +121,18 @@ void SYSMi_SetBootAppMountInfo( TitleProperty *pBootTitle )
// 起動SRLパスをシステム領域にセット
static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID )
static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID )
{
static char path[ FS_ENTRY_LONGNAME_MAX ];
switch( bootType )
{
case OS_BOOTTYPE_NAND:
case LAUNCHER_BOOTTYPE_NAND:
if( NAM_GetTitleBootContentPathFast( path, titleID ) != NAM_OK ) {
OS_TPrintf( "ERROR: BootContentPath Get failed.\n" );
}
break;
case OS_BOOTTYPE_TEMP:
case LAUNCHER_BOOTTYPE_TEMP:
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", titleID );
break;
default:
@ -151,7 +151,7 @@ static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID )
// マウント情報をシステム領域に書き込み
static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc )
static void SYSMi_SetMountInfoCore( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc )
{
#pragma unused(bootType)
@ -185,16 +185,16 @@ static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSM
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
static void SYSMi_ModifySaveDataMount( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->isOnDebugger ) )
) {
@ -229,16 +229,16 @@ static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID,
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
static void SYSMi_ModifySaveDataMountForLauncher( LauncherBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt )
{
int i;
// ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。
// セーブデータ有無を判定して、パスをセット
if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
if( ( ( bootType == LAUNCHER_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) ) ||
( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( ( bootType == LAUNCHER_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時
( titleID & TITLEID_MEDIA_NAND_FLAG ) &&
( SYSMi_GetWork()->isOnDebugger ) )
) {

View File

@ -157,6 +157,7 @@ TitleProperty *SYSM_ReadParameters( void )
if( !LCFG_ReadHWSecureInfo() ) {
OS_TPrintf( "HW Secure Info Broken!\n" );
SYSMi_GetWork()->isBrokenHWSecureInfo = TRUE;
SYSMi_GetWork()->isFatalError = TRUE;
}
//-----------------------------------------------------
@ -209,7 +210,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
s_bootTitle.flags.isAppLoadCompleted = TRUE;
s_bootTitle.flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
s_bootTitle.flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
s_bootTitle.flags.bootType = OS_BOOTTYPE_ROM;
s_bootTitle.flags.bootType = LAUNCHER_BOOTTYPE_ROM;
s_bootTitle.flags.isValid = TRUE;
s_bootTitle.titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo );
SYSM_SetLogoDemoSkip( s_bootTitle.flags.isLogoSkip );
@ -228,7 +229,7 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void )
!LCFG_TSD_IsSetUserColor() ||
!LCFG_TSD_IsSetNickname() ) {
s_bootTitle.titleID = TITLE_ID_MACHINE_SETTINGS;
s_bootTitle.flags.bootType = OS_BOOTTYPE_NAND;
s_bootTitle.flags.bootType = LAUNCHER_BOOTTYPE_NAND;
s_bootTitle.flags.isValid = TRUE;
return &s_bootTitle;
}

View File

@ -36,6 +36,13 @@ static OSThread s_thread;
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
// const data------------------------------------------------------------------
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
OS_BOOTTYPE_ILLEGAL, // ILLEGAL
OS_BOOTTYPE_ROM, // ROM
OS_BOOTTYPE_NAND, // TEMP
OS_BOOTTYPE_NAND, // NAND
OS_BOOTTYPE_MEMORY, // MEMORY
};
// ============================================================================
//
@ -81,41 +88,13 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
}
// タイトル情報フラグのセット
pTitleList_Card->flags.bootType = OS_BOOTTYPE_ROM;
pTitleList_Card->flags.bootType = LAUNCHER_BOOTTYPE_ROM;
pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo );
return retval;
}
// Žwèƒtƒ@ƒCƒƒŠ<C692>[ƒh
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 )
{
@ -214,7 +193,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
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;
pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND;
}
}
// return : *TitleProperty Array
@ -222,6 +201,34 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
}
// 指定ファイルリード
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;
}
// ============================================================================
//
// アプリ起動
@ -250,22 +257,21 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
FSFile file[1];
BOOL bSuccess;
BOOL isTwlApp = TRUE;
if(pBootTitle->flags.bootType == OS_BOOTTYPE_NAND)
{
switch( pBootTitle->flags.bootType )
{
case LAUNCHER_BOOTTYPE_NAND:
// NAND
NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID);
}
else if(pBootTitle->flags.bootType == OS_BOOTTYPE_ROM)
{
break;
case LAUNCHER_BOOTTYPE_ROM:
// TODO:CARD未読の場合の処理
}
else if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP)
{
break;
case LAUNCHER_BOOTTYPE_TEMP:
// tmpフォルダ
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID );
}
else
{
break;
default:
// unknown
return;
}
@ -394,7 +400,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
(void)FS_CloseFile(file);
if(pBootTitle->flags.bootType == OS_BOOTTYPE_TEMP)
if(pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP)
{
// tmpアプリの場合はファイル削除
// TODO:その他読み込み等の失敗時にもDeleteする必要あり
@ -432,7 +438,7 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
SYSMi_GetWork()->isLoadSucceeded = TRUE;
}
if( pBootTitle->flags.bootType == OS_BOOTTYPE_ROM ) {
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
SYSMi_GetWork()->isCardBoot = TRUE;
}else if(pBootTitle->flags.isAppLoadCompleted)
{
@ -525,6 +531,14 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
}
#endif
// BOOTTYPE_MEMORYでNTRモードのFSありでブートすると、旧NitroSDKでビルドされたアプリの場合、
// ROMアーカイブにカードが割り当てられて、FSで関係ないカードにアクセスにいってしまうので、それを防止する。
if( ( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_MEMORY ) &&
( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) == 0 ) &&
( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->fat_size ) > 0 )
) {
return AUTH_RESULT_TITLE_BOOTTYPE_ERROR;
}
// ※ROMヘッダ認証
@ -533,16 +547,14 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
SYSMi_SetBootAppMountInfo( pBootTitle );
// HW_WM_BOOT_BUFへのブート情報セット
{
OSBootInfo *pBootInfo = (OSBootInfo *)OS_GetBootInfo();
pBootInfo->boot_type = (OSBootType)pBootTitle->flags.bootType;
}
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];
BOOT_Ready(); // never return.
return AUTH_RESULT_SUCCEEDED;
}
#if 0
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。
// もしかすると使わないかも

View File

@ -509,7 +509,7 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList )
u16 dummy;
u16 tp_lr = 3;
TitleProperty *ret = NULL;
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
// バックライト関係のキー処理
ProcessBackLightPads();

View File

@ -188,7 +188,7 @@ int MachineSettingMain( void )
{
BOOL tp_select;
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
ReadTP();

View File

@ -439,7 +439,7 @@ static void MenuScene(void)
{
BOOL tp_select = FALSE;
static TPData tgt = (TPData){0,0,0,0};
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
ReadTP();

View File

@ -124,7 +124,7 @@ static void MenuInit( void )
static void MenuScene(void)
{
BOOL tp_select = FALSE;
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
ReadTP();

View File

@ -439,7 +439,7 @@ static void MenuScene(void)
{
BOOL tp_select = FALSE;
static TPData tgt = (TPData){0,0,0,0};
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, FALSE, FALSE, 0};
ReadTP();

View File

@ -134,7 +134,7 @@ static BOOL LoadTitle( NAMTitleId bootTitleID )
static void MenuScene(void)
{
BOOL tp_select = FALSE;
LauncherBootFlags tempflag = {TRUE, OS_BOOTTYPE_NAND, TRUE, FALSE, TRUE, FALSE, 0};
LauncherBootFlags tempflag = {TRUE, LAUNCHER_BOOTTYPE_NAND, TRUE, FALSE, TRUE, FALSE, 0};
ReadTP();

View File

@ -65,7 +65,8 @@ typedef enum AuthResult {
AUTH_RESULT_TITLE_LOAD_FAILED = 2,
AUTH_RESULT_TITLE_POINTER_ERROR = 3,
AUTH_RESULT_AUTHENTICATE_FAILED = 4,
AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5
AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5,
AUTH_RESULT_TITLE_BOOTTYPE_ERROR = 6
}AuthResult;

View File

@ -70,6 +70,7 @@ typedef struct ISD_RomEmuInfo {
// SYSM共有ワーク構造体
typedef struct SYSM_work {
Relocate_Info romRelocateInfo[RELOCATE_INFO_NUM]; // ROM再配置情報arm9,arm7それぞれltdとflxで最大4つ
vu32 isFatalError :1; // FATALエラー
vu32 isARM9Start :1; // ARM9スタートフラグ
vu32 isHotStart :1; // Hot/Coldスタート判定
vu32 isValidLauncherParam :1; // リセットパラメータ有効
@ -86,9 +87,9 @@ typedef struct SYSM_work {
#ifdef DEBUG_USED_CARD_SLOT_B_
vu32 isValidCardBanner :1;
vu32 is1stCardChecked :1;
vu32 rsv :18;
vu32 rsv :17;
#else
vu32 rsv :20;
vu32 rsv :19;
#endif
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側