mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei) 挿抜処理を行うスレッド内の処理を変更。(検証途中)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@689 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
7850f38f51
commit
7cc412171e
@ -23,15 +23,15 @@ static void SetMCSCR(void);
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: ReadIDNormal_DSType1
|
||||
|
||||
Description: DSカードType1のノーマルモードのID読み込み
|
||||
Description: Type1のノーマルモードのID読み込み
|
||||
*---------------------------------------------------------------------------*/
|
||||
// ‹¤’Ê
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ReadBootSegNormal_DSType1
|
||||
*
|
||||
* Description: DSカードType1のノーマルモードのBoot Segment読み込み
|
||||
*
|
||||
* Description: Type1のノーマルモードのBoot Segment読み込み
|
||||
*
|
||||
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
||||
*---------------------------------------------------------------------------*/
|
||||
void ReadBootSegNormal_DSType1(CardBootData *cbd)
|
||||
@ -56,7 +56,7 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ChangeModeNormal_DSType1
|
||||
*
|
||||
* Description: DSカードType1のノーマルモードのモード変更
|
||||
* Description: Type1のノーマルモードのモード変更
|
||||
*
|
||||
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
@ -28,24 +28,25 @@ static void SetMCSCR(void);
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: ReadIDNormal_DSType2
|
||||
|
||||
Description: DSカードType1のノーマルモードのID読み込み
|
||||
Description: Type2のノーマルモードのID読み込み
|
||||
*---------------------------------------------------------------------------*/
|
||||
// 共通
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ReadBootSegNormal_DSType2
|
||||
*
|
||||
* Description: DSカードType2のノーマルモードのBoot Segment読み込み
|
||||
* Description: Type2のノーマルモードのBoot Segment読み込み
|
||||
*
|
||||
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
||||
*---------------------------------------------------------------------------*/
|
||||
void ReadBootSegNormal_DSType2(CardBootData *cbd)
|
||||
{
|
||||
u32 i = 0;
|
||||
u32 loop = ONE_SEGMENT_PAGE_NUM;
|
||||
u32 *dst = cbd->pBootSegBuf->word;
|
||||
u64 page = 0;
|
||||
GCDCmd64 cndLE, cndBE;
|
||||
|
||||
|
||||
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
|
||||
// NewDMA転送の準備
|
||||
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);
|
||||
|
||||
|
||||
page++;
|
||||
}
|
||||
}
|
||||
@ -84,7 +85,7 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ChangeModeNormal_DSType2
|
||||
*
|
||||
* Description: DSカードType2のノーマルモードのモード変更
|
||||
* Description: Type2のノーマルモードのモード変更
|
||||
*
|
||||
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
@ -10,7 +10,6 @@
|
||||
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.
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <twl.h>
|
||||
#include <twl/os/common/format_rom.h>
|
||||
#include <nitro/card/types.h>
|
||||
@ -25,6 +24,9 @@
|
||||
//#define HOTSW_FORCE_CARD_B
|
||||
|
||||
// define -------------------------------------------------------------------
|
||||
#define CHATTERING_COUNTER 0x100
|
||||
#define COUNTER_A 0x100
|
||||
|
||||
#define UNDEF_CODE 0xe7ffdeff // 未定義コード
|
||||
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
|
||||
|
||||
@ -197,10 +199,10 @@ void HOTSW_Init(void)
|
||||
#ifdef SDK_ARM7
|
||||
// チャッタリングカウンタの値を設定
|
||||
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の値を設定
|
||||
reg_MI_MC2 = 0x100;
|
||||
reg_MI_MC2 = COUNTER_A;
|
||||
#else
|
||||
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
|
||||
|
||||
@ -320,7 +322,6 @@ BOOL HOTSW_LoadCardData(void)
|
||||
// ---------------------- Normal Mode ----------------------
|
||||
// カードID読み込み
|
||||
ReadIDNormal();
|
||||
s_funcTable[0].ReadID_G(&s_cbData);
|
||||
|
||||
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
||||
if(s_cbData.id_nml & 0x80000000){
|
||||
@ -960,121 +961,130 @@ static void SetMCSCR(void)
|
||||
Name: McThread
|
||||
|
||||
Description: カード抜け・挿し処理スレッド
|
||||
|
||||
[TODO:]挿抜のフロー・フラグケアetcの確認(今の所、抜き挿ししてもタイトルが更新されない)
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void McThread(void *arg)
|
||||
{
|
||||
#pragma unused( arg )
|
||||
|
||||
BOOL retval;
|
||||
HotSwMessage *msg;
|
||||
u32 currentId_g = UNDEF_CODE;
|
||||
BOOL isPulledOut = TRUE;
|
||||
BOOL retval;
|
||||
HotSwMessage *msg;
|
||||
|
||||
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;
|
||||
|
||||
// カード挿し割り込みによるスレッド起動
|
||||
if(msg->type == HOTSW_INSERT){
|
||||
OS_PutString("-> Insert\n");
|
||||
|
||||
while(1){
|
||||
// 活線挿抜抑制フラグが立っていたら処理しない
|
||||
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
|
||||
#endif
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
// カードが挿してある
|
||||
|
||||
// カードが挿さってたら
|
||||
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);
|
||||
|
||||
// カード読み込み開始
|
||||
|
||||
// カード読み込み開始
|
||||
retval = HOTSW_LoadCardData();
|
||||
|
||||
// HotSwをfree状態にする
|
||||
SetHotSwState(FALSE);
|
||||
|
||||
// カード読み込みに失敗してた場合 or 挿抜回数不一致 or カード抜かれてた
|
||||
if(!retval || !CARDi_IsPulledOutEx(msg->hotswCount) || !IsCardExist()){
|
||||
OS_TPrintf("Load Card Data Retval : %x HotSwCount : %d(msg : %d) IsCardExist : %d\n",
|
||||
retval, CARDi_GetSlotResetCount(),msg->hotswCount,IsCardExist());
|
||||
|
||||
// フラグ処理
|
||||
SYSMi_GetWork()->flags.common.isValidCardBanner = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isCardStateChanged = FALSE;
|
||||
SYSMi_GetWork()->flags.common.isExistCard = FALSE;
|
||||
// HotSwをfree状態にする
|
||||
SetHotSwState(FALSE);
|
||||
|
||||
// GameモードでのIDを登録する
|
||||
currentId_g = s_cbData.id_gam;
|
||||
|
||||
// 状態フラグを更新
|
||||
isPulledOut = !retval;
|
||||
|
||||
// カード読み込み失敗してたら、後処理する
|
||||
if(!retval){
|
||||
// カードロックの開放
|
||||
#ifdef DEBUG_USED_CARD_SLOT_B_
|
||||
UnlockExCard(s_cbData.lockID);
|
||||
#else
|
||||
OS_UnlockCard(s_cbData.lockID);
|
||||
#endif
|
||||
|
||||
// カードロックIDの開放
|
||||
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_
|
||||
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
|
||||
SYSMi_GetWork()->flags.common.is1stCardChecked = TRUE;
|
||||
#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)
|
||||
{
|
||||
OS_TPrintf("*** Pulled Out Interrupt\n");
|
||||
|
||||
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
|
||||
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount();
|
||||
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;
|
||||
|
||||
// OS_TPrintf(" - idx_pulledOut : %d\n", s_ctData.idx_pulledOut);
|
||||
OS_TPrintf("○ - idx_pulledOut : %d\n", s_ctData.idx_pulledOut);
|
||||
|
||||
#ifdef USE_SLOT_A
|
||||
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_IREQ);
|
||||
@ -1112,8 +1120,6 @@ static void InterruptCallbackCard(void)
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void InterruptCallbackCardDet(void)
|
||||
{
|
||||
OS_TPrintf("*** Insert Interrupt\n");
|
||||
|
||||
// SDKのカード状態をリセットする
|
||||
CARDi_ResetSlotStatus();
|
||||
|
||||
@ -1127,7 +1133,7 @@ static void InterruptCallbackCardDet(void)
|
||||
// メッセージインデックスをインクリメント
|
||||
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
|
||||
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DET);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user