バッドブロック置換処理を追加。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@837 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-03-06 09:33:13 +00:00
parent 7baf8e0659
commit 0d30d436f1
5 changed files with 231 additions and 22 deletions

View File

@ -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へ変換してレジスタへセット

View File

@ -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];

View File

@ -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

View File

@ -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;
}

View File

@ -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;