(更新:Akabane Jumpei) 挿抜処理を行うスレッド内の処理を変更。(検証途中)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@689 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-18 08:26:02 +00:00
parent 7850f38f51
commit 7cc412171e
3 changed files with 107 additions and 100 deletions

View File

@ -23,15 +23,15 @@ static void SetMCSCR(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: ReadIDNormal_DSType1 Name: ReadIDNormal_DSType1
Description: DSカードType1のーマルモードのID読み込み Description: Type1のーマルモードのID読み込み
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
// ‹¤’Ê // ‹¤’Ê
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadBootSegNormal_DSType1 * Name: ReadBootSegNormal_DSType1
* *
* Description: DSカードType1のーマルモードのBoot Segment読み込み * Description: Type1のーマルモードのBoot Segment読み込み
* *
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType1(CardBootData *cbd) void ReadBootSegNormal_DSType1(CardBootData *cbd)
@ -56,7 +56,7 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ChangeModeNormal_DSType1 * Name: ChangeModeNormal_DSType1
* *
* Description: DSカードType1のーマルモードのモード変更 * Description: Type1のーマルモードのモード変更
* *
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/

View File

@ -28,24 +28,25 @@ static void SetMCSCR(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: ReadIDNormal_DSType2 Name: ReadIDNormal_DSType2
Description: DSカードType1ーマルモードのID読み込み Description: Type2ーマルモードのID読み込み
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
// 共通 // 共通
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadBootSegNormal_DSType2 * Name: ReadBootSegNormal_DSType2
* *
* Description: DSカードType2のーマルモードのBoot Segment読み込み * Description: Type2のーマルモードのBoot Segment読み込み
* *
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void ReadBootSegNormal_DSType2(CardBootData *cbd) void ReadBootSegNormal_DSType2(CardBootData *cbd)
{ {
u32 i = 0; u32 i = 0;
u32 loop = ONE_SEGMENT_PAGE_NUM;
u32 *dst = cbd->pBootSegBuf->word; u32 *dst = cbd->pBootSegBuf->word;
u64 page = 0; u64 page = 0;
GCDCmd64 cndLE, cndBE; GCDCmd64 cndLE, cndBE;
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){ for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
@ -76,7 +77,7 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
page++; page++;
} }
} }
@ -84,7 +85,7 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ChangeModeNormal_DSType2 * Name: ChangeModeNormal_DSType2
* *
* Description: DSカードType2のーマルモードのモード変更 * Description: Type2のーマルモードのモード変更
* *
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/

View File

