アプリジャンプ時のデバッガ接続対応(ROMエミュレーション情報再ロード版)。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1149 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-04-15 11:24:20 +00:00
parent 3bdc49eac2
commit c42bc3397c
4 changed files with 61 additions and 19 deletions

View File

@ -44,6 +44,9 @@
#include "nvram_sp.h" #include "nvram_sp.h"
#include "twl/sea.h" #include "twl/sea.h"
// 未実装(現状ではデバッガ接続しないなら選択してもよい)
//#define HYENA_ROMEMU_INFO_FROM_LNCR_PARAM
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
@ -217,13 +220,25 @@ TwlSpMain(void)
if( ( SYSM_GetLauncherParamBody()->v1.flags.isValid ) && if( ( SYSM_GetLauncherParamBody()->v1.flags.isValid ) &&
( SYSM_GetLauncherParamBody()->v1.flags.bootType != LAUNCHER_BOOTTYPE_ROM ) && ( SYSM_GetLauncherParamBody()->v1.flags.bootType != LAUNCHER_BOOTTYPE_ROM ) &&
( SYSM_GetLauncherParamBody()->v1.bootTitleID ) ( SYSM_GetLauncherParamBody()->v1.bootTitleID )
) { )
#ifdef HYENA_ROMEMU_INFO_FROM_LNCR_PARAM
{
// ランチャーパラメータでダイレクトカードブート以外の指定がある時は、活線挿抜をOFFにする。 // ランチャーパラメータでダイレクトカードブート以外の指定がある時は、活線挿抜をOFFにする。
SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 0; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 0;
}else { }else {
// それ以外の時は活線挿抜ON // それ以外の時は活線挿抜ON
SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1;
} }
#else
{
// ランチャーパラメータでダイレクトカードブート以外の指定がある時は、ROMエミュレーション情報のみ必要。
SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly = 1;
}else {
// それ以外の時は普通にロード
SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly = 0;
}
SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1;
#endif
// [TODO]アプリジャンプ有効で、カードブートでない時は、最初からHOTSW_Initを呼ばないようにしたい。 // [TODO]アプリジャンプ有効で、カードブートでない時は、最初からHOTSW_Initを呼ばないようにしたい。
HOTSW_Init(THREAD_PRIO_HOTSW); HOTSW_Init(THREAD_PRIO_HOTSW);

View File

