(更新:Akabane Jumpei)

・SYSM共有ワーク構造体を整理して、hotsw用のフラグを分離
・カードアクセス可能かを判定する関数追加

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@742 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-26 05:08:33 +00:00
parent 7d66e926a8
commit 9d655b885c
11 changed files with 104 additions and 84 deletions

View File

@ -212,10 +212,10 @@ TwlSpMain(void)
( SYSM_GetLauncherParamBody()->v1.bootTitleID ) ( SYSM_GetLauncherParamBody()->v1.bootTitleID )
) { ) {
// ランチャーパラメータでダイレクトカードブート以外の指定がある時は、活線挿抜をOFFにする。 // ランチャーパラメータでダイレクトカードブート以外の指定がある時は、活線挿抜をOFFにする。
SYSMi_GetWork()->flags.common.isEnableHotSW = 0; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 0;
}else { }else {
// それ以外の時は活線挿抜ON // それ以外の時は活線挿抜ON
SYSMi_GetWork()->flags.common.isEnableHotSW = 1; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = 1;
} }
HOTSW_Init(); HOTSW_Init();

View File

@ -36,7 +36,7 @@ static void SetMCSCR(void);
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd) HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -71,7 +71,7 @@ HotSwState ChangeModeNormal_DSType1(CardBootData *cbd)
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
u64 vae64 = cbd->vae; u64 vae64 = cbd->vae;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -176,7 +176,7 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadIDSecure_DSType1(CardBootData *cbd) HotSwState ReadIDSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -213,7 +213,7 @@ HotSwState ReadSegSecure_DSType1(CardBootData *cbd)
GCDCmd64 cndLE, cndBE; GCDCmd64 cndLE, cndBE;
for(i=0; i<4; i++){ for(i=0; i<4; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -269,7 +269,7 @@ HotSwState ReadSegSecure_DSType1(CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd) HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -296,7 +296,7 @@ HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd) HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -325,7 +325,7 @@ HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd) HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -356,7 +356,7 @@ HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadIDGame_DSType1(CardBootData *cbd) HotSwState ReadIDGame_DSType1(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -396,7 +396,7 @@ HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u3
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }

View File

@ -48,7 +48,7 @@ HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd)
GCDCmd64 cndLE, cndBE; GCDCmd64 cndLE, cndBE;
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){ for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -169,7 +169,7 @@ HotSwState ReadIDSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask; u32 scrambleMask;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -222,7 +222,7 @@ HotSwState ReadSegSecure_DSType2(CardBootData *cbd)
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
for(i=0; i<SECURE_SEGMENT_NUM; i++){ for(i=0; i<SECURE_SEGMENT_NUM; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -296,7 +296,7 @@ HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask; u32 scrambleMask;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -339,7 +339,7 @@ HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask; u32 scrambleMask;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -382,7 +382,7 @@ HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
{ {
u32 scrambleMask; u32 scrambleMask;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -447,7 +447,7 @@ HotSwState ReadPageGame_DSType2(CardBootData *cbd, u32 start_addr, void* buf, u3
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); // OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }

View File

@ -251,7 +251,7 @@ void HOTSW_Init(void)
// カードが挿さってあったらスレッドを起動する // カードが挿さってあったらスレッドを起動する
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardAccessible()){
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
@ -259,7 +259,7 @@ void HOTSW_Init(void)
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
} }
else{ else{
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
} }
} }
@ -306,7 +306,7 @@ static HotSwState LoadCardData(void)
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
// ブート処理開始 // ブート処理開始
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardAccessible()){
// Arm9との排他制御用ロックIDを取得する // Arm9との排他制御用ロックIDを取得する
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
@ -516,18 +516,18 @@ static HotSwState LoadBannerData(void)
} }
else{ else{
// バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK) // バナーデータが登録されていない場合 (この関数の外で排他制御されているからここでは排他制御しないでOK)
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.common.isExistCard = TRUE; SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
return retval; return retval;
} }
// バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK) // バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK)
state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE; state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE;
SYSMi_GetWork()->flags.common.isValidCardBanner = state; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = state;
SYSMi_GetWork()->flags.common.isCardStateChanged = state; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = state;
SYSMi_GetWork()->flags.common.isExistCard = state; SYSMi_GetWork()->flags.hotsw.isExistCard = state;
return retval; return retval;
} }
@ -668,7 +668,7 @@ static HotSwState CheckCardAuthCode(void)
u8 *p = (u8 *)authBuf; u8 *p = (u8 *)authBuf;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -962,6 +962,29 @@ static void UnlockHotSwRsc(OSLockWord* word)
} }
} }
/* -----------------------------------------------------------------
* HOTSW_IsCardAccessible関数
*
*
*
* SCFG_MC1のCDETフラグとM()
* ----------------------------------------------------------------- */
BOOL HOTSW_IsCardAccessible(void)
{
#ifndef DEBUG_USED_CARD_SLOT_B_
u32 mask = (u32)(REG_MI_MC_SL1_CDET_MASK << GetMcSlotShift());
#else
u32 mask = (u32)(REG_MI_MC_SL2_CDET_MASK >> GetMcSlotShift());
#endif
if( !(reg_MI_MC1 & mask) && CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){
return TRUE;
}
else{
return FALSE;
}
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* IsSwap関数 * IsSwap関数
* *
@ -1143,13 +1166,13 @@ static void McThread(void *arg)
OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
// カードデータロード完了フラグを下ろす // カードデータロード完了フラグを下ろす
SYSMi_GetWork()->flags.common.isCardLoadCompleted = FALSE; SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE;
while(1){ while(1){
// 活線挿抜抑制フラグが立っていたら処理しない // 活線挿抜抑制フラグが立っていたら処理しない
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) { if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) {
//#ifdef DEBUG_USED_CARD_SLOT_B_ //#ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
//#endif //#endif
break; break;
} }
@ -1162,10 +1185,10 @@ static void McThread(void *arg)
if(CARDi_IsPulledOutEx(hotswCount)){ if(CARDi_IsPulledOutEx(hotswCount)){
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) { if( SYSMi_GetWork()->flags.hotsw.reqChangeHotSW ) {
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = SYSMi_GetWork()->flags.hotsw.nextHotSWStatus;
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0; SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 0;
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0; SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = 0;
// HOTSW_Finalize(); // HOTSW_Finalize();
} }
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
@ -1175,8 +1198,8 @@ static void McThread(void *arg)
{ {
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL );
SYSMi_GetWork()->flags.common.isExistCard = TRUE; SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL );
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
} }
@ -1189,7 +1212,7 @@ static void McThread(void *arg)
SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg; SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
// カードデータロード完了フラグ // カードデータロード完了フラグ
SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE; SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE;
OS_PutString("ok!\n"); OS_PutString("ok!\n");
@ -1220,9 +1243,9 @@ static void McThread(void *arg)
{ {
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isExistCard = FALSE; SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE;
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
} }
@ -1237,7 +1260,7 @@ static void McThread(void *arg)
} }
} }
//#ifdef DEBUG_USED_CARD_SLOT_B_ //#ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
//#endif //#endif
} }
} }
@ -1297,7 +1320,7 @@ static void SetHotSwState(BOOL busy)
{ {
LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); LockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
SYSMi_GetWork()->flags.common.isBusyHotSW = busy ? 1 : 0; SYSMi_GetWork()->flags.hotsw.isBusyHotSW = busy ? 1 : 0;
UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW); UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
} }

