From 94136bae523ada0bdae09087788ce6fc459e1749 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 26 Mar 2008 09:36:28 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E3=83=81=E3=83=A3=E3=83=83=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=AB=E3=82=A6=E3=83=B3=E3=82=BF/=E3=82=AB?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=82=BF=E3=83=BCA=E3=81=AE=E5=80=A4?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4=20=E3=83=BB=E3=83=9B=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=B9=E3=83=AF=E3=83=83=E3=83=97=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=AA=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=8A=E3=83=A9=E3=82=A4=E3=82=BA=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E4=B8=AD=20=E3=83=BB=E3=82=B9=E3=83=AD?= =?UTF-8?q?=E3=83=83=E3=83=88=E9=9B=BB=E6=BA=90ON=E6=99=82=E3=81=AE?= =?UTF-8?q?=E3=82=BD=E3=83=95=E3=83=88=E3=82=A6=E3=82=A7=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=82=A7=E3=82=A4=E3=83=88=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080312_hotsw@964 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 96 +++++++++++++++---- 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index a86c0426..1e8454bd 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -24,8 +24,8 @@ #define DEBUG_MODE // define ------------------------------------------------------------------- -#define CHATTERING_COUNTER 0x600 -#define COUNTER_A 0x100 +#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) +#define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us) #define CARD_EXIST_CHECK_INTERVAL 300 @@ -89,6 +89,8 @@ static HotSwState CheckRomHeaderAndLogoHash(void); static HotSwState CheckStaticModuleHash(void); static HotSwState SelectErrorState(HotSwState nowState, HotSwState beforeState); +static void FinalizeHotSw(u32 ctrl); + static s32 LockExCard(u16 lockID); static s32 UnlockExCard(u16 lockID); @@ -122,6 +124,7 @@ static u32 *s_pSecure2SegBuffer; static CardBootData s_cbData; static BOOL s_IsPulledOut = TRUE; +static BOOL s_isHotSwBusy = FALSE; // HMACSHA1の鍵 static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { @@ -246,7 +249,7 @@ void HOTSW_Init(u32 threadPrio) // スレッド起動 OS_WakeupThreadDirect(&HotSwThreadData.hotswThread); -// OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); + OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); // Boot Segment バッファの設定 SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); @@ -285,6 +288,8 @@ static HotSwState LoadCardData(void) start = OS_GetTick(); + s_isHotSwBusy = TRUE; + // カードのロック #ifndef DEBUG_USED_CARD_SLOT_B_ CARD_LockRom(s_CardLockID); @@ -480,6 +485,8 @@ end: UnlockExCard(s_CardLockID); #endif + s_isHotSwBusy = FALSE; + // OS_TPrintf( "Load Card Time : %dms\n\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); return retval; @@ -1224,12 +1231,12 @@ static void McPowerOn(void) if(CmpMcSlotMode(SLOT_STATUS_MODE_00) == TRUE){ // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // VDDの安定期間待ち - OS_Sleep(100); +// OS_Sleep(100); // SCFG_MC1 の Slot Status の M1,M0 を 01 にする SetMcSlotMode(SLOT_STATUS_MODE_01); - // 1ms待ち - OS_Sleep(1); + // 3ms待ち + OS_Sleep(3); // SCFG_MC1 の Slot Status の M1,M0 を 10 にする SetMcSlotMode(SLOT_STATUS_MODE_10); @@ -1243,7 +1250,7 @@ static void McPowerOn(void) // [TODO:]待ち時間は暫定値。金子さんに数値を測定してもらう。 // カードへ最初のコマンドを送るまでの待ち時間 - OS_Sleep(100); + OS_Sleep(120); } } @@ -1325,12 +1332,7 @@ static void HotSwThread(void *arg) if( msg->ctrl == TRUE ) { // [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。 SYSMi_GetWork()->flags.hotsw.isEnableHotSW = msg->value; - // [TODO]カードがあるときとないときで場合分けしてFinalize処理を実装 - // PXIメッセージを「抑制」と「Finalize」で分けて処理 - // → 1.全てのレジスタをクリアする (カードがささっていない時) - // 2.一度電源を落としてNomalモードにする (NANDアプリ等を起動する場合) - // 3.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) -// HOTSW_Finalize(); +// FinalizeHotSw( (u32)msg->value ); } while(1){ @@ -1425,6 +1427,65 @@ static void HotSwThread(void *arg) } +/*---------------------------------------------------------------------------* + Name: HotSwThread + + Description: 活線挿抜が抑制された時の後処理 + + [TODO]カードがあるときとないときで場合分けしてFinalize処理を実装 + PXIメッセージを「抑制」と「Finalize」で分けて処理 + → 1.全てのレジスタをクリアする (カードがささっていない時) + 2.一度電源を落としてNomalモードにする (NANDアプリ等を起動する場合) + 3.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) + *---------------------------------------------------------------------------*/ +#define HOTSW_RESET_REG_16 0x0000 +#define HOTSW_RESET_REG_32 0x00000000UL + +static void FinalizeHotSw(u32 ctrl) +{ + #pragma unused( ctrl ) + + if(!HOTSW_IsCardExist()){ + // コマンド設定レジスタ + reg_HOTSW_MCCMD0 = HOTSW_RESET_REG_32; + reg_HOTSW_MCCMD1 = HOTSW_RESET_REG_32; + + // コントロールレジスタ + reg_HOTSW_MCCNT0 = HOTSW_RESET_REG_16; + reg_HOTSW_MCCNT1 = HOTSW_RESET_REG_32; + + // データレジスタ + reg_HOTSW_MCD1 = HOTSW_RESET_REG_32; + + // 符号生成回路レジスタ + reg_HOTSW_MCSCR0 = HOTSW_RESET_REG_32; + reg_HOTSW_MCSCR1 = HOTSW_RESET_REG_32; + reg_HOTSW_MCSCR2 = HOTSW_RESET_REG_32; + + // Chattring Counter + reg_MI_MC1 = HOTSW_RESET_REG_32; + + // Counter-A + reg_MI_MC2 = HOTSW_RESET_REG_16; + } +// else if(Nandアプリ等を起動) + { + // 一度電源を落としてNomalモードにする + McPowerOff(); + McPowerOn(); + } +// else // 挿さっているカードを起動する場合 + { + // Chattring Counter + reg_MI_MC1 = HOTSW_RESET_REG_32; + + // Counter-A + reg_MI_MC2 = HOTSW_RESET_REG_16; + } +} + + + /*---------------------------------------------------------------------------* Name: MonitorThread @@ -1441,9 +1502,12 @@ static void MonitorThread(void *arg) BOOL isPullOutNow; while(1){ - // [TODO] カードデータロード中は待機するようにする - OS_Sleep(CARD_EXIST_CHECK_INTERVAL); - + // カードデータロード中は待機 + do{ + OS_Sleep(CARD_EXIST_CHECK_INTERVAL); + } + while(s_isHotSwBusy); + // 現在カードが抜けているか isPullOutNow = !HOTSW_IsCardExist();