@ -233,6 +233,7 @@ typedef enum CardType{
typedef enum HotSwState{ typedef enum HotSwState{
HOTSW_SUCCESS = 0, HOTSW_SUCCESS = 0,
HOTSW_ROMEMU_ONLY,
HOTSW_TIME_OUT, HOTSW_TIME_OUT,
HOTSW_CARD_LOCK_ERROR, HOTSW_CARD_LOCK_ERROR,
HOTSW_CRC_CHECK_ERROR, HOTSW_CRC_CHECK_ERROR,

View File

@ -83,6 +83,7 @@ static BOOL isTwlModeLoad(void);
static HotSwState ReadSecureModeCardData(void); static HotSwState ReadSecureModeCardData(void);
static void ClearCaradFlgs(void); static void ClearCaradFlgs(void);
static void RegisterRomEmuInfo(void);
static void GenVA_VB_VD(void); static void GenVA_VB_VD(void);
static HotSwState DecryptObjectFile(void); static HotSwState DecryptObjectFile(void);
static HotSwState LoadBannerData(void); static HotSwState LoadBannerData(void);
@ -404,6 +405,15 @@ static HotSwState LoadCardData(void)
( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval;
} }
// アプリジャンプのデバッグ時にROMエミュレーション情報だけ必要な場合
if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){
SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
RegisterRomEmuInfo();
// 排他制御ここまで
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
goto end;
}
} }
if( retval == HOTSW_SUCCESS ) { if( retval == HOTSW_SUCCESS ) {
@ -502,7 +512,7 @@ static HotSwState LoadCardData(void)
// カードIDの比較をして、一致しなければFALSEを返す // カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_scr != s_cbData.id_gam){ if(s_cbData.id_scr != s_cbData.id_gam){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
goto end; goto finalize;
} }
// 常駐モジュール残りを指定先に転送 // 常駐モジュール残りを指定先に転送
@ -528,7 +538,7 @@ static HotSwState LoadCardData(void)
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
} }
end: finalize:
if( retval == HOTSW_SUCCESS ) if( retval == HOTSW_SUCCESS )
{ {
// バッドブロックを置換 // バッドブロックを置換
@ -536,6 +546,7 @@ end:
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
} }
end:
// カードDMA終了確認 // カードDMA終了確認
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
@ -730,6 +741,26 @@ BOOL HOTSWi_IsRomEmulation(void)
#endif #endif
} }
/*---------------------------------------------------------------------------*
Name: RegisterRomEmuInfo
Description: ROMエミュレーション情報を登録
*---------------------------------------------------------------------------*/
static void RegisterRomEmuInfo(void)
{
SYSM_work* sw = SYSMi_GetWork();
// デバッガ情報
if ( ! sw->flags.hotsw.is1stCardChecked && debuggerFlg )
{
MI_CpuCopy8( &s_romEmuInfo, &(sw->romEmuInfo), ROM_EMULATION_DATA_SIZE );
sw->flags.hotsw.isOnDebugger = debuggerFlg;
}
sw->flags.hotsw.isCardStateChanged = TRUE;
sw->flags.hotsw.is1stCardChecked = TRUE;
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: LoadBannerData Name: LoadBannerData
@ -742,6 +773,7 @@ static HotSwState LoadBannerData(void)
{ {
BOOL state; BOOL state;
HotSwState retval = HOTSW_SUCCESS; HotSwState retval = HOTSW_SUCCESS;
SYSM_work* sw = SYSMi_GetWork();
// バナーリード // バナーリード
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) { if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
@ -751,33 +783,26 @@ static HotSwState LoadBannerData(void)
// バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK) // バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK)
state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE; state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE;
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = state; sw->flags.hotsw.isValidCardBanner = state;
SYSMi_GetWork()->flags.hotsw.isExistCard = state; sw->flags.hotsw.isExistCard = state;
} }
else{ else{
// バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK) // バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK)
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; sw->flags.hotsw.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; sw->flags.hotsw.isExistCard = TRUE;
} }
if ( SYSMi_GetWork()->flags.hotsw.isExistCard ) if ( sw->flags.hotsw.isExistCard )
{ {
SYSMi_GetWork()->flags.hotsw.isInspectCard = s_cbData.pBootSegBuf->rh.s.inspect_card; sw->flags.hotsw.isInspectCard = s_cbData.pBootSegBuf->rh.s.inspect_card;
} }
else else
{ {
SYSMi_GetWork()->flags.hotsw.isInspectCard = FALSE; sw->flags.hotsw.isInspectCard = FALSE;
} }
// ƒfƒoƒbƒK<C692>î•ñ // デバッガ情報を登録
if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && debuggerFlg ) RegisterRomEmuInfo();
{
MI_CpuCopy8( &s_romEmuInfo, &(SYSMi_GetWork()->romEmuInfo), ROM_EMULATION_DATA_SIZE );
SYSMi_GetWork()->flags.hotsw.isOnDebugger = debuggerFlg;
}
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
return retval; return retval;
} }

View File

@ -100,6 +100,7 @@ typedef struct SYSM_work {
vu16 isOnDebugger :1; // デバッガ動作か? vu16 isOnDebugger :1; // デバッガ動作か?
vu16 isEnableHotSW :1; // 活線挿抜有効? vu16 isEnableHotSW :1; // 活線挿抜有効?
vu16 isBusyHotSW :1; // 活線挿抜処理中? vu16 isBusyHotSW :1; // 活線挿抜処理中?
vu16 isLoadRomEmuOnly :1; // ROMエミュレーション情報のみロード
vu16 isCardLoadCompleted :1; // カードからデータロード完了? vu16 isCardLoadCompleted :1; // カードからデータロード完了?
vu16 isValidCardBanner :1; // バナーデータ更新? vu16 isValidCardBanner :1; // バナーデータ更新?
vu16 is1stCardChecked :1; // カードデータの1stチェック完了 vu16 is1stCardChecked :1; // カードデータの1stチェック完了