(更新:Akabane Jumpei)

・スロットのカード挿抜状態とランチャーの挿抜状態がズレ場合にそれを修正するスレッドを追加(新17ピンスロット・DSテレビetc対策)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1106 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-04-11 02:06:00 +00:00
parent c74172d664
commit 8b7a32631c
2 changed files with 131 additions and 44 deletions

View File

@ -47,9 +47,6 @@ extern "C" {
#define SECURE_SEGMENT_START 0x4000 #define SECURE_SEGMENT_START 0x4000
#define SECURE_SEGMENT_SIZE 0x4000 #define SECURE_SEGMENT_SIZE 0x4000
#define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE) #define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE)
#define PNA_BASE_VALUE 0x60e8
#define PNB_L_VALUE 0x879b9b05
#define PNB_H_VALUE 0x5c
// --- TWL Card // --- TWL Card
#define TWLCARD_BORDER_OFFSET 0x80000 #define TWLCARD_BORDER_OFFSET 0x80000
@ -269,8 +266,6 @@ typedef union BootSegmentData
// カードブート時に必要な変数一式をまとめた構造体 // カードブート時に必要な変数一式をまとめた構造体
typedef struct CardBootData{ typedef struct CardBootData{
u16 lockID;
u32 vae; u32 vae;
u32 vbi; u32 vbi;
u32 vd; u32 vd;
@ -309,8 +304,10 @@ typedef struct CardBootData{
// スレッド・メッセージ関係をまとめた構造体 // スレッド・メッセージ関係をまとめた構造体
typedef struct CardThreadData{ typedef struct CardThreadData{
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; u64 hotswStack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
OSThread thread; u64 monitorStack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
OSThread hotswThread;
OSThread monitorThread;
u32 idx_insert; u32 idx_insert;
u32 idx_pulledOut; u32 idx_pulledOut;

View File

@ -32,6 +32,8 @@
#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) #define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us)
#define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us) #define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us)
#define CARD_EXIST_CHECK_INTERVAL 300
#define UNDEF_CODE 0xe7ffdeff // 未定義コード #define UNDEF_CODE 0xe7ffdeff // 未定義コード
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB #define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
@ -71,7 +73,9 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
static void LockHotSwRsc(OSLockWord* word); static void LockHotSwRsc(OSLockWord* word);
static void UnlockHotSwRsc(OSLockWord* word); static void UnlockHotSwRsc(OSLockWord* word);
static void McThread(void *arg); static void HotSwThread(void *arg);
static void MonitorThread(void *arg);
static void McPowerOn(void); static void McPowerOn(void);
static void McPowerOff(void); static void McPowerOff(void);
static void SetMCSCR(void); static void SetMCSCR(void);
@ -112,9 +116,9 @@ static u16 s_bondingOp;
static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize; static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize;
static BootSegmentData *s_pBootSegBuffer; // カード抜けてもバッファの場所覚えとく static BootSegmentData *s_pBootSegBuffer;
static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく static u32 *s_pSecureSegBuffer;
static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく static u32 *s_pSecure2SegBuffer;
static CardBootData s_cbData; static CardBootData s_cbData;
static SYSMRomEmuInfo s_romEmuInfo; static SYSMRomEmuInfo s_romEmuInfo;
@ -210,7 +214,7 @@ void HOTSW_Init(u32 threadPrio)
// Bonding Optionの取得 // Bonding Optionの取得
s_bondingOp = SCFG_REG_GetBondingOption(); s_bondingOp = SCFG_REG_GetBondingOption();
// カードブート用構造体の初期化 // 構造体の初期化
MI_CpuClear8(&s_cbData, sizeof(CardBootData)); MI_CpuClear8(&s_cbData, sizeof(CardBootData));
// カードスレッド用構造体の初期化 // カードスレッド用構造体の初期化
@ -232,15 +236,25 @@ void HOTSW_Init(u32 threadPrio)
s_CardLockID = (u16)tempLockID; s_CardLockID = (u16)tempLockID;
} }
// カードブート用スレッドの生成 // カードデータロード用スレッドの生成
OS_CreateThread(&HotSwThreadData.thread, OS_CreateThread(&HotSwThreadData.hotswThread,
McThread, HotSwThread,
NULL, NULL,
HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HotSwThreadData.hotswStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64),
HOTSW_THREAD_STACK_SIZE, HOTSW_THREAD_STACK_SIZE,
threadPrio threadPrio
); );
// カードの状態監視用スレッドの生成 ( DSテレビ対策 )
// [TODO] 優先度の設定
OS_CreateThread(&HotSwThreadData.monitorThread,
MonitorThread,
NULL,
HotSwThreadData.monitorStack + HOTSW_THREAD_STACK_SIZE / sizeof(u64),
HOTSW_THREAD_STACK_SIZE,
threadPrio
);
// メッセージキューの初期化 // メッセージキューの初期化
OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM );
@ -248,8 +262,9 @@ void HOTSW_Init(u32 threadPrio)
OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM );
// スレッド起動 // スレッド起動
OS_WakeupThreadDirect(&HotSwThreadData.thread); OS_WakeupThreadDirect(&HotSwThreadData.hotswThread);
OS_WakeupThreadDirect(&HotSwThreadData.monitorThread);
// Boot Segment バッファの設定 // Boot Segment バッファの設定
HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE );
@ -290,6 +305,8 @@ static HotSwState LoadCardData(void)
start = OS_GetTick(); start = OS_GetTick();
s_isHotSwBusy = TRUE;
// カードのロック // カードのロック
#ifndef DEBUG_USED_CARD_SLOT_B_ #ifndef DEBUG_USED_CARD_SLOT_B_
CARD_LockRom(s_CardLockID); CARD_LockRom(s_CardLockID);
@ -311,6 +328,8 @@ static HotSwState LoadCardData(void)
// ロード処理開始 // ロード処理開始
if(HOTSW_IsCardAccessible()){ if(HOTSW_IsCardAccessible()){
s_cbData.modeType = HOTSW_MODE1;
// カード側でKey Tableをロードする // カード側でKey Tableをロードする
state = LoadTable(); state = LoadTable();
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
@ -550,6 +569,8 @@ end:
UnlockExCard(s_CardLockID); UnlockExCard(s_CardLockID);
#endif #endif
s_isHotSwBusy = FALSE;
// OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); // OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
return retval; return retval;
@ -897,7 +918,7 @@ static HotSwState CheckCardAuthCode(void)
Description: Boot Segment Description: Boot Segment
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size) void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
{ {
@ -918,7 +939,7 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
Description: Secure Segment Description: Secure Segment
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size) void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size)
{ {
@ -1147,6 +1168,21 @@ static u32 GetMcSlotMask(void)
} }
/*---------------------------------------------------------------------------*
Name: GetMcSlotMode
Description:
*---------------------------------------------------------------------------*/
static u32 GetMcSlotMode(void)
{
#ifndef DEBUG_USED_CARD_SLOT_B_
return (reg_MI_MC1 & GetMcSlotMask()) >> GetMcSlotShift();
#else
return (reg_MI_MC1 & GetMcSlotMask()) << GetMcSlotShift();
#endif
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: SetMcSlotMode Name: SetMcSlotMode
@ -1182,21 +1218,6 @@ static BOOL CmpMcSlotMode(u32 mode)
} }
/*---------------------------------------------------------------------------*
Name: GetMcSlotMode
Description:
*---------------------------------------------------------------------------*/
static u32 GetMcSlotMode(void)
{
#ifndef DEBUG_USED_CARD_SLOT_B_
return (reg_MI_MC1 & GetMcSlotMask()) >> GetMcSlotShift();
#else
return (reg_MI_MC1 & GetMcSlotMask()) << GetMcSlotShift();
#endif
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: McPowerOn Name: McPowerOn
@ -1216,8 +1237,8 @@ static void McPowerOn(void)
// SCFG_MC1 の Slot Status の M1,M0 を 01 にする // SCFG_MC1 の Slot Status の M1,M0 を 01 にする
SetMcSlotMode(SLOT_STATUS_MODE_01); SetMcSlotMode(SLOT_STATUS_MODE_01);
// 3ms待ち // 10ms待ち
OS_Sleep(3); OS_Sleep(10);
// SCFG_MC1 の Slot Status の M1,M0 を 10 にする // SCFG_MC1 の Slot Status の M1,M0 を 10 にする
SetMcSlotMode(SLOT_STATUS_MODE_10); SetMcSlotMode(SLOT_STATUS_MODE_10);
@ -1340,17 +1361,17 @@ static void SetMCSCR(void)
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: McThread Name: HotSwThread
Description: Description:
[TODO:]etcの確認() [TODO:]etcの確認()
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void McThread(void *arg) static void HotSwThread(void *arg)
{ {
#pragma unused( arg ) #pragma unused( arg )
BOOL isPulledOut = TRUE; // BOOL isPulledOut = TRUE;
HotSwState retval; HotSwState retval;
HotSwMessage *msg; HotSwMessage *msg;
@ -1379,7 +1400,7 @@ static void McThread(void *arg)
// カードが挿さってたら // カードが挿さってたら
if(HOTSW_IsCardExist()){ if(HOTSW_IsCardExist()){
// 前の状態が挿し // 前の状態が挿し
if(!isPulledOut){ if(!s_IsPulledOut){
// 抜きがなかったか判定 // 抜きがなかったか判定
if(CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){ if(CmpMcSlotMode(SLOT_STATUS_MODE_10) == TRUE){
// フラグケア // フラグケア
@ -1430,11 +1451,12 @@ static void McThread(void *arg)
} }
// 状態フラグを更新 // 状態フラグを更新
isPulledOut = FALSE; s_IsPulledOut = FALSE;
} }
// カードが抜けてたら // カードが抜けてたら
else{ else{
// フラグ処理
LockHotSwRsc(&SYSMi_GetWork()->lockHotSW); LockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE; SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE;
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE; SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
@ -1450,8 +1472,8 @@ static void McThread(void *arg)
MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize);
MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile));
isPulledOut = TRUE; s_IsPulledOut = TRUE;
// ワンセグのスリープ時シャットダウン対策を戻す // ワンセグのスリープ時シャットダウン対策を戻す
MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE ); MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE );
@ -1463,6 +1485,69 @@ static void McThread(void *arg)
} }
/*---------------------------------------------------------------------------*
Name: MonitorThread
Description: HotSwThreadで状態を比べて
s_IsPulledOut : True -> HOTSW_IsCardExist : True ->
False -> False ->
*---------------------------------------------------------------------------*/
static void MonitorThread(void *arg)
{
#pragma unused( arg )
BOOL isPullOutNow;
while(1){
// カードデータロード中は待機
do{
OS_Sleep(CARD_EXIST_CHECK_INTERVAL);
}
while(s_isHotSwBusy);
// 現在カードが抜けているか
isPullOutNow = !HOTSW_IsCardExist();
// 状態の比較
if(s_IsPulledOut != isPullOutNow){
OSIntrMode enabled = OS_DisableInterrupts();
// 本当は抜けてた場合
if(isPullOutNow){
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE;
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0;
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT;
// メッセージをキューの先頭に入れる
OS_JamMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
}
// 本当は挿さっていた場合
else{
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;
}
(void)OS_RestoreInterrupts( enabled );
OS_PutString(">>> Card State Error\n");
}
}
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: InterruptCallbackCard Name: InterruptCallbackCard
@ -1480,6 +1565,11 @@ static void InterruptCallbackCard(void)
// メッセージインデックスをインクリメント // メッセージインデックスをインクリメント
HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
/* // スロットのモードを
if(GetMcSlotMode() == SLOT_STATUS_MODE_01 || GetMcSlotMode() == SLOT_STATUS_MODE_10){
SetMcSlotMode(SLOT_STATUS_MODE_11);
}*/
OS_PutString("\n"); OS_PutString("\n");
} }