(更新:Akabane Jumpei) 活線挿抜のメッセージ処理部分を修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080206_hotsw@603 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-02-06 10:11:05 +00:00
parent 841d90b1f8
commit 0fbdc86913

View File

@ -34,6 +34,8 @@
#define HOTSW_THREAD_STACK_SIZE 1024 // スタックサイズ #define HOTSW_THREAD_STACK_SIZE 1024 // スタックサイズ
#define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度 #define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
#define HOTSW_MSG_BUFFER_NUM 32 // 受信バッファの数 #define HOTSW_MSG_BUFFER_NUM 32 // 受信バッファの数
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
#define HOTSW_PULLED_MSG_NUM 16 // 抜け割り込み送信メッセージの数
#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF #define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF
@ -66,9 +68,11 @@ typedef struct CardThreadData{
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
OSThread thread; OSThread thread;
// [TODO:] 受信バッファ分のメッセージを用意する。u32 index_Insert, index_pulled とかも必要? u32 idx_insert;
HotSwMessage hotswInsertMsg; u32 idx_pulledOut;
HotSwMessage hotswPulledOutMsg;
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
OSMessageQueue hotswQueue; OSMessageQueue hotswQueue;
OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM];
} }
@ -227,12 +231,14 @@ void HOTSW_Init(void)
OS_PutString("Card Boot Start\n"); OS_PutString("Card Boot Start\n");
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
// [TODO:] メッセージを配列で用意する s_ctData.hotswInsertMsg[s_ctData.idx_insert].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswInsertMsg.hotswCount = CARDi_GetSlotResetCount(); s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT;
s_ctData.hotswInsertMsg.type = HOTSW_INSERT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg, OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
} }
else{ else{
OS_PutString("No Card...\n"); OS_PutString("No Card...\n");
@ -258,11 +264,6 @@ BOOL HOTSW_LoadCardData(void)
start = OS_GetTick(); start = OS_GetTick();
// スロットがスワップされてたら元に戻す。
if(reg_MI_MC1 & 0x8000){
reg_MI_MC1 = reg_MI_MC1 & 0xff;
}
OS_TPrintf("---------------- Card Boot Start ---------------\n"); OS_TPrintf("---------------- Card Boot Start ---------------\n");
#ifdef SDK_ARM7 #ifdef SDK_ARM7
// カード電源リセット // カード電源リセット
@ -294,7 +295,6 @@ BOOL HOTSW_LoadCardData(void)
#else #else
OS_LockCard(s_cbData.lockID); OS_LockCard(s_cbData.lockID);
#endif #endif
OS_PutString("!! Card Lock\n");
// カード側でKey Tableをロードする // カード側でKey Tableをロードする
LoadTable(); LoadTable();
@ -424,7 +424,6 @@ BOOL HOTSW_LoadCardData(void)
#else #else
OS_UnlockCard(s_cbData.lockID); OS_UnlockCard(s_cbData.lockID);
#endif #endif
OS_PutString("!! Card Unlock\n");
OS_TPrintf("-----------------------------------------------\n"); OS_TPrintf("-----------------------------------------------\n");
} }
else{ else{
@ -467,11 +466,15 @@ void HOTSW_LoadStaticModule(void)
s_cbData.pBootSegBuf->rh.s.banner_offset, s_cbData.pBootSegBuf->rh.s.banner_offset,
(u32 *)SYSM_CARD_BANNER_BUF, (u32 *)SYSM_CARD_BANNER_BUF,
sizeof(TWLBannerFile) ); sizeof(TWLBannerFile) );
}
if(IsCardExist())
{
SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE; SYSMi_GetWork()->flags.common.isValidCardBanner = TRUE;
SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.common.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.common.isExistCard = TRUE; SYSMi_GetWork()->flags.common.isExistCard = TRUE;
} }
#endif #endif
// OS_TPrintf(" - Arm9 Static Module Loading...\n"); // OS_TPrintf(" - Arm9 Static Module Loading...\n");
@ -864,32 +867,23 @@ static void SetMCSCR(void)
Name: McThread Name: McThread
Description: Description:
[TODO:]
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void McThread(void *arg) static void McThread(void *arg)
{ {
#pragma unused( arg ) #pragma unused( arg )
static BOOL insert = FALSE;
BOOL retval; BOOL retval;
HotSwMessage *msg; 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);
OS_TPrintf("Before proc is insert? --> %d\n", insert);
// 活線挿抜回数を比較 // 活線挿抜回数を比較
if(CARDi_IsPulledOutEx(msg->hotswCount)){ if(CARDi_IsPulledOutEx(msg->hotswCount)){
// カード挿し割り込みによるスレッド起動 かつ 前回のスレッド起動が抜け処理だった // カード挿し割り込みによるスレッド起動 かつ 前回のスレッド起動が抜け処理だった
if(msg->type == HOTSW_INSERT && !insert){ if(msg->type == HOTSW_INSERT){
OS_PutString("*** Insert\n"); OS_PutString("*** Insert\n");
// 挿し処理フラグを立てる
insert = TRUE;
// 活線挿抜抑制フラグが立っていたら処理しない // 活線挿抜抑制フラグが立っていたら処理しない
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) { if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
#ifdef DEBUG_USED_CARD_SLOT_B_ #ifdef DEBUG_USED_CARD_SLOT_B_
@ -923,7 +917,6 @@ static void McThread(void *arg)
#else #else
OS_UnlockCard(s_cbData.lockID); OS_UnlockCard(s_cbData.lockID);
#endif #endif
OS_PutString("!! Card Unlock\n");
// カードロックIDの開放 // カードロックIDの開放
OS_ReleaseLockID( s_cbData.lockID ); OS_ReleaseLockID( s_cbData.lockID );
@ -956,12 +949,9 @@ static void McThread(void *arg)
#endif #endif
} }
// カード抜き割り込みによるスレッド起動 かつ 前回のスレッド起動が挿し処理だった // カード抜き割り込みによるスレッド起動
else if(msg->type == HOTSW_PULLEDOUT && insert){ else if(msg->type == HOTSW_PULLEDOUT){
OS_PutString("*** Init\n"); OS_PutString("*** Init\n\n");
// 挿し処理フラグを下ろす。
insert = FALSE;
// HOTSW抑制フラグが立ってたら、処理しない // HOTSW抑制フラグが立ってたら、処理しない
if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) { if( !SYSMi_GetWork()->flags.common.isEnableHotSW ) {
@ -1000,15 +990,19 @@ static void McThread(void *arg)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCard(void) static void InterruptCallbackCard(void)
{ {
OS_TPrintf("★ Pulled Out Interrupt\n"); // OS_TPrintf("★ Pulled Out Interrupt");
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
// [TODO:] メッセージを配列で用意する s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswPulledOutMsg.hotswCount = CARDi_GetSlotResetCount(); s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLEDOUT;
s_ctData.hotswPulledOutMsg.type = HOTSW_PULLEDOUT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg, OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
// 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);
@ -1024,18 +1018,22 @@ static void InterruptCallbackCard(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCardDet(void) static void InterruptCallbackCardDet(void)
{ {
OS_TPrintf("★ Insert Interrupt\n"); // OS_TPrintf("★ Insert Interrupt");
// SDKのカード状態をリセットする // SDKのカード状態をリセットする
CARDi_ResetSlotStatus(); CARDi_ResetSlotStatus();
// 送信メッセージを作成 (活線挿抜回数を取得・カード挿し) // 送信メッセージを作成 (活線挿抜回数を取得・カード挿し)
// [TODO:] メッセージを配列で用意する s_ctData.hotswInsertMsg[s_ctData.idx_insert].hotswCount = CARDi_GetSlotResetCount();
s_ctData.hotswInsertMsg.hotswCount = CARDi_GetSlotResetCount(); s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT;
s_ctData.hotswInsertMsg.type = HOTSW_INSERT;
// メッセージ送信 // メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg, OS_MESSAGE_NOBLOCK); OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
// 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);