From 3035b1ffb3ce9684fdcdcdf13dc2d8ebd9fbaccc Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Fri, 11 Apr 2008 10:04:30 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BBSecure1,2=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=83=AA=E3=83=BC=E3=83=89=E3=82=B7=E3=83=BC?= =?UTF-8?q?=E3=82=B1=E3=83=B3=E3=82=B9=E3=82=92=E5=85=B1=E9=80=9A=E5=8C=96?= =?UTF-8?q?=20=E3=83=BB=E3=82=BD=E3=83=BC=E3=82=B9=E3=81=A1=E3=82=87?= =?UTF-8?q?=E3=81=A3=E3=81=A8=E6=95=B4=E7=90=86?= 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/trunk@1110 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/src/dsCardCommon.c | 157 +++++++----------- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 83 +++++---- 2 files changed, 105 insertions(+), 135 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 3e1128f3..93e4b441 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -92,24 +92,19 @@ HotSwState ReadIDNormal(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (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; } /*---------------------------------------------------------------------------* - * Name: ReadBootSegNormal - * - * Description: ノーマルモードのBoot Segment読み込み - * - * CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page + Name: ReadBootSegNormal + + Description: ノーマルモードのBoot Segment読み込み + + CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page *---------------------------------------------------------------------------*/ HotSwState ReadBootSegNormal(CardBootData *cbd) { @@ -165,13 +160,8 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif page++; } @@ -210,13 +200,8 @@ HotSwState ReadStatusNormal(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif return HOTSW_SUCCESS; } @@ -255,11 +240,11 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: ChangeModeNormal - * - * Description: ノーマルモードからセキュアモードへの変更 - * - * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page + Name: ChangeModeNormal + + Description: ノーマルモードからセキュアモードへの変更 + + CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ HotSwState ChangeModeNormal(CardBootData *cbd) { @@ -268,11 +253,11 @@ HotSwState ChangeModeNormal(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: ChangeModeNorma2 - * - * Description: ノーマルモードからセキュア2モードへの変更 - * - * CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page + Name: ChangeModeNorma2 + + Description: ノーマルモードからセキュア2モードへの変更 + + CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ HotSwState ChangeModeNormal2(CardBootData *cbd) { @@ -335,19 +320,15 @@ HotSwState LoadTable(void) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16; + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16 | LATENCY2_MASK & (0x18 << LATENCY2_SHIFT); -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* Name: ReadRomEmulationInfo @@ -466,15 +447,16 @@ static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask) /*---------------------------------------------------------------------------* - * Name: ReadIDSecure - * - * Description: - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status + Name: ReadIDSecure + + Description: + + CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status *---------------------------------------------------------------------------*/ HotSwState ReadIDSecure(CardBootData *cbd) { u32 scrambleMask; + u32 *buf = (cbd->modeType == HOTSW_MODE1) ? &cbd->id_scr : &cbd->id_scr2; if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; @@ -490,7 +472,7 @@ HotSwState ReadIDSecure(CardBootData *cbd) PreSendSecureCommand(cbd, &scrambleMask); // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf, sizeof(buf) ); // MCCNT0 レジスタ設定 reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); @@ -498,14 +480,9 @@ HotSwState ReadIDSecure(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif - + // コマンドカウンタインクリメント cbd->vbi++; @@ -514,9 +491,9 @@ HotSwState ReadIDSecure(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: ReadSegSecure - * - * Description: + Name: ReadSegSecure + + Description: *---------------------------------------------------------------------------*/ HotSwState ReadSegSecure(CardBootData *cbd) { @@ -564,25 +541,20 @@ HotSwState ReadSegSecure(CardBootData *cbd) // MCCNT0 レジスタ設定 reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (pc << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif - + // 転送済みページ数 j++; } - + // 読み込みセグメント番号インクリメント segNum++; - + // コマンドカウンタインクリメント cbd->vbi++; } @@ -592,9 +564,9 @@ HotSwState ReadSegSecure(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: SwitchONPNGSecure - * - * Description: + Name: SwitchONPNGSecure + + Description: *---------------------------------------------------------------------------*/ HotSwState SwitchONPNGSecure(CardBootData *cbd) { @@ -630,9 +602,9 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: SwitchOFFPNGSecure - * - * Description: + Name: SwitchOFFPNGSecure + + Description: *---------------------------------------------------------------------------*/ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) { @@ -668,11 +640,11 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) /*---------------------------------------------------------------------------* - * Name: ChangeModeSecure - * - * Description: - * - * CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page + Name: ChangeModeSecure + + Description: + + CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page *---------------------------------------------------------------------------*/ HotSwState ChangeModeSecure(CardBootData *cbd) { @@ -711,9 +683,9 @@ HotSwState ChangeModeSecure(CardBootData *cbd) // ■ ゲームモードのコマンド ■ // ■------------------------------------■ /*---------------------------------------------------------------------------* - * Name: ReadIDGame - * - * Description: ゲームモードでIDを読み込む + Name: ReadIDGame + + Description: ゲームモードでIDを読み込む *---------------------------------------------------------------------------*/ HotSwState ReadIDGame(CardBootData *cbd) { @@ -738,24 +710,19 @@ HotSwState ReadIDGame(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif return HOTSW_SUCCESS; } /*---------------------------------------------------------------------------* - * Name: ReadPageGame - * - * Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む - * - * CT=150ns Pagecount=1page Latency=RomHeaderで指定の値 + Name: ReadPageGame + + Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む + + CT=150ns Pagecount=1page Latency=RomHeaderで指定の値 *---------------------------------------------------------------------------*/ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) { @@ -788,13 +755,8 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif } return HOTSW_SUCCESS; @@ -802,9 +764,9 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) /*---------------------------------------------------------------------------* - * Name: ReadStatusGame - * - * Description: ゲームモードでステータスを読み込む + Name: ReadStatusGame + + Description: ゲームモードでステータスを読み込む *---------------------------------------------------------------------------*/ HotSwState ReadStatusGame(CardBootData *cbd) { @@ -829,22 +791,17 @@ HotSwState ReadStatusGame(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; -#if 0 - // DMAが終了するまで待つ - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); -#else // メッセージ受信 OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); -#endif return HOTSW_SUCCESS; } /* ----------------------------------------------------------------- - * RefreshBadBlockGame関数 - * - * ゲームモードでバッドブロックを置換 + RefreshBadBlockGame関数 + + ゲームモードでバッドブロックを置換 * ----------------------------------------------------------------- */ HotSwState RefreshBadBlockGame(CardBootData *cbd) { diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index dd36df91..8bb27f0e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -32,7 +32,7 @@ #define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us) #define COUNTER_A 0x51C // 20ms分 ( 0x51C * 15.3us = 20012us) -#define CARD_EXIST_CHECK_INTERVAL 300 +#define CARD_EXIST_CHECK_INTERVAL 200 #define UNDEF_CODE 0xe7ffdeff // 未定義コード #define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB @@ -81,6 +81,7 @@ static void McPowerOff(void); static void SetMCSCR(void); static BOOL isTwlModeLoad(void); +static HotSwState ReadSecureModeCardData(void); static void GenVA_VB_VD(void); static HotSwState DecryptObjectFile(void); @@ -424,27 +425,9 @@ static HotSwState LoadCardData(void) // ---------------------- Secure Mode ---------------------- romMode = HOTSW_ROM_MODE_SECURE; - // PNG設定 - state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // DS側符号生成回路初期値設定 (レジスタ設定) - SetMCSCR(); - - // ID読み込み - state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // カードIDの比較をして、一致しなければFALSEを返す - if(s_cbData.id_nml != s_cbData.id_scr){ - retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; - } - - if(retval == HOTSW_SUCCESS){ - // Secure領域のSegment読み込み - state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - } + // SecureモードのIDとSecureSegmentを読み込む + state = ReadSecureModeCardData(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // ★TWLカード対応 一旦リセット後Secure2モードに移行 // SCFG @@ -477,20 +460,9 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Secure2 Mode ---------------------- - // PNG設定 - state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // DS側符号生成回路初期値設定 (レジスタ設定) - SetMCSCR(); - - // セキュア2カードID読み込み - state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); + // Secure2モードのIDとSecureSegmentを読み込む + state = ReadSecureModeCardData(); retval = (retval == HOTSW_SUCCESS) ? state : retval; - - // Secure2領域のSegment読み込み - state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; } // ゲームモードに移行 @@ -631,6 +603,44 @@ static BOOL isTwlModeLoad(void) } +/*---------------------------------------------------------------------------* + Name: ReadSecureModeCardData + + Description: セキュアモードの各種読み込みを行う関数 + + ※ s_cbData.modeTypeの設定はこの関数の外で行う + *---------------------------------------------------------------------------*/ +static HotSwState ReadSecureModeCardData(void) +{ + HotSwState retval = HOTSW_SUCCESS; + HotSwState state = HOTSW_SUCCESS; + + // PNG設定 + state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // DS側符号生成回路初期値設定 (レジスタ設定) + SetMCSCR(); + + // ID読み込み + state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + + // カードIDの比較をして、一致しなければFALSEを返す + if(s_cbData.id_nml != s_cbData.id_scr){ + retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval; + } + + if(retval == HOTSW_SUCCESS){ + // Secure領域のSegment読み込み + state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); + retval = (retval == HOTSW_SUCCESS) ? state : retval; + } + + return retval; +} + + /*---------------------------------------------------------------------------* Name: HOTSWi_RefreshBadBlock @@ -1378,6 +1388,9 @@ static void HotSwThread(void *arg) // → 1.全てのレジスタをクリアする (カードがささっていない時) // 2.一度電源を落としてNomalモードにする (NANDアプリ等を起動する場合) // 3.必要なレジスタを残して、後はクリア (ささっているカードを起動する場合) + // + // NANDアプリ起動時の終了処理が確認できたら、、BOOTAPIでKillThreadでスレッドを殺せるようにしておく。 + // スレッドを殺す前に、IREQとDET割り込みを無効にしておく。 // HOTSW_Finalize(); }