mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
バッドブロック置換処理を追加。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@837 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
7baf8e0659
commit
0d30d436f1
@ -22,6 +22,12 @@ HotSwState ReadIDNormal(CardBootData *cbd);
|
||||
// ノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||
HotSwState ReadBootSegNormal(CardBootData *cbd);
|
||||
|
||||
// ノーマルモードでステータスを読み込む
|
||||
HotSwState ReadStatusNormal(CardBootData *cbd);
|
||||
|
||||
// ノーマルモードでバッドブロックを置換
|
||||
HotSwState RefreshBadBlockNormal(CardBootData *cbd);
|
||||
|
||||
// ノーマルモードからセキュアモードへの変更
|
||||
HotSwState ChangeModeNormal(CardBootData *cbd);
|
||||
|
||||
@ -59,6 +65,12 @@ HotSwState ReadIDGame(CardBootData *cbd);
|
||||
// ゲームモードの指定ページ読み込み
|
||||
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
||||
|
||||
// ゲームモードでステータスを読み込む
|
||||
HotSwState ReadStatusGame(CardBootData *cbd);
|
||||
|
||||
// ゲームモードでバッドブロックを置換
|
||||
HotSwState RefreshBadBlockGame(CardBootData *cbd);
|
||||
|
||||
|
||||
// ■ 内部関数 ■
|
||||
// LEコマンドをBEへ変換してレジスタへセット
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: TwlFirm - GCD - include
|
||||
Project: TwlIPL - HOTSW - include
|
||||
File: type.h
|
||||
|
||||
Copyright 2007 Nintendo. All rights reserved.
|
||||
Copyright 2007-2008 Nintendo. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
@ -164,6 +164,15 @@ typedef enum CardTypeEx{
|
||||
ROM_EMULATION
|
||||
} CardTypeEx;
|
||||
|
||||
typedef enum RomMode{
|
||||
HOTSW_ROM_MODE_NULL = 0,
|
||||
HOTSW_ROM_MODE_NORMAL,
|
||||
HOTSW_ROM_MODE_SECURE,
|
||||
HOTSW_ROM_MODE_GAME,
|
||||
|
||||
HOTSW_ROM_MODE_NUM
|
||||
} RomMode;
|
||||
|
||||
typedef enum NormalCommandType{
|
||||
RD_ID = 0,
|
||||
RD_BSEG,
|
||||
@ -247,6 +256,8 @@ typedef struct CardBootData{
|
||||
BOOL twlFlg;
|
||||
BOOL debuggerFlg;
|
||||
|
||||
u32 romStatus;
|
||||
|
||||
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
|
||||
u32 keyBuf[KEY_BUF_SIZE];
|
||||
|
||||
|
||||
@ -29,13 +29,13 @@ extern "C" {
|
||||
#define HOTSW_LOAD_TABLE_SIZE 0x2000 // 8KB
|
||||
#define HOTSW_SECURE_AREA_SIZE 0x4000 // 16KB
|
||||
#define HOTSW_SECURE2_AREA_SIZE 0x4000 // 16KB
|
||||
#define HOTSW_EMU_INFO_SIZE 0x20
|
||||
#define HOTSW_ROMEMU_INFO_SIZE 0x20
|
||||
|
||||
#define HOTSW_SECURE_AREA_OFS 0x4000 // 16KB
|
||||
#define HOTSW_GAME_AREA_OFS 0x8000 // 32KB
|
||||
#define HOTSW_SECURE2_AREA_OFS 0x3000 // 12KB
|
||||
#define HOTSW_GAME2_AREA_OFS 0x7000 // 28KB
|
||||
#define HOTSW_EMU_INFO_OFS (HOTSW_SECURE_AREA_OFS - HOTSW_PAGE_SIZE + 0x160)
|
||||
#define HOTSW_ROMEMU_INFO_OFS (HOTSW_SECURE_AREA_OFS - HOTSW_PAGE_SIZE + 0x160)
|
||||
|
||||
|
||||
// ROM ID
|
||||
@ -47,8 +47,8 @@ extern "C" {
|
||||
|
||||
// ROM STATUS
|
||||
|
||||
#define HOTSW_ROMST_RFS_REQ_MASK 0x00000004UL
|
||||
#define HOTSW_ROMST_RFS_WARN_MASK 0x00000008UL
|
||||
#define HOTSW_ROMST_RFS_WARN_L1_MASK 0x00000004UL
|
||||
#define HOTSW_ROMST_RFS_WARN_L2_MASK 0x00000008UL
|
||||
#define HOTSW_ROMST_RFS_READY_MASK 0x00000020UL
|
||||
|
||||
|
||||
|
||||
@ -150,6 +150,74 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
||||
}
|
||||
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* ReadStatusNormal関数
|
||||
*
|
||||
* ノーマルモードでステータスを読み込む
|
||||
* ----------------------------------------------------------------- */
|
||||
HotSwState ReadStatusNormal(CardBootData *cbd)
|
||||
{
|
||||
GCDCmd64 cndLE;
|
||||
|
||||
cbd->romStatus = 0;
|
||||
|
||||
if(!HOTSW_IsCardAccessible()){
|
||||
return HOTSW_PULLED_OUT_ERROR;
|
||||
}
|
||||
|
||||
// カード割り込みによるDMAコピー
|
||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
||||
|
||||
// リトルエンディアンで作って
|
||||
cndLE.dw = HSWOP_N_OP_RD_STAT;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
HOTSWi_SetCommand(&cndLE);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||
|
||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||
OS_SleepThread(NULL);
|
||||
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* RefreshBadBlockNormal関数
|
||||
*
|
||||
* ノーマルモードでバッドブロックを置換
|
||||
* ----------------------------------------------------------------- */
|
||||
HotSwState RefreshBadBlockNormal(CardBootData *cbd)
|
||||
{
|
||||
GCDCmd64 cndLE;
|
||||
|
||||
if(!HOTSW_IsCardAccessible()){
|
||||
return HOTSW_PULLED_OUT_ERROR;
|
||||
}
|
||||
|
||||
// リトルエンディアンで作って
|
||||
cndLE.dw = HSWOP_N_OP_RD_STAT;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
HOTSWi_SetCommand(&cndLE);
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
||||
START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
||||
|
||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||
OS_SleepThread(NULL);
|
||||
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ChangeModeNormal
|
||||
*
|
||||
@ -641,4 +709,67 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
||||
}
|
||||
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Name: ReadStatusGame
|
||||
*
|
||||
* Description: ゲームモードでステータスを読み込む
|
||||
*---------------------------------------------------------------------------*/
|
||||
HotSwState ReadStatusGame(CardBootData *cbd)
|
||||
{
|
||||
GCDCmd64 cndLE;
|
||||
|
||||
if(!HOTSW_IsCardAccessible()){
|
||||
return HOTSW_PULLED_OUT_ERROR;
|
||||
}
|
||||
|
||||
// NewDMA転送の準備
|
||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
||||
|
||||
// リトルエンディアンで作って
|
||||
cndLE.dw = HSWOP_G_OP_RD_STAT;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
HOTSWi_SetCommand(&cndLE);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||
|
||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||
OS_SleepThread(NULL);
|
||||
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* RefreshBadBlockGame関数
|
||||
*
|
||||
* ゲームモードでバッドブロックを置換
|
||||
* ----------------------------------------------------------------- */
|
||||
HotSwState RefreshBadBlockGame(CardBootData *cbd)
|
||||
{
|
||||
GCDCmd64 cndLE;
|
||||
|
||||
if(!HOTSW_IsCardAccessible()){
|
||||
return HOTSW_PULLED_OUT_ERROR;
|
||||
}
|
||||
|
||||
// リトルエンディアンで作って
|
||||
cndLE.dw = HSWOP_G_OP_RD_STAT;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
HOTSWi_SetCommand(&cndLE);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ)
|
||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||
START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
||||
|
||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||
OS_SleepThread(NULL);
|
||||
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -50,7 +50,6 @@
|
||||
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
||||
#endif
|
||||
|
||||
|
||||
// スレッド・メッセージ関係をまとめた構造体
|
||||
typedef struct CardThreadData{
|
||||
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
|
||||
@ -111,6 +110,8 @@ static void ShowRegisterData(void);
|
||||
static void ShowRomHeaderData(void);
|
||||
static void DebugPrintErrorMessage(HotSwState state);
|
||||
|
||||
HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
|
||||
|
||||
// Static Values ------------------------------------------------------------
|
||||
static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj";
|
||||
static char rom_emu_info[] ATTRIBUTE_ALIGN(4) = "TWLD";
|
||||
@ -278,6 +279,7 @@ static HotSwState LoadCardData(void)
|
||||
OSTick start;
|
||||
HotSwState retval = HOTSW_SUCCESS;
|
||||
HotSwState state = HOTSW_SUCCESS;
|
||||
u32 romMode = HOTSW_ROM_MODE_NULL;
|
||||
|
||||
start = OS_GetTick();
|
||||
|
||||
@ -308,6 +310,8 @@ static HotSwState LoadCardData(void)
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
|
||||
// ---------------------- Normal Mode ----------------------
|
||||
romMode = HOTSW_ROM_MODE_NORMAL;
|
||||
|
||||
// カードID読み込み
|
||||
state = ReadIDNormal(&s_cbData);
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
@ -390,6 +394,8 @@ static HotSwState LoadCardData(void)
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
|
||||
// ---------------------- Secure Mode ----------------------
|
||||
romMode = HOTSW_ROM_MODE_SECURE;
|
||||
|
||||
// PNG設定
|
||||
state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
@ -417,6 +423,8 @@ static HotSwState LoadCardData(void)
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
|
||||
// ---------------------- Game Mode ----------------------
|
||||
romMode = HOTSW_ROM_MODE_GAME;
|
||||
|
||||
// ID読み込み
|
||||
state = ReadIDGame(&s_cbData);
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
@ -427,7 +435,7 @@ static HotSwState LoadCardData(void)
|
||||
|
||||
// 排他制御ここまで(※CRCチェックまでにミスがなかったら、排他制御ここまで)
|
||||
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
||||
|
||||
|
||||
// カードIDの比較をして、一致しなければFALSEを返す
|
||||
if(s_cbData.id_scr != s_cbData.id_gam){
|
||||
retval = (retval == HOTSW_SUCCESS) ? HOTSW_ID_CHECK_ERROR : retval;
|
||||
@ -457,6 +465,12 @@ static HotSwState LoadCardData(void)
|
||||
}
|
||||
|
||||
end:
|
||||
if( retval == HOTSW_SUCCESS )
|
||||
{
|
||||
// バッドブロックを置換
|
||||
HOTSWi_RefreshBadBlock(romMode);
|
||||
}
|
||||
|
||||
// カードのロック開放(※ロックIDは開放せずに持ち続ける)
|
||||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||
CARD_UnlockRom(s_CardLockID);
|
||||
@ -469,6 +483,52 @@ end:
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* HOTSWi_RefreshBadBlock関数
|
||||
*
|
||||
* ノーマルモードまたはゲームモードでバッドブロックを置換
|
||||
* ----------------------------------------------------------------- */
|
||||
HotSwState HOTSWi_RefreshBadBlock(u32 romMode)
|
||||
{
|
||||
HotSwState retval = HOTSW_SUCCESS;
|
||||
HotSwState state = HOTSW_SUCCESS;
|
||||
|
||||
HotSwState (*pReadStatus)(CardBootData *cbd);
|
||||
HotSwState (*pRefreshBadBlock)(CardBootData *cbd);
|
||||
|
||||
if ( ! ( romMode == HOTSW_ROM_MODE_NORMAL || romMode == HOTSW_ROM_MODE_GAME ) )
|
||||
{
|
||||
return HOTSW_SUCCESS;
|
||||
}
|
||||
|
||||
if ( romMode == HOTSW_ROM_MODE_NORMAL )
|
||||
{
|
||||
pReadStatus = ReadStatusNormal;
|
||||
pRefreshBadBlock = RefreshBadBlockNormal;
|
||||
}
|
||||
else
|
||||
if ( romMode == HOTSW_ROM_MODE_GAME )
|
||||
{
|
||||
pReadStatus = ReadStatusGame;
|
||||
pRefreshBadBlock = RefreshBadBlockGame;
|
||||
}
|
||||
|
||||
// ステータス対応ROMのみステータス読み込み
|
||||
if ( s_cbData.id_nml & HOTSW_ROMID_RFSSUP_MASK )
|
||||
{
|
||||
state = pReadStatus(&s_cbData);
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
// 要求レベルに関わらずバッドブロックを置換(製品カードでは滅多に発生しない)
|
||||
if ( s_cbData.romStatus & (HOTSW_ROMST_RFS_WARN_L1_MASK | HOTSW_ROMST_RFS_WARN_L2_MASK) )
|
||||
{
|
||||
state = pRefreshBadBlock(&s_cbData);
|
||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* HOTSW_GetRomEmulationBuffer関数
|
||||
*
|
||||
@ -488,15 +548,14 @@ void* HOTSW_GetRomEmulationBuffer(void)
|
||||
* ----------------------------------------------------------------- */
|
||||
static HotSwState LoadBannerData(void)
|
||||
{
|
||||
static BOOL init = FALSE;
|
||||
BOOL state;
|
||||
HotSwState retval = HOTSW_SUCCESS;
|
||||
|
||||
// バナーリード
|
||||
if( s_cbData.pBootSegBuf->rh.s.banner_offset ) {
|
||||
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset,
|
||||
(u32 *)SYSM_CARD_BANNER_BUF,
|
||||
sizeof(TWLBannerFile) );
|
||||
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.banner_offset,
|
||||
(u32 *)SYSM_CARD_BANNER_BUF,
|
||||
sizeof(TWLBannerFile) );
|
||||
|
||||
// バナーリードが成功していたら各種フラグTRUE その他の場合はFALSE (この関数の外で排他制御されているからここでは排他制御しないでOK)
|
||||
state = (retval == HOTSW_SUCCESS) ? TRUE : FALSE;
|
||||
@ -518,17 +577,13 @@ static HotSwState LoadBannerData(void)
|
||||
SYSMi_GetWork()->flags.hotsw.isInspectCard = FALSE;
|
||||
}
|
||||
|
||||
if ( ! init )
|
||||
// デバッガ情報
|
||||
if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && s_cbData.debuggerFlg )
|
||||
{
|
||||
init = TRUE;
|
||||
|
||||
// ƒfƒoƒbƒK<C692>î•ñ
|
||||
if ( ! SYSMi_GetWork()->flags.hotsw.is1stCardChecked && s_cbData.debuggerFlg )
|
||||
{
|
||||
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
|
||||
SYSMi_GetWork()->flags.hotsw.isOnDebugger = s_cbData.debuggerFlg;
|
||||
}
|
||||
MI_CpuCopy8( HOTSW_GetRomEmulationBuffer(), &SYSMi_GetWork()->romEmuInfo, ROM_EMULATION_DATA_SIZE );
|
||||
SYSMi_GetWork()->flags.hotsw.isOnDebugger = s_cbData.debuggerFlg;
|
||||
}
|
||||
|
||||
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
|
||||
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user