(更新:Akabane Jumpei)

・符号生成回路初期化をRomHeaderのデバイスタイプを見て設定するように修正
・DMAとカードのデータ転送終了を待つインライン関数を追加
・ソースの整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080312_hotsw@868 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-03-12 06:58:03 +00:00
parent f85716dd96
commit 28a0a22b9a
7 changed files with 191 additions and 126 deletions

View File

@ -22,7 +22,7 @@ extern "C" {
#endif
/*************************************************************************/
extern BLOWFISH_CTX GCDi_BlowfishInitTableBufDS;
extern BLOWFISH_CTX HotSwBlowfishInitTableBufDS;
// Function Prototype ------------------------------------------------------------------------
// Blowfish <20>‰Šú‰»

View File

@ -7,6 +7,21 @@
extern "C" {
#endif
static inline void HOTSW_WaitCardCtrl(void)
{
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){
// OS_PutString("Card is busy..\n");
}
}
static inline void HOTSW_WaitDmaCtrl(u32 ndmaNo)
{
while( MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) & MI_NDMA_ENABLE_MASK ){
// OS_PutString("Dma is busy..\n");
}
}
// ===========================================================================
// Function Describe
// ===========================================================================

View File

@ -16,6 +16,7 @@
#include <twl.h>
#include <twl/os/common/format_rom.h>
#include <sysmenu.h>
#include <firm/gcd/blowfish.h>
#include "romSpec.h"
#ifdef __cplusplus
@ -48,10 +49,6 @@ extern "C" {
#define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ
#define PNA_BASE_VALUE 0x60e8 //
#define PNB_L_VALUE 0x879b9b05 //
#define PNB_H_VALUE 0x5c //
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
#define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
@ -108,6 +105,17 @@ extern "C" {
#define SCRAMBLE_MASK 0x1840e000
#define SECURE_COMMAND_SCRAMBLE_MASK 0x00406000 // CS SE DSのマスク
// Page Count
#define HOTSW_PAGE_0 0x0UL << PC_SHIFT
#define HOTSW_PAGE_1 0x1UL << PC_SHIFT
#define HOTSW_PAGE_2 0x2UL << PC_SHIFT
#define HOTSW_PAGE_4 0x3UL << PC_SHIFT
#define HOTSW_PAGE_8 0x4UL << PC_SHIFT
#define HOTSW_PAGE_16 0x5UL << PC_SHIFT
#define HOTSW_PAGE_32 0x6UL << PC_SHIFT
#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT
#define AddLatency2ToLatency1(param)\
( (((param) & LATENCY2_MASK) \
>> LATENCY2_SHIFT) \
@ -235,15 +243,13 @@ typedef union BootSegmentData
} BootSegmentData;
// struct -------------------------------------------------------------------
typedef struct BLOWFISH_CTX{
/*typedef struct BLOWFISH_CTX{
u32 P[16 + 2];
u32 S[4][256];
} BLOWFISH_CTX;
} BLOWFISH_CTX;*/
// カードブート時に必要な変数一式をまとめた構造体
typedef struct CardBootData{
u16 lockID;
u32 vae;
u32 vbi;
u32 vd;
@ -253,11 +259,6 @@ typedef struct CardBootData{
u32 id_scr2;
u32 id_gam;
u32 arm9StcSize;
u32 arm7StcSize;
u32 arm9LtdSize;
u32 arm7LtdSize;
u32 arm9Stc;
u32 arm7Stc;
u32 arm9Ltd;
@ -270,9 +271,11 @@ typedef struct CardBootData{
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
u32 keyBuf[KEY_BUF_SIZE];
u32 keyBuf2[KEY_BUF_SIZE];
CardTypeEx cardType;
ModeType modeType;
RomMode romMode;
u32 secureLatency;
u32 gameCommondParam;

View File

@ -26,7 +26,7 @@ static u32 F(const BLOWFISH_CTX *ctx, u32 x);
//*****************************************
void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen)
{
const BLOWFISH_CTX *initTable = &GCDi_BlowfishInitTableBufDS;
const BLOWFISH_CTX *initTable = &HotSwBlowfishInitTableBufDS;
u32 blowfishedKey[2];

View File

@ -7,18 +7,13 @@
#include <hotswTypes.h>
#include <customNDma.h>
// Define data --------------------------------------------------------------
#define NDMA_BLOCK_WORD_COUNT_1 0x0
#define NDMA_NO_INTERVAL_NORMAL_SCALE 0x0
#define NDMA_TOTAL_WORD_COUNT_1 0x1
#define NDMA_WORD_COUNT_1 0x1
#define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." );
// Function prototype -------------------------------------------------------
static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont);
// ===========================================================================
// Function Describe
// ===========================================================================
@ -50,23 +45,21 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
ASSERT_DMANO( ndmaNo );
//---- confirm CARD free
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
HOTSW_WaitCardCtrl();
//---- confirm DMA free
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){
OS_TPrintf("Dma is busy..\n");
}
HOTSW_WaitDmaCtrl(ndmaNo);
//---- set up registers
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_DAD_WOFFSET ) = (u32)dest;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = MI_NDMA_INTERVAL_PS_1;
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_TCNT_WOFFSET ) = (u32)(size/4);
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1;
//---- decide control register
contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE;
contData |= (MI_NDMA_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE);
contData = MI_NDMA_BWORD_1 | MI_NDMA_ENABLE/* | MI_NDMA_CONTINUOUS_ON*/;
contData |= MI_NDMA_SRC_FIX | dcont | MI_NDMA_SRC_RELOAD_DISABLE | MI_NDMA_DEST_RELOAD_DISABLE;
#ifndef DEBUG_USED_CARD_SLOT_B_
contData |= MI_NDMA_TIMING_CARD_A;
#else

View File

@ -10,7 +10,7 @@
#include <customNDma.h>
// extern -------------------------------------------------------------------
extern CardThreadData s_ctData;
extern CardThreadData HotSwThreadData;
// define -------------------------------------------------------------------
#define SECURE_SEGMENT_NUM 4
@ -75,17 +75,17 @@ HotSwState ReadIDNormal(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK);
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
return HOTSW_SUCCESS;
}
@ -146,14 +146,17 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
page++;
}
@ -186,17 +189,17 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
return HOTSW_SUCCESS;
}
@ -221,10 +224,14 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0;
while(reg_HOTSW_MCCNT1 & START_MASK){}
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
return HOTSW_SUCCESS;
}
@ -271,10 +278,14 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
while(reg_HOTSW_MCCNT1 & START_MASK){}
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0;
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
return HOTSW_SUCCESS;
}
@ -302,17 +313,17 @@ HotSwState LoadTable(void)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
return HOTSW_SUCCESS;
}
@ -338,8 +349,11 @@ HotSwState ReadRomEmulationData(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x3e000000;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_1 | (0x5fe & LATENCY1_MASK);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
@ -415,6 +429,9 @@ static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask)
if(cbd->cardType == DS_CARD_TYPE_2){
u32 latency = (u32)cbd->pBootSegBuf->rh.s.secure_cmd_latency * 0x100;
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | *scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
@ -454,15 +471,18 @@ HotSwState ReadIDSecure(CardBootData *cbd)
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
// 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 & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
// コマンドカウンタインクリメント
cbd->vbi++;
@ -519,14 +539,17 @@ HotSwState ReadSegSecure(CardBootData *cbd)
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
// 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;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
// 転送済みページ数
j++;
@ -564,10 +587,14 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
while(reg_HOTSW_MCCNT1 & START_MASK){}
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
// コマンドカウンタインクリメント
cbd->vbi++;
@ -597,10 +624,14 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
while(reg_HOTSW_MCCNT1 & START_MASK){}
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
// コマンドカウンタインクリメント
cbd->vbi++;
@ -632,10 +663,14 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
while(reg_HOTSW_MCCNT1 & START_MASK){}
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
// コマンドカウンタインクリメント
cbd->vbi++;
@ -669,14 +704,17 @@ HotSwState ReadIDGame(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
return HOTSW_SUCCESS;
}
@ -713,14 +751,17 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
}
return HOTSW_SUCCESS;
@ -748,14 +789,17 @@ HotSwState ReadStatusGame(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
return HOTSW_SUCCESS;
}
@ -779,10 +823,14 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd)
// 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));
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_0;
while(reg_HOTSW_MCCNT1 & START_MASK){}
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
return HOTSW_SUCCESS;
}

