mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・Secure1,2モードのデータリードシーケンスを共通化 ・ソースちょっと整理 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1110 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
598f263932
commit
3035b1ffb3
@ -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)
|
||||
{
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user