@ -10,7 +10,6 @@
not be disclosed to third parties or copied or duplicated in any form, not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo. in whole or in part, without the prior written consent of Nintendo.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <twl.h> #include <twl.h>
#include <twl/os/common/format_rom.h> #include <twl/os/common/format_rom.h>
#include <nitro/card/types.h> #include <nitro/card/types.h>
@ -25,6 +24,9 @@
//#define HOTSW_FORCE_CARD_B //#define HOTSW_FORCE_CARD_B
// define ------------------------------------------------------------------- // define -------------------------------------------------------------------
#define CHATTERING_COUNTER 0x100
#define COUNTER_A 0x100
#define UNDEF_CODE 0xe7ffdeff // 未定義コード #define UNDEF_CODE 0xe7ffdeff // 未定義コード
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB #define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
@ -197,10 +199,10 @@ void HOTSW_Init(void)
#ifdef SDK_ARM7 #ifdef SDK_ARM7
// チャッタリングカウンタの値を設定 // チャッタリングカウンタの値を設定
reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) | reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) |
(0x100 << REG_MI_MC1_CC_SHIFT)); (CHATTERING_COUNTER << REG_MI_MC1_CC_SHIFT));
// Counter-Aの値を設定 // Counter-Aの値を設定
reg_MI_MC2 = 0x100; reg_MI_MC2 = COUNTER_A;
#else #else
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。 // PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
@ -320,7 +322,6 @@ BOOL HOTSW_LoadCardData(void)
// ---------------------- Normal Mode ---------------------- // ---------------------- Normal Mode ----------------------
// カードID読み込み // カードID読み込み
ReadIDNormal(); ReadIDNormal();
s_funcTable[0].ReadID_G(&s_cbData);
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
if(s_cbData.id_nml & 0x80000000){ if(s_cbData.id_nml & 0x80000000){
@ -960,121 +961,130 @@ static void SetMCSCR(void)
Name: McThread Name: McThread
Description: Description:
[TODO:]etcの確認()
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void McThread(void *arg) static void McThread(void *arg)
{ {
#pragma unused( arg ) #pragma unused( arg )
BOOL retval; u32 currentId_g = UNDEF_CODE;
HotSwMessage *msg; BOOL isPulledOut = TRUE;
BOOL retval;
HotSwMessage *msg;
while(1){ while(1){
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.common.isCardLoadCompleted = FALSE;
// カード挿し割り込みによるスレッド起動 while(1){
if(msg->type == HOTSW_INSERT){
OS_PutString("-> Insert\n");
// 活線挿抜抑制フラグが立っていたら処理しない // 活線挿抜抑制フラグが立っていたら処理しない
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) { if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
#endif #endif
continue; break;
} }
// カードが挿してある // カードが挿さってたら
if(IsCardExist()){ if(IsCardExist()){
// HotSwをbusy状態にする // 前の状態が挿し
if(!isPulledOut){
(void)s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
if(currentId_g == s_cbData.id_gam){
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus;
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0;
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0;
// HOTSW_Finalize();
}
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
// フラグケア
{
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isExistCard = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
}
// 新しいカードのIDを入れる
SYSMi_GetWork()->nCardID = s_cbData.id_gam;
// デバッガ情報
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
// カードデータロード完了フラグ
SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE;
break;
}
}
// HotSwをbusy状態にする
SetHotSwState(TRUE); SetHotSwState(TRUE);
// カード読み込み開始 // カード読み込み開始
retval = HOTSW_LoadCardData(); retval = HOTSW_LoadCardData();
// HotSwをfree状態にする // HotSwをfree状態にする
SetHotSwState(FALSE); SetHotSwState(FALSE);
// カード読み込みに失敗してた場合 or 挿抜回数不一致 or カード抜かれてた // GameモードでのIDを登録する
if(!retval || !CARDi_IsPulledOutEx(msg->hotswCount) || !IsCardExist()){ currentId_g = s_cbData.id_gam;
OS_TPrintf("Load Card Data Retval : %x HotSwCount : %d(msg : %d) IsCardExist : %d\n",
retval, CARDi_GetSlotResetCount(),msg->hotswCount,IsCardExist()); // 状態フラグを更新
isPulledOut = !retval;
// フラグ処理
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE;
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
// カード読み込み失敗してたら、後処理する
if(!retval){
// カードロックの開放 // カードロックの開放
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
UnlockExCard(s_cbData.lockID); UnlockExCard(s_cbData.lockID);
#else #else
OS_UnlockCard(s_cbData.lockID); OS_UnlockCard(s_cbData.lockID);
#endif #endif
// カードロックIDの開放 // カードロックIDの開放
OS_ReleaseLockID( s_cbData.lockID ); OS_ReleaseLockID( s_cbData.lockID );
OS_PutString("### Card Read Error\n");
}
// カード読み込み・状態に問題がない場合
else{
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
if( SYSMi_GetWork()->flags.arm9.reqChangeHotSW ) {
SYSMi_GetWork()->flags.common.isEnableHotSW = SYSMi_GetWork()->flags.arm9.nextHotSWStatus;
SYSMi_GetWork()->flags.arm9.reqChangeHotSW = 0;
SYSMi_GetWork()->flags.arm9.nextHotSWStatus = 0;
}
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
// 新しいカードのIDを入れる
SYSMi_GetWork()->nCardID = s_cbData.id_gam;
// デバッガ情報
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
SYSMi_GetWork()->flags.common.isOnDebugger = s_cbData.debuggerFlg;
// カードデータロード完了フラグ
SYSMi_GetWork()->flags.common.isCardLoadCompleted = TRUE;
} }
} // end [if(IsCardExist())] }
// カードが抜けてたら
else{
if(isPulledOut){
// フラグケア
{
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
}
// カードブート用構造体の初期化
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
break;
}
isPulledOut = TRUE;
}
}
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
#endif #endif
} }
// カード抜き割り込みによるスレッド起動
else if(msg->type == HOTSW_PULLEDOUT){
OS_PutString("-> Init\n\n");
// HOTSW抑制フラグが立ってたら、処理しない
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
continue;
}
// カードが抜かれている
if(!IsCardExist()){
// フラグケア
{
u16 id = (u16)OS_GetLockID();
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
(void)OS_UnlockByWord( id, &SYSMi_GetWork()->lockHotSW, NULL );
OS_ReleaseLockID( id );
}
// カードブート用構造体の初期化
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
}
}
} // while loop
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -1084,8 +1094,6 @@ static void McThread(void *arg)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCard(void) static void InterruptCallbackCard(void)
{ {
OS_TPrintf("*** Pulled Out Interrupt\n");
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount(); s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLEDOUT; s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLEDOUT;
@ -1096,7 +1104,7 @@ static void InterruptCallbackCard(void)
// メッセージインデックスをインクリメント // メッセージインデックスをインクリメント
s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
// OS_TPrintf(" - idx_pulledOut : %d\n", s_ctData.idx_pulledOut); OS_TPrintf(" - idx_pulledOut : %d\n", s_ctData.idx_pulledOut);
#ifdef USE_SLOT_A #ifdef USE_SLOT_A
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_IREQ); OS_SetIrqCheckFlagEx(OS_IE_CARD_A_IREQ);
@ -1112,8 +1120,6 @@ static void InterruptCallbackCard(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCardDet(void) static void InterruptCallbackCardDet(void)
{ {
OS_TPrintf("*** Insert Interrupt\n");
// SDKのカード状態をリセットする // SDKのカード状態をリセットする
CARDi_ResetSlotStatus(); CARDi_ResetSlotStatus();
@ -1127,7 +1133,7 @@ static void InterruptCallbackCardDet(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;
// OS_TPrintf(" - idx_insert : %d\n", s_ctData.idx_insert); OS_TPrintf(" - idx_insert : %d\n", s_ctData.idx_insert);
#ifdef USE_SLOT_A #ifdef USE_SLOT_A
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DET); OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DET);