(更新:Akabane Jumpei)

カードリードをDMAコピーを使うか、CPUコピーを使うか、ビルドスイッチで切替えられるように修正。
デフォルトではCPUコピーを使う。

ビルドスイッチ:#define USE_CPU_COPY

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1380 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-05-16 08:48:21 +00:00
parent ede8793629
commit 2afda414e8
4 changed files with 129 additions and 32 deletions

View File

@ -76,10 +76,12 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE)
HotSwState ReadIDNormal(CardBootData *cbd)
{
GCDCmd64 cndLE;
#ifndef USE_CPU_COPY
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_ID;
@ -91,10 +93,17 @@ HotSwState ReadIDNormal(CardBootData *cbd)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK);
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_nml = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;
}
@ -114,6 +123,10 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
u64 page = 0;
GCDCmd64 cndLE;
#ifdef USE_CPU_COPY
u32 j = 0;
#endif
if(cbd->cardType == DS_CARD_TYPE_1){
loop = 0x1UL;
pc = 0x4UL;
@ -137,6 +150,7 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
if(cbd->modeType == HOTSW_MODE1){
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
@ -146,7 +160,8 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
// Mode2のときは、データを捨てる。
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, size );
}
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_PAGE;
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
@ -160,9 +175,20 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
if(cbd->modeType == HOTSW_MODE1){
*(dst + j++) = reg_HOTSW_MCD1;
}
else{
temp = reg_HOTSW_MCD1;
}
}
#endif
page++;
}
@ -185,9 +211,11 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_STAT;
@ -200,8 +228,15 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT;
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->romStatus = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;
}
@ -306,9 +341,11 @@ HotSwState LoadTable(void)
{
GCDCmd64 cndLE;
u32 temp;
#ifndef USE_CPU_COPY
// NewDMA転送読み捨ての準備
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_LD_TABLE;
@ -321,9 +358,16 @@ HotSwState LoadTable(void)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16 | LATENCY2_MASK & (0x18 << LATENCY2_SHIFT);
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;
}
@ -471,18 +515,27 @@ HotSwState ReadIDSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask);
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf, sizeof(buf) );
#endif
// 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_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*buf = reg_HOTSW_MCD1;
}
#endif
// コマンドカウンタインクリメント
cbd->vbi++;
@ -536,20 +589,29 @@ HotSwState ReadSegSecure(CardBootData *cbd)
PreSendSecureCommand(cbd, &scrambleMask);
for(k=0; k<loop; k++){
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
#endif
// 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;
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
// 転送済みページ数
j++;
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*(buf + j++) = reg_HOTSW_MCD1;
}
#endif
}
// 読み込みセグメント番号インクリメント
@ -694,10 +756,12 @@ HotSwState ReadIDGame(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_G_OP_RD_ID;
@ -709,12 +773,15 @@ HotSwState ReadIDGame(CardBootData *cbd)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT;
#ifndef USE_CPU_COPY
// メッセージ受信
#ifndef USE_WRAM_LOAD
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_gam = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;
@ -743,9 +810,11 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
// コマンド作成
cndLE.dw = HSWOP_G_OP_RD_PAGE;
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
@ -758,12 +827,15 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1;
#ifndef USE_CPU_COPY
// メッセージ受信
#ifndef USE_WRAM_LOAD
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
}
#endif
}
@ -783,10 +855,12 @@ HotSwState ReadStatusGame(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_G_OP_RD_STAT;
@ -799,11 +873,14 @@ HotSwState ReadStatusGame(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT;
#ifndef USE_CPU_COPY
// メッセージ受信
#ifndef USE_WRAM_LOAD
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->romStatus = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;

View File

@ -2397,10 +2397,12 @@ static void SetInterrupt(void)
#ifndef DEBUG_USED_CARD_SLOT_B_
SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard );
SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet );
(void)OS_EnableIrqMask(OS_IE_NDMA2);
#else
SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard );
SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet );
#endif
#ifndef USE_CPU_COPY
(void)OS_EnableIrqMask(OS_IE_NDMA2);
#endif
}

View File

@ -65,10 +65,12 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_ID;
@ -81,9 +83,15 @@ 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);
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
cbd->id_scr = reg_HOTSW_MCD1;
}
#endif
return HOTSW_SUCCESS;
}
@ -103,10 +111,12 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_PAGE;
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
@ -120,8 +130,15 @@ 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);
#ifndef USE_CPU_COPY
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*((u32 *)cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
}
#endif
page++;
}

View File

@ -25,6 +25,7 @@ extern "C" {
#define SYSM_HOTSW_ENABLE_ROMEMU
#define USE_WRAM_LOAD
#define USE_CPU_COPY
// enum -------------------------------------------------------------------
// スレッドに送るメッセージのステート