mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
debug_dht_phase1ブランチ rev.2473-2490の活線挿抜のポーリングスレッドでのカードIDチェック処理をマージ。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2496 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
77c23cbcc4
commit
6dd09f123b
@ -237,6 +237,8 @@ typedef enum HotSwState{
|
|||||||
HOTSW_BUFFER_OVERRUN_ERROR,
|
HOTSW_BUFFER_OVERRUN_ERROR,
|
||||||
HOTSW_MODE_ERROR,
|
HOTSW_MODE_ERROR,
|
||||||
HOTSW_ILLEGAL_CARD_ERROR,
|
HOTSW_ILLEGAL_CARD_ERROR,
|
||||||
|
HOTSW_GAMEMODE_ID_CHECK_ERROR,
|
||||||
|
HOTSW_BUS_LOCK_ERROR,
|
||||||
HOTSW_UNEXPECTED_ERROR
|
HOTSW_UNEXPECTED_ERROR
|
||||||
} HotSwState;
|
} HotSwState;
|
||||||
|
|
||||||
|
|||||||
@ -130,6 +130,7 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
|
|||||||
|
|
||||||
static void CheckCardInsert(BOOL cardExist);
|
static void CheckCardInsert(BOOL cardExist);
|
||||||
static void CheckCardPullOut(BOOL cardExist);
|
static void CheckCardPullOut(BOOL cardExist);
|
||||||
|
static void SendInsertMessage(void);
|
||||||
|
|
||||||
static void PulledOutSequence(void);
|
static void PulledOutSequence(void);
|
||||||
|
|
||||||
@ -140,10 +141,13 @@ static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj"
|
|||||||
|
|
||||||
static u16 s_RscLockID;
|
static u16 s_RscLockID;
|
||||||
static u16 s_CardLockID;
|
static u16 s_CardLockID;
|
||||||
|
static u16 s_PollingLockID;
|
||||||
static u16 s_bondingOp;
|
static u16 s_bondingOp;
|
||||||
|
|
||||||
static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize;
|
static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize;
|
||||||
|
|
||||||
|
static u32 s_gameID;
|
||||||
|
|
||||||
static BootSegmentData *s_pBootSegBuffer;
|
static BootSegmentData *s_pBootSegBuffer;
|
||||||
static u32 *s_pSecureSegBuffer;
|
static u32 *s_pSecureSegBuffer;
|
||||||
static u32 *s_pSecure2SegBuffer;
|
static u32 *s_pSecure2SegBuffer;
|
||||||
@ -156,6 +160,8 @@ static BOOL s_debuggerFlg;
|
|||||||
static BOOL s_isPulledOut = TRUE;
|
static BOOL s_isPulledOut = TRUE;
|
||||||
static BOOL s_pollingThreadSleepFlg = FALSE;
|
static BOOL s_pollingThreadSleepFlg = FALSE;
|
||||||
|
|
||||||
|
static volatile BOOL s_isBusyMonitorThread;
|
||||||
|
|
||||||
// HMACSHA1の鍵
|
// HMACSHA1の鍵
|
||||||
static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
||||||
0x21, 0x06, 0xc0, 0xde,
|
0x21, 0x06, 0xc0, 0xde,
|
||||||
@ -261,6 +267,12 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
s_CardLockID = (u16)tempLockID;
|
s_CardLockID = (u16)tempLockID;
|
||||||
|
|
||||||
|
// ポーリングスレッド用のロックIDの取得
|
||||||
|
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
s_PollingLockID = (u16)tempLockID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// カードの状態監視用スレッドの生成 ( DSテレビ対策 )
|
// カードの状態監視用スレッドの生成 ( DSテレビ対策 )
|
||||||
@ -343,7 +355,7 @@ static HotSwState LoadCardData(void)
|
|||||||
HotSwState retval = HOTSW_SUCCESS;
|
HotSwState retval = HOTSW_SUCCESS;
|
||||||
HotSwState state = HOTSW_SUCCESS;
|
HotSwState state = HOTSW_SUCCESS;
|
||||||
u32 romMode = HOTSW_ROM_MODE_NULL;
|
u32 romMode = HOTSW_ROM_MODE_NULL;
|
||||||
|
|
||||||
// カードのロック
|
// カードのロック
|
||||||
CARD_LockRom(s_CardLockID);
|
CARD_LockRom(s_CardLockID);
|
||||||
|
|
||||||
@ -592,7 +604,7 @@ end:
|
|||||||
|
|
||||||
// カードのロック開放(※ロックIDは開放せずに持ち続ける)
|
// カードのロック開放(※ロックIDは開放せずに持ち続ける)
|
||||||
CARD_UnlockRom(s_CardLockID);
|
CARD_UnlockRom(s_CardLockID);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -916,6 +928,15 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
// カードのロック
|
// カードのロック
|
||||||
CARD_LockRom(s_CardLockID);
|
CARD_LockRom(s_CardLockID);
|
||||||
|
|
||||||
|
ReadIDGame(&s_cbData);
|
||||||
|
if(s_cbData.id_gam != s_gameID){
|
||||||
|
state = HOTSW_GAMEMODE_ID_CHECK_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!(reg_MI_EXMEMCNT_L & REG_MI_EXMEMCNT_L_MP_MASK)){
|
||||||
|
state = HOTSW_BUS_LOCK_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
while(size > 0 && state == HOTSW_SUCCESS){
|
while(size > 0 && state == HOTSW_SUCCESS){
|
||||||
// --- Boot Segment
|
// --- Boot Segment
|
||||||
if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
|
if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
|
||||||
@ -974,9 +995,16 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
dest += sendSize;
|
dest += sendSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReadIDGame(&s_cbData);
|
||||||
|
if(s_cbData.id_gam != s_gameID){
|
||||||
|
if(state == HOTSW_SUCCESS){
|
||||||
|
state = HOTSW_GAMEMODE_ID_CHECK_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// カードのアンロック
|
// カードのアンロック
|
||||||
CARD_UnlockRom(s_CardLockID);
|
CARD_UnlockRom(s_CardLockID);
|
||||||
|
|
||||||
{
|
{
|
||||||
HotSwPxiMessageForArm9 msg;
|
HotSwPxiMessageForArm9 msg;
|
||||||
CardDataReadState retval;
|
CardDataReadState retval;
|
||||||
@ -1002,6 +1030,14 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
retval = CARD_READ_MODE_ERROR;
|
retval = CARD_READ_MODE_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HOTSW_GAMEMODE_ID_CHECK_ERROR:
|
||||||
|
retval = CARD_READ_ID_CHECK_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_BUS_LOCK_ERROR:
|
||||||
|
retval = CARD_READ_BUS_LOCK_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
retval = CARD_READ_UNEXPECTED_ERROR;
|
retval = CARD_READ_UNEXPECTED_ERROR;
|
||||||
break;
|
break;
|
||||||
@ -1632,6 +1668,8 @@ static void HotSwThread(void *arg)
|
|||||||
if(HOTSW_IsCardExist()){
|
if(HOTSW_IsCardExist()){
|
||||||
if(!s_isPulledOut){
|
if(!s_isPulledOut){
|
||||||
if(GetMcSlotMode() == SLOT_STATUS_MODE_10){
|
if(GetMcSlotMode() == SLOT_STATUS_MODE_10){
|
||||||
|
s_gameID = s_cbData.id_gam;
|
||||||
|
|
||||||
LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
||||||
|
|
||||||
if( msg->ctrl && msg->value ){
|
if( msg->ctrl && msg->value ){
|
||||||
@ -1709,6 +1747,8 @@ static void PulledOutSequence(void)
|
|||||||
|
|
||||||
s_isPulledOut = TRUE;
|
s_isPulledOut = TRUE;
|
||||||
|
|
||||||
|
s_gameID = 0;
|
||||||
|
|
||||||
// ワンセグのスリープ時シャットダウン対策を戻す
|
// ワンセグのスリープ時シャットダウン対策を戻す
|
||||||
MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE );
|
MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE );
|
||||||
}
|
}
|
||||||
@ -1752,6 +1792,11 @@ static void FinalizeHotSw(HotSwCardState state)
|
|||||||
// カード挿入検出停止
|
// カード挿入検出停止
|
||||||
(void)OS_DisableIrqMask( HOTSW_IF_CARD_DET );
|
(void)OS_DisableIrqMask( HOTSW_IF_CARD_DET );
|
||||||
|
|
||||||
|
// ポーリングスレッドが動作中は待つ
|
||||||
|
while(s_isBusyMonitorThread){
|
||||||
|
OS_Sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
// ポーリングスレッドを消去
|
// ポーリングスレッドを消去
|
||||||
OS_KillThread( &HotSwThreadData.monitorThread, NULL );
|
OS_KillThread( &HotSwThreadData.monitorThread, NULL );
|
||||||
|
|
||||||
@ -2046,6 +2091,8 @@ static void MonitorThread(void *arg)
|
|||||||
OS_ReceiveMessage(&HotSwThreadData.hotswPollingCtrlQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
|
OS_ReceiveMessage(&HotSwThreadData.hotswPollingCtrlQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s_isBusyMonitorThread = TRUE;
|
||||||
|
|
||||||
isCardExist = HOTSW_IsCardExist();
|
isCardExist = HOTSW_IsCardExist();
|
||||||
|
|
||||||
CheckCardPullOut(isCardExist);
|
CheckCardPullOut(isCardExist);
|
||||||
@ -2054,6 +2101,8 @@ static void MonitorThread(void *arg)
|
|||||||
CheckCardInsert(isCardExist);
|
CheckCardInsert(isCardExist);
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s_isBusyMonitorThread = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2065,21 +2114,53 @@ static void MonitorThread(void *arg)
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static void CheckCardInsert(BOOL cardExist)
|
static void CheckCardInsert(BOOL cardExist)
|
||||||
{
|
{
|
||||||
|
// カードは挿さっているのに、ランチャーが認識してなかったらメッセージを送る
|
||||||
if(cardExist && s_isPulledOut){
|
if(cardExist && s_isPulledOut){
|
||||||
OSIntrMode enabled = OS_DisableInterrupts();
|
OSIntrMode enabled = OS_DisableInterrupts();
|
||||||
|
|
||||||
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE;
|
SendInsertMessage();
|
||||||
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0;
|
|
||||||
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT;
|
|
||||||
|
|
||||||
// メッセージをキューの先頭に入れる
|
|
||||||
OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK);
|
|
||||||
|
|
||||||
// メッセージインデックスをインクリメント
|
|
||||||
HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
|
|
||||||
|
|
||||||
(void)OS_RestoreInterrupts( enabled );
|
(void)OS_RestoreInterrupts( enabled );
|
||||||
}
|
}
|
||||||
|
// カードは挿さっていて、ランチャーが認識していたらGameモードのID読みをして、抜けてないか調べる
|
||||||
|
else if(cardExist && !s_isPulledOut && !SYSMi_GetWork()->flags.hotsw.isBusyHotSW){
|
||||||
|
OS_PutString("GameMode ID Check...\n");
|
||||||
|
|
||||||
|
// カードのロック
|
||||||
|
CARD_LockRom(s_PollingLockID);
|
||||||
|
|
||||||
|
ReadIDGame(&s_cbData);
|
||||||
|
|
||||||
|
if(s_cbData.id_gam != s_gameID){
|
||||||
|
OSIntrMode enabled;
|
||||||
|
|
||||||
|
McPowerOff();
|
||||||
|
|
||||||
|
enabled = OS_DisableInterrupts();
|
||||||
|
|
||||||
|
PulledOutSequence();
|
||||||
|
SendInsertMessage();
|
||||||
|
|
||||||
|
(void)OS_RestoreInterrupts( enabled );
|
||||||
|
}
|
||||||
|
|
||||||
|
// カードのロック開放(※ロックIDは開放せずに持ち続ける)
|
||||||
|
CARD_UnlockRom(s_PollingLockID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void SendInsertMessage(void)
|
||||||
|
{
|
||||||
|
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE;
|
||||||
|
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0;
|
||||||
|
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT;
|
||||||
|
|
||||||
|
// メッセージをキューの先頭に入れる
|
||||||
|
OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK);
|
||||||
|
|
||||||
|
// メッセージインデックスをインクリメント
|
||||||
|
HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,8 @@ typedef enum CardDataReadState {
|
|||||||
CARD_READ_BUFFER_OVERRUN_ERROR,
|
CARD_READ_BUFFER_OVERRUN_ERROR,
|
||||||
CARD_READ_MODE_ERROR,
|
CARD_READ_MODE_ERROR,
|
||||||
CARD_READ_BUSY,
|
CARD_READ_BUSY,
|
||||||
|
CARD_READ_ID_CHECK_ERROR,
|
||||||
|
CARD_READ_BUS_LOCK_ERROR,
|
||||||
CARD_READ_UNEXPECTED_ERROR
|
CARD_READ_UNEXPECTED_ERROR
|
||||||
}
|
}
|
||||||
CardDataReadState;
|
CardDataReadState;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user