mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
3547f58229
commit
fe957af115
@ -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)
|
||||
|
||||
@ -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>[ƒh‹N“®—pŠÖ<C5A0>”
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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.全てのレジスタをクリアする (カードがささっていない時)
|
||||
// 2.一度電源を落として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);
|
||||
|
||||
@ -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++;
|
||||
}
|
||||
|
||||
52
build/libraries_sysmenu/hotsw/ARM9/Makefile
Normal file
52
build/libraries_sysmenu/hotsw/ARM9/Makefile
Normal 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 =====
|
||||
|
||||
89
build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c
Normal file
89
build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c
Normal 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;
|
||||
}
|
||||
@ -24,7 +24,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
SUBDIRS = ARM7
|
||||
SUBDIRS = ARM7 ARM9
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user