(更新:Akabane Jumpei)

・finalize処理追加
・活線挿抜 許可/抑制対応
・ちょっとソース整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1285 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-05-01 04:39:56 +00:00
parent 3547f58229
commit fe957af115
10 changed files with 512 additions and 102 deletions

View File

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

View File

@ -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;
// ƒJ<C692>[ƒhN“®—pŠÖ<C5A0>

View File

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

View File

@ -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.全てのレジスタをクリアする (カードがささっていない時)
// 一度電源を落として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);

View File

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

View File

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

View File

@ -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 <twl.h>
#include <sysmenu.h>
// ===========================================================================
// 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;
}

View File

@ -24,7 +24,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM7
SUBDIRS = ARM7 ARM9
#----------------------------------------------------------------------------

View File

@ -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 );
}
}
#endif

View File

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