(更新:Akabane Jumpei)

・不正なカードを挿したあと、カードが認識されないバグを修正。
・カードの読みミスをした場合、バッファのクリアを行うように修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2124 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-08-07 07:38:18 +00:00
parent 9b0340d11a
commit 7cb3a9df57
2 changed files with 62 additions and 35 deletions

View File

@ -236,6 +236,7 @@ typedef enum HotSwState{
HOTSW_DATA_DECRYPT_ERROR,
HOTSW_BUFFER_OVERRUN_ERROR,
HOTSW_MODE_ERROR,
HOTSW_ILLEGAL_CARD_ERROR,
HOTSW_UNEXPECTED_ERROR
} HotSwState;

View File

@ -131,7 +131,7 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
static void CheckCardInsert(BOOL cardExist);
static void CheckCardPullOut(BOOL cardExist);
static void PulledOutSequence(void);
// Static Values ------------------------------------------------------------
#include <twl/ltdwram_begin.h>
@ -148,7 +148,7 @@ static BootSegmentData *s_pBootSegBuffer;
static u32 *s_pSecureSegBuffer;
static u32 *s_pSecure2SegBuffer;
static CardBootData s_cbData;
static CardBootData s_cbData ATTRIBUTE_ALIGN(4);
static SYSMRomEmuInfo s_romEmuInfo;
static BOOL s_debuggerFlg;
@ -515,10 +515,32 @@ static HotSwState LoadCardData(void)
// ---------------------- Game Mode ----------------------
romMode = HOTSW_ROM_MODE_GAME;
if(retval != HOTSW_SUCCESS || s_cbData.illegalCardFlg){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ILLEGAL_CARD_ERROR : retval;
// 排他制御ここまで
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
goto finalize;
}
// ID読み込み
state = ReadIDGame(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードIDの比較をして、一致しなければFALSEを返す
{
u32 secure_ID = (s_cbData.modeType == HOTSW_MODE1) ? s_cbData.id_scr : s_cbData.id_scr2;
if(secure_ID != s_cbData.id_gam){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
// 排他制御ここまで
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
goto finalize;
}
}
// バナーファイルの読み込み
state = LoadBannerData();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
@ -526,12 +548,6 @@ static HotSwState LoadCardData(void)
// 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで)
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
// カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_scr != s_cbData.id_gam){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
goto finalize;
}
// 認証コード読み込み&ワーク領域にコピー
state = CheckCardAuthCode();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
@ -640,6 +656,8 @@ static HotSwState ReadSecureModeCardData(void)
HotSwState retval = HOTSW_SUCCESS;
HotSwState state = HOTSW_SUCCESS;
u32 secure_ID;
// PNG設定
state = s_funcTable[s_debuggerFlg].SetPNG_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
@ -652,9 +670,10 @@ static HotSwState ReadSecureModeCardData(void)
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードIDの比較をして、一致しなければFALSEを返す
if(s_cbData.id_nml != s_cbData.id_scr){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
}
secure_ID = (s_cbData.modeType == HOTSW_MODE1) ? s_cbData.id_scr : s_cbData.id_scr2;
if(s_cbData.id_nml != secure_ID){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
}
if(retval == HOTSW_SUCCESS){
// Secure領域のSegment読み込み
@ -1631,36 +1650,16 @@ static void HotSwThread(void *arg)
s_isPulledOut = FALSE;
// エラー処理
if(retval != HOTSW_SUCCESS || s_cbData.illegalCardFlg){
ClearCardFlgs();
McPowerOff();
s_isPulledOut = TRUE;
if(retval != HOTSW_SUCCESS){
McPowerOff();
PulledOutSequence();
break;
}
}
// カードが抜けてたら
else{
#ifdef USE_WRAM_LOAD
SendPxiMessage(HOTSW_CARD_PULLOUT);
#endif
ClearCardFlgs();
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
MI_CpuClearFast(s_pSecure2SegBuffer, s_Secure2SegBufSize);
MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile));
s_isPulledOut = TRUE;
// ワンセグのスリープ時シャットダウン対策を戻す
MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE );
PulledOutSequence();
break;
}
} // Card Read while loop
@ -1671,6 +1670,33 @@ static void HotSwThread(void *arg)
}
/*---------------------------------------------------------------------------*
Name: PulledOutSequence
Description:
*---------------------------------------------------------------------------*/
static void PulledOutSequence(void)
{
#ifdef USE_WRAM_LOAD
SendPxiMessage(HOTSW_CARD_PULLOUT);
#endif
ClearCardFlgs();
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
MI_CpuClearFast(s_pBootSegBuffer, s_BootSegBufSize);
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
MI_CpuClearFast(s_pSecure2SegBuffer, s_Secure2SegBufSize);
MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile));
s_isPulledOut = TRUE;
// ワンセグのスリープ時シャットダウン対策を戻す
MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE );
}
/*---------------------------------------------------------------------------*
Name: ClearCardFlgs