View File

@ -41,7 +41,7 @@ HotSwState ReadBootSegNormal_ROMEMU(CardBootData *cbd)
// u32 n = 0; // u32 n = 0;
for(i=0; i<BOOT_PAGE_NUM; i++){ for(i=0; i<BOOT_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -94,7 +94,7 @@ HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd)
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -138,7 +138,7 @@ HotSwState ChangeModeNormal_ROMEMU(CardBootData *cbd)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
{ {
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -174,7 +174,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
u32 n = 0; u32 n = 0;
for(i=0; i<SECURE_PAGE_NUM; i++){ for(i=0; i<SECURE_PAGE_NUM; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -250,7 +250,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
GCDCmd64 tempCnd, cnd; GCDCmd64 tempCnd, cnd;
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -296,7 +296,7 @@ HotSwState ReadIDGame_ROMEMU(CardBootData *cbd)
{ {
#pragma unused( cbd ) #pragma unused( cbd )
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }
@ -340,7 +340,7 @@ HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32
OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){ for(i=0; i<loop; i++){
if(!HOTSW_IsCardExist()){ if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR; return HOTSW_PULLED_OUT_ERROR;
} }

View File

@ -45,7 +45,7 @@ BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner )
{ {
#pragma unused(bannerOffset) #pragma unused(bannerOffset)
BOOL isRead; BOOL isRead;
if( SYSMi_GetWork()->flags.common.isValidCardBanner ) { if( SYSMi_GetWork()->flags.hotsw.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) );
} }

View File

@ -121,7 +121,7 @@ TitleProperty *SYSM_ReadParameters( void )
} }
//#ifdef DEBUG_USED_CARD_SLOT_B_ //#ifdef DEBUG_USED_CARD_SLOT_B_
// ARM7のカードチェック完了を待つ // ARM7のカードチェック完了を待つ
while( !SYSMi_GetWork()->flags.common.is1stCardChecked ) { while( !SYSMi_GetWork()->flags.hotsw.is1stCardChecked ) {
SVC_WaitByLoop( 0x1000 ); SVC_WaitByLoop( 0x1000 );
} }
//#endif //#endif

View File

@ -144,7 +144,7 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
// region_codeが本体情報と違うもの // region_codeが本体情報と違うもの
// の場合は、正常に認識できないタイトルであることを示す。 // の場合は、正常に認識できないタイトルであることを示す。
if( SYSMi_GetWork()->flags.common.isCardStateChanged ) { if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) {
MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) ); MI_CpuClear32( pTitleList_Card, sizeof(TitleProperty) );
@ -162,7 +162,7 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ); SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] );
pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE; // カード情報更新フラグを落とす SYSMi_GetWork()->flags.hotsw.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 );
@ -1049,27 +1049,27 @@ void SYSMi_EnableHotSW( BOOL enable )
enable = enable ? 1 : 0; enable = enable ? 1 : 0;
// 現在の値と同じなら何もせずリターン // 現在の値と同じなら何もせずリターン
if( SYSMi_GetWork()->flags.common.isEnableHotSW == enable ) { if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == enable ) {
return; return;
} }
{ {
u16 id = (u16)OS_GetLockID(); u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
if( !SYSMi_GetWork()->flags.common.isBusyHotSW ) { if( !SYSMi_GetWork()->flags.hotsw.isBusyHotSW ) {
// ARM7側がビジーでなければ、直接書き換え // ARM7側がビジーでなければ、直接書き換え
SYSMi_GetWork()->flags.common.isEnableHotSW = enable; SYSMi_GetWork()->flags.hotsw.isEnableHotSW = enable;
}else { }else {
// ARM7側がビジーなら、変更要求をしてARM7が値を書き換えてくれるのを待つ。 // ARM7側がビジーなら、変更要求をしてARM7が値を書き換えてくれるのを待つ。
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 1; SYSMi_GetWork()->flags.hotsw.reqChangeHotSW = 1;
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = enable; SYSMi_GetWork()->flags.hotsw.nextHotSWStatus = enable;
} }
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL ); (void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id ); OS_ReleaseLockID( id );
} }
// 値が変化するまでスリープして待つ。 // 値が変化するまでスリープして待つ。
while( SYSMi_GetWork()->flags.common.isEnableHotSW != enable ) { while( SYSMi_GetWork()->flags.hotsw.isEnableHotSW != enable ) {
OS_Sleep( 2 ); OS_Sleep( 2 );
} }
} }

