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/branches/20080206_hotsw@603 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
841d90b1f8
commit
0fbdc86913
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user