View File

@ -149,8 +149,8 @@ static CardBootFunction s_funcTable[] = {
};
// Global Values ------------------------------------------------------------
BLOWFISH_CTX GCDi_BlowfishInitTableBufDS;
CardThreadData s_ctData;
BLOWFISH_CTX HotSwBlowfishInitTableBufDS;
CardThreadData HotSwThreadData;
#include <twl/ltdwram_end.h>
@ -169,7 +169,7 @@ void HOTSW_Init(u32 threadPrio)
#ifndef USE_LOCAL_KEYTABLE
// 初期化後に他の用途でWRAM_0を使用できるようにローカルバッファへコピーしておく
MI_CpuCopyFast((void *)HW_WRAM_0_LTD, &GCDi_BlowfishInitTableBufDS, sizeof(BLOWFISH_CTX));
MI_CpuCopyFast((void *)HW_WRAM_0_LTD, &HotSwBlowfishInitTableBufDS, sizeof(BLOWFISH_CTX));
#endif
// PXI初期化
PXI_Init();
@ -198,7 +198,7 @@ void HOTSW_Init(u32 threadPrio)
MI_CpuClear8(&s_cbData, sizeof(CardBootData));
// カードスレッド用構造体の初期化
MI_CpuClear8(&s_ctData, sizeof(CardThreadData));
MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData));
// HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける)
{
@ -217,22 +217,22 @@ void HOTSW_Init(u32 threadPrio)
}
// カードブート用スレッドの生成
OS_CreateThread(&s_ctData.thread,
OS_CreateThread(&HotSwThreadData.thread,
McThread,
NULL,
s_ctData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64),
HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64),
HOTSW_THREAD_STACK_SIZE,
threadPrio
);
// メッセージキューの初期化
OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM );
OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM );
// メッセージキューの初期化
OS_InitMessageQueue( &s_ctData.hotswDmaQueue, &s_ctData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM );
OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM );
// スレッド起動
OS_WakeupThreadDirect(&s_ctData.thread);
OS_WakeupThreadDirect(&HotSwThreadData.thread);
// Boot Segment バッファの設定
HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE );
@ -246,10 +246,10 @@ void HOTSW_Init(u32 threadPrio)
// カードが挿さってあったらスレッドを起動する
if(HOTSW_IsCardExist()){
// メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
}
else{
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
@ -295,6 +295,8 @@ static HotSwState LoadCardData(void)
// ロード処理開始
if(HOTSW_IsCardAccessible()){
s_cbData.modeType = HOTSW_MODE1;
// カード側でKey Tableをロードする
state = LoadTable();
retval = (retval == HOTSW_SUCCESS) ? state : retval;
@ -302,13 +304,6 @@ static HotSwState LoadCardData(void)
// ---------------------- Normal Mode ----------------------
romMode = HOTSW_ROM_MODE_NORMAL;
// カードID読み込み
state = ReadIDNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1;
{
u8 i;
u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf;
@ -317,8 +312,15 @@ static HotSwState LoadCardData(void)
LockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
// Boot Segment読み込み
state = s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
state = ReadBootSegNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードID読み込み
state = ReadIDNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
s_cbData.cardType = (s_cbData.id_nml & HOTSW_ROMID_1TROM_MASK) ? DS_CARD_TYPE_2 : DS_CARD_TYPE_1;
// Romエミュレーション情報を取得
state = ReadRomEmulationData(&s_cbData);
@ -357,7 +359,7 @@ static HotSwState LoadCardData(void)
if( retval == HOTSW_SUCCESS ) {
// NTRカードかTWLカードか
#ifdef DEBUG_MODE
if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset)
if(s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset && s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset && (s_cbData.id_nml & HOTSW_ROMID_TWLROM_MASK))
#else
if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02)
#endif
@ -464,10 +466,10 @@ end:
}
// カードDMA終了確認
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
// カードアクセス終了確認
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
HOTSW_WaitCardCtrl();
// カードのロック開放(※ロックIDは開放せずに持ち続ける)
#ifndef DEBUG_USED_CARD_SLOT_B_
@ -1084,24 +1086,28 @@ static void McPowerOff(void)
Description:
sPNG_ONコマンドを実行してから呼び出してください
sPNG_ONコマンドを実行してから呼び出してください
*---------------------------------------------------------------------------*/
static void SetMCSCR(void)
{
u32 pna_l = (u32)(PNA_BASE_VALUE | (s_cbData.vd << 15));
u32 pna_h = (u32)(s_cbData.vd >> 17);
static u32 pnbL = 0x879b9b05;
static u8 pnbH = 0x5c;
static u8 pnaL1 = 0x60;
static u8 pnaL0Table[8] = { 0xe8, 0x4d, 0x5a, 0xb1, 0x17, 0x8f, 0x99, 0xd5 };
u32 pnaL = s_cbData.vd << 15 | pnaL1 << 8 | pnaL0Table[(s_cbData.pBootSegBuf->rh.s.rom_type & 0x7)];
u8 pnaH = (u8)((s_cbData.vd >> 17) & 0x7f);
// SCR A
reg_HOTSW_MCSCR0 = pna_l;
reg_HOTSW_MCSCR0 = pnaL;
// SCR B
reg_HOTSW_MCSCR1 = PNB_L_VALUE;
reg_HOTSW_MCSCR1 = pnbL;
// [d0 -d6 ] -> SCR A
// [d16-d22] -> SCR B
reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
reg_HOTSW_MCSCR2 = (u32)(pnaH | pnbH << 16);
// MCCNT1 レジスタ設定 (SCR = 1に)
reg_HOTSW_MCCNT1 = SCR_MASK;
}
@ -1122,7 +1128,7 @@ static void McThread(void *arg)
HotSwMessage *msg;
while(1){
OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
if( msg->ctrl == TRUE ) {
// [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。
@ -1231,15 +1237,15 @@ static void McThread(void *arg)
*---------------------------------------------------------------------------*/
static void InterruptCallbackCard(void)
{
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].ctrl = FALSE;
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].value = 0;
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLOUT;
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE;
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0;
HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT;
// メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK);
OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM;
OS_PutString("\n");
}
@ -1251,15 +1257,15 @@ static void InterruptCallbackCard(void)
*---------------------------------------------------------------------------*/
static void InterruptCallbackCardDet(void)
{
s_ctData.hotswInsertMsg[s_ctData.idx_insert].ctrl = FALSE;
s_ctData.hotswInsertMsg[s_ctData.idx_insert].value = 0;
s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT;
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE;
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0;
HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT;
// メッセージ送信
OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK);
OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM;
OS_PutString("\n");
}
@ -1272,10 +1278,10 @@ static void InterruptCallbackCardDet(void)
static void InterruptCallbackNDma(void)
{
// メッセージ送信
// OS_SendMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_ctData.hotswDmaMsg[s_ctData.idx_dma], OS_MESSAGE_NOBLOCK);
// OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
// s_ctData.idx_dma = (s_ctData.idx_dma+1) % HOTSW_DMA_MSG_NUM;
// HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM;
OS_PutString("\n");
}
@ -1293,15 +1299,15 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
d.data = data;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].value = d.msg.value;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].type = HOTSW_CONTROL;
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_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPxiMsg[s_ctData.idx_ctrl], OS_MESSAGE_NOBLOCK);
OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
s_ctData.idx_ctrl = (s_ctData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM;
HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM;
}
/*---------------------------------------------------------------------------*