diff --git a/build/buildtools/commondefs.sysmenu b/build/buildtools/commondefs.sysmenu index 87642d62..936a5c18 100644 --- a/build/buildtools/commondefs.sysmenu +++ b/build/buildtools/commondefs.sysmenu @@ -77,6 +77,7 @@ SYSMENU_LIBS ?= \ libmbloader$(TWL_LIBSUFFIX).a \ libboot$(TWL_LIBSUFFIX).a \ libds$(TWL_LIBSUFFIX).a \ + libhotsw$(TWL_LIBSUFFIX).a \ libdht$(TWL_LIBSUFFIX).a \ else # ($(CODEGEN_PROC),ARM7) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 22d2be43..5506183c 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -69,6 +69,7 @@ extern "C" { #define HOTSW_PULLED_MSG_NUM 16 #define HOTSW_CTRL_MSG_NUM 8 #define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM) +#define HOTSW_POLLING_CTRL_BUFFER_NUM 4 // --- Card Control Reg 0 #define HOTSW_E2PROM_CTRL_MASK 0x00ff @@ -314,17 +315,21 @@ typedef struct CardThreadData{ u32 idx_pulledOut; u32 idx_ctrl; u32 idx_dma; + u32 idx_polling; OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM]; + OSMessage hotswPollingCtrlMsg[HOTSW_POLLING_CTRL_BUFFER_NUM]; HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; OSMessageQueue hotswQueue; OSMessageQueue hotswDmaQueue; + OSMessageQueue hotswPollingCtrlQueue; OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; OSMessage hotswDmaMsgBuffer[HOTSW_DMA_MSG_NUM]; + OSMessage hotswPollingCtrlBuffer[HOTSW_POLLING_CTRL_BUFFER_NUM]; } CardThreadData; // カード起動用関数 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c index 134e1e98..7c1bd236 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c @@ -44,10 +44,13 @@ void MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) else{ keyBuf = cbd->keyBuf2; +#define USE_LOCAL_KEYTABLE +#ifdef USE_LOCAL_KEYTABLE MI_CpuCopyFast(&HotSwBlowfishInitTableTWL, (void *)ctx, sizeof(BLOWFISH_CTX)); -// MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); - - return; + return; +#else + MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); +#endif } keyBuf[0] = *RomHeaderGameCode; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index fa78d289..9426f5ca 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -85,6 +85,11 @@ static BOOL isTwlModeLoad(void); static HotSwState ReadSecureModeCardData(void); static void ClearCaradFlgs(void); +static void FinalizeHotSw(HotSwApliType type); +static BOOL ShiftGameMode(void); +static void ClearUnnecessaryCardRegister(void); +static void ClearAllCardRegister(void); + static void RegisterRomEmuInfo(void); static void GenVA_VB_VD(void); static HotSwState DecryptObjectFile(void); @@ -126,10 +131,11 @@ static u32 *s_pSecure2SegBuffer; static CardBootData s_cbData; static SYSMRomEmuInfo s_romEmuInfo; -static BOOL debuggerFlg; +static BOOL s_debuggerFlg; -static BOOL s_IsPulledOut = TRUE; +static BOOL s_isPulledOut = TRUE; static BOOL s_isHotSwBusy = FALSE; +static BOOL s_pollingThreadSleepFlg = FALSE; // HMACSHA1の鍵 static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { @@ -287,22 +293,17 @@ void HOTSW_Init(u32 threadPrio) ); // メッセージキューの初期化 - OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); - - // メッセージキューの初期化 - OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); - + OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswPollingCtrlQueue, &HotSwThreadData.hotswPollingCtrlBuffer[0], HOTSW_POLLING_CTRL_BUFFER_NUM ); + // スレッド起動 OS_WakeupThreadDirect(&HotSwThreadData.hotswThread); OS_WakeupThreadDirect(&HotSwThreadData.monitorThread); - // Boot Segment バッファの設定 + // バッファの設定 HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); - - // Secure1 Segment バッファの設定 HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE ); - - // Secure2 Segment バッファの設定 HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // カードが挿さってあったらスレッドを起動する @@ -402,9 +403,9 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // 取得したRomエミュレーション情報を比較 - debuggerFlg = TRUE; + s_debuggerFlg = TRUE; if ( romEmuInfo->magic_code != SYSM_ROMEMU_INFO_MAGIC_CODE ){ - debuggerFlg = FALSE; + s_debuggerFlg = FALSE; } } @@ -621,12 +622,12 @@ static BOOL isTwlModeLoad(void) if(s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK){ // PlatformCodeがTwl or Hybridの場合 if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ - OS_PutString("TWL Card : TWL Application : Read Sequence -> TWL\n"); + OS_PutString("TWL Card : TWL Application Read Sequence -> TWL\n"); return TRUE; } else{ // [TODO] 仕様確認 - OS_PutString("TWL Card : NTR Application : Read Sequence -> NTR\n"); + OS_PutString("TWL Card : NTR Application Read Sequence -> NTR\n"); return FALSE; } } @@ -636,18 +637,18 @@ static BOOL isTwlModeLoad(void) if(s_bondingOp == SCFG_OP_PRODUCT){ // PlatformCodeがTwl or Hybridの場合 if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ - OS_PutString("NTR Card : TWL Application : Illegal Card\n"); + OS_PutString("NTR Card : TWL Application Error Illegal Card\n"); s_cbData.illegalCardFlg = TRUE; return FALSE; } else{ - OS_PutString("NTR Card : NTR Application : Read Sequence -> NTR\n"); + OS_PutString("NTR Card : NTR Application Read Sequence -> NTR\n"); return FALSE; } } // 開発用の場合 else{ - OS_PutString("Bonding Option Development : NTR Card : Read Sequence -> NTR\n"); + OS_PutString("Bonding Option Development : NTR Card Read Sequence -> NTR\n"); return FALSE; } } @@ -746,7 +747,7 @@ HotSwState HOTSWi_RefreshBadBlock(u32 romMode) *---------------------------------------------------------------------------*/ BOOL HOTSWi_IsRunOnDebugger(void) { - return debuggerFlg; + return s_debuggerFlg; } @@ -757,7 +758,7 @@ BOOL HOTSWi_IsRunOnDebugger(void) *---------------------------------------------------------------------------*/ BOOL HOTSWi_IsRomEmulation(void) { - return debuggerFlg && + return s_debuggerFlg && #ifndef DEBUG_USED_CARD_SLOT_B_ s_romEmuInfo.isEnableSlot1; #else @@ -775,10 +776,10 @@ static void RegisterRomEmuInfo(void) SYSM_work* sw = SYSMi_GetWork(); // デバッガ情報 - if ( ! sw->flags.hotsw.is1stCardChecked && debuggerFlg ) + if ( ! sw->flags.hotsw.is1stCardChecked && s_debuggerFlg ) { MI_CpuCopy8( &s_romEmuInfo, &(sw->romEmuInfo), ROM_EMULATION_DATA_SIZE ); - sw->flags.hotsw.isOnDebugger = debuggerFlg; + sw->flags.hotsw.isOnDebugger = s_debuggerFlg; } sw->flags.hotsw.isCardStateChanged = TRUE; @@ -1477,8 +1478,6 @@ static void SetMCSCR(void) Name: HotSwThread Description: カード抜け・挿し処理スレッド - - [TODO:]挿抜のフロー・フラグケアetcの確認(今の所、抜き挿ししてもタイトルが更新されない) *---------------------------------------------------------------------------*/ static void HotSwThread(void *arg) { @@ -1491,19 +1490,23 @@ static void HotSwThread(void *arg) OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); 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.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) - // - // NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。 - // スレッドを殺す前に、IREQとDET割り込みを無効にしておく。 -// HOTSW_Finalize(); + s_pollingThreadSleepFlg = msg->value ? FALSE : TRUE; + + if(msg->value){ + s_isPulledOut = TRUE; + + OS_SendMessage(&HotSwThreadData.hotswPollingCtrlQueue, + (OSMessage *)&HotSwThreadData.hotswPollingCtrlMsg[HotSwThreadData.idx_polling], + OS_MESSAGE_NOBLOCK); + HotSwThreadData.idx_polling = (HotSwThreadData.idx_polling+1) % HOTSW_POLLING_CTRL_BUFFER_NUM; + } } + if( msg->finalize == TRUE ) { + FinalizeHotSw( msg->apli ); + } + while(1){ if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) { SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; @@ -1512,7 +1515,7 @@ static void HotSwThread(void *arg) } if(HOTSW_IsCardExist()){ - if(!s_IsPulledOut){ + if(!s_isPulledOut){ if(GetMcSlotMode() == SLOT_STATUS_MODE_10){ LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); @@ -1540,12 +1543,12 @@ static void HotSwThread(void *arg) ClearCaradFlgs(); - s_IsPulledOut = TRUE; + s_isPulledOut = TRUE; break; } - s_IsPulledOut = FALSE; + s_isPulledOut = FALSE; } // カードが抜けてたら @@ -1558,7 +1561,7 @@ static void HotSwThread(void *arg) MI_CpuClearFast(s_pSecureSegBuffer, s_SecureSegBufSize); MI_CpuClearFast((u32 *)SYSM_CARD_BANNER_BUF, sizeof(TWLBannerFile)); - s_IsPulledOut = TRUE; + s_isPulledOut = TRUE; // ワンセグのスリープ時シャットダウン対策を戻す MCU_EnableDeepSleepToPowerLine( MCU_PWR_LINE_33, TRUE ); @@ -1589,20 +1592,280 @@ static void ClearCaradFlgs(void) /*---------------------------------------------------------------------------* - [TODO:] Finalize処理の前にやるべきこと + Name: FinalizeHotSw -・NANDアプリ起動時、カード電源OFF + Description: アプリ起動時に、活線挿抜関係の後始末を行う。 -・TWL NANDアプリなら - ゲームカードONフラグ(NANDのRomHeader TWL拡張諸フラグ)を見て、 - NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする +・カードが挿さっていて + TWL NANDアプリ起動なら + NANDアプリヘッダのゲームカードONフラグ=1 + → NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする -・NTR NANDアプリなら - カード種別問わず、GAMEモードに遷移(NTR互換のRomHeaderのみ読む) - 拡張領域残しておいてもよいかも - TWLカードがささっていて、Game2モードになっていたら、 - 電源OFFしてONして、Gameモードに遷移させる。 + NANDアプリヘッダのゲームカードONフラグ=0 + → スロット電源OFF + + NTR NANDアプリ起動なら + カード種別問わず、一度スロット電源OFFしてから、GAMEモードに遷移させておく。 + その際、NTR互換のRomHeaderのみ読み込んでおく。(拡張領域残しておいてもよいかも) + +・カードが抜かれていて + NANDアプリ起動なら + スロット電源OFFして、カードスロット関連のレジスタをクリアする + + + // NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。 + // スレッドを殺す前に、IREQとDET割り込みを無効にしておく。 *---------------------------------------------------------------------------*/ +static void FinalizeHotSw(HotSwApliType type) +{ + static BOOL finalized = FALSE; + BOOL isCardExist; + + if(finalized){ + OS_PutString("HotSw has been already finalized..."); + return; + } + finalized = TRUE; + + isCardExist = HOTSW_IsCardExist(); + + McPowerOff(); + + // ポーリングスレッドを消去 + OS_KillThread( &HotSwThreadData.monitorThread, NULL ); + + // カードがなかったら、レジスタクリアしてリターン + if(!isCardExist){ + ClearAllCardRegister(); + + return; + } + + switch(type){ + // Card Application Boot + case HOTSW_APLITYPE_CARD: + OS_PutString("Finalize Type : Card Application\n"); + break; + + // NTR NAND Application Boot + case HOTSW_APLITYPE_NTR_NAND: + OS_PutString("Finalize Type : NTR NAND Application\n"); + + if(!ShiftGameMode()){ + ClearAllCardRegister(); + + McPowerOff(); + + OS_PutString("Failed To Shift Game Mode... Card Slot Power Off\n"); + + return; + } + break; + + // TWL NAND Application Boot + case HOTSW_APLITYPE_TWL_NAND: + OS_PutString("Finalize Type : TWL NAND Application\n"); + + while(!SYSMi_GetWork()->flags.common.isHeaderLoadCompleted){ + OS_Sleep(1); + } + + if(s_cbData.pBootSegBuf->rh.s.game_card_on){ + McPowerOn(); + + s_cbData.modeType = HOTSW_MODE2; + (void)ReadBootSegNormal(&s_cbData); + + OS_PutString("- game card on flg is TRUE : now Normal Mode\n"); + } + break; + + // else + default: + OS_PutString("Finalize Type : Unexpected Type\n"); + + ClearAllCardRegister(); + + McPowerOff(); + + break; + } + + // 必要なレジスタ以外クリア + ClearUnnecessaryCardRegister(); +} + + +/*---------------------------------------------------------------------------* + Name: ShiftGameMode + + Description: Nitro互換のRomHeaderを読んで、Game Modeに移行させる + *---------------------------------------------------------------------------*/ +BOOL ShiftGameMode(void) +{ + HotSwState state; + + MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + +#ifndef DEBUG_USED_CARD_SLOT_B_ + CARD_LockRom(s_CardLockID); +#else + LockExCard(s_CardLockID); +#endif + + McPowerOn(); + + s_cbData.pBootSegBuf = s_pBootSegBuffer; + + s_cbData.modeType = HOTSW_MODE1; + state = LoadTable(); + + // ---------------------- Normal Mode ---------------------- + state = ReadIDNormal(&s_cbData); + + // ARM9と排他制御 + LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); + + // Boot Segment読み込み + // [TODO] Rom Header読み込む必要あるのか?挿したときに読み込まれた情報を使えばよい? + state = ReadBootSegNormal(&s_cbData); + + // CRCのチェック + // [TODO] Rom Header読み込まないんだったらCRCのチェックもいらない + { + u16 crc16; + + // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 + crc16 = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); + + if( ( crc16 != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || ( 0xcf56 != crc16 ) ){ + state = HOTSW_CRC_CHECK_ERROR; + } + } + + // NTR互換 Rom Headerをコピー + // [TODO] HW_CARD_ROM_HEADERだとデータが消されるっぽい + MI_NDmaCopy(HOTSW_NDMA_NO, (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE); + + OS_TPrintf("SYSM_CARD_ROM_HEADER_BAK( 0x%08x ) -> HW_CARD_ROM_HEADER( 0x%08x ) size : 0x%08x\n", SYSM_CARD_ROM_HEADER_BAK, HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE); + + // カード読みパラメータ設定 + if(s_debuggerFlg){ + s_cbData.cardType = ROM_EMULATION; + s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK; + } + else{ + s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1; + s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param; + } + s_cbData.secureLatency = AddLatency2ToLatency1(s_cbData.pBootSegBuf->rh.s.secure_cmd_param); + + // ARM9と排他制御ここまで + UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); + + // KeyTable初期化 + MakeBlowfishTableDS(&s_cbData, 8); + GenVA_VB_VD(); + + // Secure Modeへ + state = ChangeModeNormal(&s_cbData); + + // ---------------------- Secure Mode ---------------------- + // PNG On 設定 + state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); + + // 本体側符号化回路初期化 + SetMCSCR(); + + // [TODO] デバッグ用に読み込み。後で消す。 + state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); + + // Game Modeへ + state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); + + // ---------------------- Game Mode ---------------------- + state = ReadIDGame(&s_cbData); + + if(s_cbData.id_nml != s_cbData.id_gam){ + state = HOTSW_ID_CHECK_ERROR; + } + + OS_TPrintf("Card Normal ID : 0x%08x\n", s_cbData.id_nml); + OS_TPrintf("Card Secure ID : 0x%08x\n", s_cbData.id_scr); + OS_TPrintf("Card Game ID : 0x%08x\n", s_cbData.id_gam); + + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); + HOTSW_WaitCardCtrl(); + +#ifndef DEBUG_USED_CARD_SLOT_B_ + CARD_UnlockRom(s_CardLockID); +#else + UnlockExCard(s_CardLockID); +#endif + + if(state == HOTSW_SUCCESS){ + return TRUE; + } + else{ + return FALSE; + } +} + + +/*---------------------------------------------------------------------------* + Name: ClearUnnecessaryCardRegister + + Description: カード関連の不要なレジスタをクリアする + *---------------------------------------------------------------------------*/ +#define REGCLEAR_16 0x0000 +#define REGCLEAR_32 0x00000000UL + +static void ClearUnnecessaryCardRegister(void) +{ + // Chattering Coungerをクリア [d31-d16 Chattering Counter] + reg_MI_MC1 &= ~REG_MI_MC1_CC_MASK; + + // Counter-Aをクリア + reg_MI_MC2 = REGCLEAR_16; + + // HotSwで使っている割り込みを無効にする + (void)OS_DisableIrq(); + (void)OS_SetIrqMask( OS_GetIrqMask() & ~(HOTSW_IF_CARD_DET | HOTSW_IF_CARD_IREQ) ); + (void)OS_ResetRequestIrqMask( HOTSW_IF_CARD_DET | HOTSW_IF_CARD_IREQ ); + (void)OS_EnableIrq(); +} + + +/*---------------------------------------------------------------------------* + Name: ClearAllCardRegister + + Description: カード関連の全てのレジスタをクリアする。 + *---------------------------------------------------------------------------*/ +static void ClearAllCardRegister(void) +{ + ClearUnnecessaryCardRegister(); + + // コマンド設定レジスタをクリア [各32bit] + reg_HOTSW_MCCMD0 = REGCLEAR_32; + reg_HOTSW_MCCMD1 = REGCLEAR_32; + + // メモリカードイネーブルとか割り込みイネーブルとかをクリア [16bit中 d15-d8が関係あり] + reg_HOTSW_MCCNT0 &= HOTSW_E2PROM_CTRL_MASK; + + // latencyとかstartフラグとかのレジスタをクリア [32bit] + reg_HOTSW_MCCNT1 = REGCLEAR_32; + + // カードからのデータがたまるレジスタをクリア [32bit] + reg_HOTSW_MCD1 = REGCLEAR_32; + + // 符号生成回路初期値設定レジスタをクリア [各32bit] + reg_HOTSW_MCSCR0 = REGCLEAR_32; + reg_HOTSW_MCSCR1 = REGCLEAR_32; + reg_HOTSW_MCSCR2 = REGCLEAR_32; + + // Slot Status,SWPをクリア [d15-d0 Slot Status,SWP] + reg_MI_MC1 = REGCLEAR_16; +} /*---------------------------------------------------------------------------* @@ -1611,7 +1874,7 @@ static void ClearCaradFlgs(void) Description: 実際のカード状態とHotSwThreadで状態を比べて、違いがあった場合は メッセージを送る - s_IsPulledOut : True -> カードなし HOTSW_IsCardExist : True -> カードあり + s_isPulledOut : True -> カードなし HOTSW_IsCardExist : True -> カードあり False -> カードあり False -> カードなし *---------------------------------------------------------------------------*/ static void MonitorThread(void *arg) @@ -1627,11 +1890,17 @@ static void MonitorThread(void *arg) } while(s_isHotSwBusy); + // ポーリングスレッド抑制フラグが上がってたら、スリープ。抑制フラグが下りたら起床。 + if(s_pollingThreadSleepFlg){ + OSMessage msg; + OS_ReceiveMessage(&HotSwThreadData.hotswPollingCtrlQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); + } + // 現在カードが抜けているか isPullOutNow = !HOTSW_IsCardExist(); // 状態の比較 - if(s_IsPulledOut != isPullOutNow){ + if(s_isPulledOut != isPullOutNow){ OSIntrMode enabled = OS_DisableInterrupts(); // 本当は抜けてた場合 @@ -1738,9 +2007,13 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) d.data = data; - HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; - HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; - HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].type = HOTSW_CONTROL; + OS_TPrintf("... Pxi Message - value:%x ctrl:%x finalize:%x bootType:%x\n", + d.msg.value, d.msg.ctrl, d.msg.finalize, d.msg.bootType); + + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].finalize = (d.msg.finalize) ? TRUE : FALSE; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].apli = (HotSwApliType)d.msg.bootType; // メッセージ送信 OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index edd67de1..4a9fcb8a 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -81,13 +81,8 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif return HOTSW_SUCCESS; } @@ -125,13 +120,8 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd) reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK); -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif page++; } diff --git a/build/libraries_sysmenu/hotsw/ARM9/Makefile b/build/libraries_sysmenu/hotsw/ARM9/Makefile new file mode 100644 index 00000000..45ce1b00 --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM9/Makefile @@ -0,0 +1,52 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlIPL +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- +TARGET_FIRM = SYSTEMMENU +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED +TWL_PROC = ARM9 + +#---------------------------------------------------------------------------- + +SRCDIR = ./src + +SRCS = hotsw_ctrl.c + +TARGET_LIB = libhotsw$(TWL_LIBSUFFIX).a + +ifneq ($(DHT_TEST),) +MACRO_FLAGS += -DDHT_TEST +endif + +include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== + diff --git a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c new file mode 100644 index 00000000..f7c92db8 --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c @@ -0,0 +1,89 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: hotsw_ctrl.c + + Copyright 2007 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ +#include +#include + + +// =========================================================================== +// Function Describe +// =========================================================================== + +/*---------------------------------------------------------------------------* + Name: HOTSW_EnableHotSWAsync + + Description: PXI通信でARM7に活線挿抜有効/無効を通知 + *---------------------------------------------------------------------------*/ +void HOTSW_EnableHotSWAsync( BOOL enable ) +{ + HotSwPxiMessage msg; + + enable = enable ? 1 : 0; + + // 現在の値と同じなら何もせずリターン + if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == enable ) { + return; + } + + msg.msg.value = enable; + msg.msg.ctrl = TRUE; + + while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS) + { + // do nothing + } +} + + +/*---------------------------------------------------------------------------* + Name: HOTSW_FinalizeHotSW + + Description: PXI通信でARM7に活線挿抜Finalize処理を通知 + *---------------------------------------------------------------------------*/ +void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ) +{ + HotSwPxiMessage msg; + + msg.msg.finalize = TRUE; + msg.msg.bootType = (u8)apliType; + + while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS) + { + // do nothing + } +} + + +/*---------------------------------------------------------------------------* + Name: HOTSW_isEnableHotSW + + Description: 活線挿抜の許可/抑制の状態を返す + *---------------------------------------------------------------------------*/ +BOOL HOTSW_isEnableHotSW(void) +{ + return SYSMi_GetWork()->flags.hotsw.isEnableHotSW ? TRUE : FALSE; +} + + +/*---------------------------------------------------------------------------* + Name: HOTSW_isCardLoadCompleted + + Description: カードアプリのロードが完了しているかを返す + *---------------------------------------------------------------------------*/ +BOOL HOTSW_isCardLoadCompleted(void) +{ + return SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted ? TRUE : FALSE; +} \ No newline at end of file diff --git a/build/libraries_sysmenu/hotsw/Makefile b/build/libraries_sysmenu/hotsw/Makefile index efcd2be0..98e8d13e 100644 --- a/build/libraries_sysmenu/hotsw/Makefile +++ b/build/libraries_sysmenu/hotsw/Makefile @@ -24,7 +24,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS = ARM7 +SUBDIRS = ARM7 ARM9 #---------------------------------------------------------------------------- diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 17424505..f30d60af 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -71,7 +71,7 @@ extern const u8 g_devPubKey[ 4 ][ 0x80 ]; // function's prototype------------------------------------------------------- static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); -static void SYSMi_EnableHotSW( BOOL enable ); + static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); static void SYSMi_AppendRelocateInfoCardSecureArea( void ); static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); @@ -635,7 +635,12 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) #define STACK_SIZE 0xc00 static u64 stack[ STACK_SIZE / sizeof(u64) ]; - SYSMi_EnableHotSW( FALSE ); + HOTSW_EnableHotSWAsync( FALSE ); + // 値が変化するまでスリープして待つ。 + while( HOTSW_isEnableHotSW() != FALSE ) { + OS_Sleep( 2 ); + } + s_loadstart = TRUE; // このあとCardRomヘッダバッファにROMヘッダを上書きで読み込むので // この時点でHotSWが止まっていないと、さらにカードのROMヘッダ @@ -1429,34 +1434,4 @@ void CheckDigest( void ) } } } -#endif - - -// 活線挿抜有効/無効をセット -void SYSMi_EnableHotSW( BOOL enable ) -{ - enable = enable ? 1 : 0; - - // 現在の値と同じなら何もせずリターン - if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == enable ) { - return; - } - - { - HotSwPxiMessage msg; - - msg.msg.value = enable; - msg.msg.ctrl = TRUE; - - while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS) - { - // do nothing - } - - } - - // 値が変化するまでスリープして待つ。 - while( SYSMi_GetWork()->flags.hotsw.isEnableHotSW != enable ) { - OS_Sleep( 2 ); - } -} \ No newline at end of file +#endif \ No newline at end of file diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index ae0c5cec..85690b75 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -38,13 +38,21 @@ typedef enum ModeType{ HOTSW_MODE2 } ModeType; +typedef enum HotSwApliType{ + HOTSW_APLITYPE_CARD, + HOTSW_APLITYPE_NTR_NAND, + HOTSW_APLITYPE_TWL_NAND +} HotSwApliType; + // union ------------------------------------------------------------------- // PXI用メッセージ typedef union HotSwPxiMessage{ struct { u32 value :1; u32 ctrl :1; - u32 :30; + u32 finalize:1; + u32 bootType:8; + u32 :21; } msg; u32 data; } HotSwPxiMessage; @@ -54,7 +62,9 @@ typedef union HotSwPxiMessage{ typedef struct HotSwMessage{ u32 value; BOOL ctrl; + BOOL finalize; HotSwMessageType type; + HotSwApliType apli; } HotSwMessage; @@ -89,6 +99,18 @@ BOOL HOTSWi_IsRomEmulation(void); // デバッガ通信用にカードスロットの電源をONにする。 void HOTSWi_TurnCardPowerOn(u32 slot); +// PXI通信でARM7に活線挿抜有効/無効を通知 +void HOTSW_EnableHotSWAsync( BOOL enable ); + +// PXI通信でARM7に活線挿抜Finalize処理を通知 +void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType ); + +// 活線挿抜の許可/抑制の状態を返す +BOOL HOTSW_isEnableHotSW(void); + +// カードアプリのロードが完了しているかを返す +BOOL HOTSW_isCardLoadCompleted(void); + #ifdef __cplusplus } /* extern "C" */ #endif