View File

@ -86,7 +86,7 @@ BOOL SYSM_IsValidTSD( void )
// 有効なTWL/NTRカードが差さっているか // 有効なTWL/NTRカードが差さっているか
BOOL SYSM_IsExistCard( void ) BOOL SYSM_IsExistCard( void )
{ {
return (BOOL)SYSMi_GetWork()->flags.common.isExistCard; return (BOOL)SYSMi_GetWork()->flags.hotsw.isExistCard;
} }

View File

@ -30,7 +30,10 @@ extern "C" {
void HOTSW_Init(void); void HOTSW_Init(void);
// カードの存在判定 // カードの存在判定
BOOL HOTSW_IsCardExist(void); BOOL HOTSW_IsCardExist(void);
// カードにアクセスできる状態か判定
BOOL HOTSW_IsCardAccessible(void);
// Boot Segment バッファの指定 // Boot Segment バッファの指定
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size); void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);

View File

@ -87,37 +87,31 @@ typedef struct SYSM_work {
vu32 isValidTSD :1; // NITRO設定データ無効フラグ vu32 isValidTSD :1; // NITRO設定データ無効フラグ
vu32 isLogoSkip :1; // ロゴデモスキップ vu32 isLogoSkip :1; // ロゴデモスキップ
vu32 isOnDebugger :1; // デバッガ動作か? vu32 isOnDebugger :1; // デバッガ動作か?
vu32 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu32 isCardStateChanged :1; // カード状態更新フラグ
vu32 isLoadSucceeded :1; // アプリロード完了? vu32 isLoadSucceeded :1; // アプリロード完了?
vu32 isCardBoot :1; // カードブートか? vu32 isCardBoot :1; // カードブートか?
vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。 vu32 isBrokenHWNormalInfo :1; // HWーマル情報が破損している。
vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。 vu32 isBrokenHWSecureInfo :1; // HWセキュア情報が破損している。
vu32 isResetRTC :1; // RTCリセット発生 vu32 isResetRTC :1; // RTCリセット発生
vu32 :0; vu32 :0;
vu32 isEnableHotSW :1; // 活線挿抜有効?
vu32 isBusyHotSW :1; // 活線挿抜処理中?
vu32 isCardLoadCompleted :1; // カードからデータロード完了?
//#ifdef DEBUG_USED_CARD_SLOT_B_
vu32 isValidCardBanner :1;
vu32 is1stCardChecked :1;
//#endif
vu32 :0;
}common; }common;
struct { struct {
vu16 reqChangeHotSW :1; vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu16 nextHotSWStatus :1; vu16 isEnableHotSW :1; // 活線挿抜有効?
vu16 :0; vu16 isBusyHotSW :1; // 活線挿抜処理中?
}arm9; vu16 isCardLoadCompleted :1; // カードからデータロード完了?
struct { vu16 isValidCardBanner :1;
vu16 rsv:16; vu16 is1stCardChecked :1;
}arm7; vu16 reqChangeHotSW :1; // 削除予定
}flags; // 12B vu16 nextHotSWStatus :1; // 削除予定
vu16 :8;
vu8 isCardStateChanged; // カード状態更新フラグ
}hotsw;
}flags; // 7B
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側 u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側 u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側
OSLockWord lockCardRsc; // カードリソース排他制御用
OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用
OSLockWord lockHotSW; // カードリソース排他制御用 OSLockWord lockHotSW; // カードリソース排他制御用
u32 nCardID; // カードID u32 nCardID; // カードID
u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする) u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする)