(更新:Akabane Jumpei)

・ビルドスイッチで、カードデータ転送で使うDMAを、新DMA,旧DMA切替えられるように修正
デフォルトでは旧DMAを使うようになっている

ビルドスイッチ:#define USE_NEW_DMA

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1441 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-05-21 07:36:17 +00:00
parent 593d57c2ec
commit 292175768e
8 changed files with 350 additions and 151 deletions

View File

@ -1,3 +1,15 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - HOTSW - include
File: customNDma.h
Copyright 2007-2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
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.
*---------------------------------------------------------------------------*/
#ifndef __HOTSW_CUSTOM_NDMA_H__
#define __HOTSW_CUSTOM_NDMA_H__
@ -13,17 +25,30 @@ static inline void HOTSW_WaitCardCtrl(void)
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
}
static inline void HOTSW_WaitDmaCtrl(u32 ndmaNo)
#ifdef USE_NEW_DMA
static inline void HOTSW_WaitNDmaCtrl(u32 ndmaNo)
{
while( MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) & MI_NDMA_ENABLE_MASK ){}
}
#else
static inline void HOTSW_WaitDmaCtrl(u32 dmaNo)
{
while( MI_DMA_REG( dmaNo, MI_DMA_REG_CNT_WOFFSET ) & MI_DMA_ENABLE ){}
}
#endif
// ===========================================================================
// Function Describe
// ===========================================================================
// カード
#ifdef USE_NEW_DMA
// New DMA
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size);
void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size);
#else
// Old DMA
void HOTSW_DmaCopy32_Card(u32 dmaNo, const void *src, void *dest, u32 size);
void HOTSW_DmaPipe32_Card(u32 dmaNo, const void *src, void *dest, u32 size);
#endif
#ifdef __cplusplus
} /* extern "C" */

View File

@ -36,6 +36,7 @@ extern "C" {
// --- NewDMA Ch
#define HOTSW_NDMA_NO 2
#define HOTSW_DMA_NO 3
// --- Blowfish
#define KEY_BUF_SIZE 3

View File

@ -15,16 +15,43 @@
#include <hotswTypes.h>
#include <customNDma.h>
// Define data --------------------------------------------------------------
#define NDMA_WORD_COUNT_1 0x1
#define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." );
// Extern -------------------------------------------------------------------
extern CardThreadData HotSwThreadData;
// union --------------------------------------------------------------------
#ifndef USE_NEW_DMA
typedef union
{
u32 b32;
u16 b16;
}
MIiDmaClearSrc;
#endif
// Define data --------------------------------------------------------------
#ifndef USE_NEW_DMA
#define NDMA_WORD_COUNT_1 0x1
#define ASSERT_NDMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." );
#define ASSERT_DMANO( dmaNo ) SDK_ASSERTMSG( (dmaNo) <= MI_DMA_MAX_NUM, "illegal DMA No." );
#define MIi_DMA_MODE_NOINT 1
#define MIi_DMA_MODE_WAIT 2
#define MIi_DMA_MODE_NOCLEAR 4
#define MIi_DMA_MODE_SRC32 0x10
#define MIi_DMA_MODE_SRC16 0x20
#define MIi_DMA_CLEAR_DATA_BUF HW_PRV_WRAM_DMA_CLEAR_DATA_BUF
#endif
// Function prototype -------------------------------------------------------
#ifdef USE_NEW_DMA
static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont);
static void InterruptCallbackNDma(void);
#else
static void HOTSWi_DmaCopy32_Card(u32 dmaNo, const void *src, void *dest, u32 size, u32 dcont);
static void HOTSWi_DmaSetParameters(u32 dmaNo, u32 src, u32 dest, u32 ctrl, u32 mode);
#endif
// ===========================================================================
// Function Describe
@ -32,45 +59,50 @@ static void InterruptCallbackNDma(void);
/*---------------------------------------------------------------------------*
Name: HOTSW_NDmaCopy_Card
Description: DMA転送する
Description: NDMA転送する
*---------------------------------------------------------------------------*/
#ifdef USE_NEW_DMA
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size)
{
HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_INC);
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_NDmaPipe_Card
Description: DMA転送で読み捨てる
Description: NDMA転送で読み捨てる
*---------------------------------------------------------------------------*/
#ifdef USE_NEW_DMA
void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size)
{
HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX);
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSWi_NDmaCopy_Card
Description: DMA転送の準備
Description: NDMA転送の準備
DMA転送の準備をしてからstartフラグを上げてください
*---------------------------------------------------------------------------*/
#ifdef USE_NEW_DMA
static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont)
{
u32 contData;
OSIntrMode enabled = OS_DisableInterrupts();
//--- Assert
ASSERT_DMANO( ndmaNo );
ASSERT_NDMANO( ndmaNo );
//---- confirm CARD free
HOTSW_WaitCardCtrl();
//---- confirm DMA free
HOTSW_WaitDmaCtrl(ndmaNo);
HOTSW_WaitNDmaCtrl(ndmaNo);
//---- Handler Set
(void)OS_SetIrqFunction(OS_IE_NDMA2, InterruptCallbackNDma);
@ -99,6 +131,7 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
(void)OS_RestoreInterrupts( enabled );
}
#endif
/*---------------------------------------------------------------------------*
@ -106,6 +139,7 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
Description: B
*---------------------------------------------------------------------------*/
#ifdef USE_NEW_DMA
static void InterruptCallbackNDma(void)
{
// メッセージ送信
@ -114,3 +148,115 @@ static void InterruptCallbackNDma(void)
// メッセージインデックスをインクリメント
HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM;
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_DmaCopy32_Card
Description: DMA転送する
*---------------------------------------------------------------------------*/
#ifndef USE_NEW_DMA
void HOTSW_DmaCopy32_Card(u32 dmaNo, const void *src, void *dest, u32 size)
{
HOTSWi_DmaCopy32_Card(dmaNo, src, dest, size, MI_DMA_DEST_INC);
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_DmaPipe32_Card
Description: DMA転送で読み捨てる
*---------------------------------------------------------------------------*/
#ifndef USE_NEW_DMA
void HOTSW_DmaPipe32_Card(u32 dmaNo, const void *src, void *dest, u32 size)
{
HOTSWi_DmaCopy32_Card(dmaNo, src, dest, size, MI_DMA_DEST_FIX);
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_DmaCopy32_Card
Description: DMA転送の準備
DMA転送の準備をしてからstartフラグを上げてください
*---------------------------------------------------------------------------*/
#ifndef USE_NEW_DMA
static void HOTSWi_DmaCopy32_Card(u32 dmaNo, const void *src, void *dest, u32 size, u32 dcont)
{
u32 contData;
//--- Assert
ASSERT_DMANO( dmaNo );
if (size == 0)
{
return;
}
//---- confirm CARD free
HOTSW_WaitCardCtrl();
//---- confirm DMA free
HOTSW_WaitDmaCtrl(dmaNo);
//---- decide control register
contData = ( MI_DMA_ENABLE | MI_DMA_IF_ENABLE | MI_DMA_TIMING_CARD | MI_DMA_SRC_FIX | dcont | MI_DMA_CONTINUOUS_ON | MI_DMA_32BIT_BUS | 1 );
//---- parameter set
HOTSWi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, contData, 0);
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSWi_DmaSetParameters
Description: DMAのパラメータセット
*---------------------------------------------------------------------------*/
#ifndef USE_NEW_DMA
static void HOTSWi_DmaSetParameters(u32 dmaNo, u32 src, u32 dest, u32 ctrl, u32 mode)
{
OSIntrMode enabled;
vu32 *p;
if ( ! (mode & MIi_DMA_MODE_NOINT) )
{
enabled = OS_DisableInterrupts();
}
//p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12);
p = (vu32*)MI_DMA_REGADDR( dmaNo, MI_DMA_REG_SAD_WOFFSET );
if ( mode & MIi_DMA_MODE_SRC32 )
{
MIiDmaClearSrc *srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4);
srcp->b32 = src;
src = (u32)srcp;
}
else if ( mode & MIi_DMA_MODE_SRC16 )
{
MIiDmaClearSrc *srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4);
srcp->b16 = (u16)src;
src = (u32)srcp;
}
*p = (vu32)src;
*(p + 1) = (vu32)dest;
*(p + 2) = (vu32)ctrl;
if ( mode & MIi_DMA_MODE_WAIT )
{
// ARM7 must wait 2 cycle (load is 3 cycle)
u32 dummy = reg_MI_DMA0SAD;
}
if ( ! (mode & MIi_DMA_MODE_NOINT) )
{
(void)OS_RestoreInterrupts(enabled);
}
}
#endif

View File

@ -76,33 +76,32 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE)
HotSwState ReadIDNormal(CardBootData *cbd)
{
GCDCmd64 cndLE;
#ifndef USE_CPU_COPY
// カード割り込みによるDMAコピー
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_ID;
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK );
// MCCNT0 レジスタ設定
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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
// 1us Wait
OS_SpinWait( OS_USEC_TO_CPUCYC(1) );
@ -125,10 +124,6 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
u32 temp;
u64 page = 0;
GCDCmd64 cndLE;
#ifdef USE_CPU_COPY
u32 j = 0;
#endif
if(cbd->cardType == DS_CARD_TYPE_1){
loop = 0x1UL;
@ -153,17 +148,22 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
if(cbd->modeType == HOTSW_MODE1){
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
#endif
}
else{
// NewDMA転送読み捨ての準備
// Mode2のときは、データを捨てる。
// DMA転送読み捨ての準備
#ifdef USE_NEW_DMA
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, size );
}
#else
HOTSW_DmaPipe32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, size );
#endif
}
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_RD_PAGE;
@ -173,25 +173,18 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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++;
// 10us Wait
@ -217,9 +210,11 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// カード割り込みによるDMAコピー
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#endif
// リトルエンディアンで作って
@ -229,20 +224,17 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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;
}
@ -351,11 +343,13 @@ HotSwState LoadTable(void)
GCDCmd64 cndLE;
u32 temp;
#ifndef USE_CPU_COPY
// NewDMA転送読み捨ての準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
#else
HOTSW_DmaPipe32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
#endif
// リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_LD_TABLE;
@ -363,20 +357,17 @@ HotSwState LoadTable(void)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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
// 1us Wait
OS_SpinWait( OS_USEC_TO_CPUCYC(1) );
@ -527,27 +518,26 @@ HotSwState ReadIDSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask);
#ifndef USE_CPU_COPY
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf, sizeof(buf) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_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 );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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++;
@ -601,29 +591,28 @@ HotSwState ReadSegSecure(CardBootData *cbd)
PreSendSecureCommand(cbd, &scrambleMask);
for(k=0; k<loop; k++){
#ifndef USE_CPU_COPY
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_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 );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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
}
// 読み込みセグメント番号インクリメント
@ -769,9 +758,11 @@ HotSwState ReadIDGame(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
#endif
// リトルエンディアンで作って
@ -781,20 +772,17 @@ HotSwState ReadIDGame(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | 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->id_gam = reg_HOTSW_MCD1;
}
#endif
// 1us Wait
OS_SpinWait( OS_USEC_TO_CPUCYC(1) );
@ -824,10 +812,12 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
// コマンド作成
@ -838,20 +828,17 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1;
#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 *)buf + counter++) = reg_HOTSW_MCD1;
}
#endif
}
// 100ns Wait
@ -874,9 +861,11 @@ HotSwState ReadStatusGame(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
// NewDMA転送の準備
// DMA転送の準備
#ifdef USE_NEW_DMA
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
#endif
// リトルエンディアンで作って
@ -886,20 +875,17 @@ HotSwState ReadStatusGame(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | 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;
}

View File

@ -75,6 +75,9 @@ static void SetInterrupt(void);
static void InterruptCallbackCardDet(void);
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
#ifndef USE_NEW_DMA
static void InterruptCallbackCardData(void);
#endif
static void LockHotSwRsc(OSLockWord* word);
static void UnlockHotSwRsc(OSLockWord* word);
@ -562,8 +565,12 @@ finalize:
end:
// カードDMA終了確認
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
#ifdef USE_NEW_DMA
HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO);
#else
HOTSW_WaitDmaCtrl(HOTSW_DMA_NO);
#endif
// カードアクセス終了確認
HOTSW_WaitCardCtrl();
@ -1827,7 +1834,7 @@ static void FinalizeHotSw(HotSwApliType type)
}
// NANDアプリヘッダはコピー済み
if(((ROM_Header*)SYSM_APP_ROM_HEADER_BUF)->s.access_control.game_card_on){
if(((ROM_Header*)SYSM_APP_ROM_HEADER_BUF)->s.game_card_on/*access_control.game_card_on*/){
McPowerOn();
s_cbData.modeType = HOTSW_MODE2;
@ -1913,7 +1920,12 @@ static BOOL ChangeGameMode(void)
OS_TPrintf("Card Normal ID : 0x%08x\n", s_cbData.id_nml);
OS_TPrintf("Card Game ID : 0x%08x\n", s_cbData.id_gam);
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
#ifdef USE_NEW_DMA
HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO);
#else
HOTSW_WaitDmaCtrl(HOTSW_DMA_NO);
#endif
HOTSW_WaitCardCtrl();
#ifndef DEBUG_USED_CARD_SLOT_B_
@ -2163,6 +2175,26 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
}
/*---------------------------------------------------------------------------*
Name: InterruptCallbackCardData
Description: B
*---------------------------------------------------------------------------*/
#ifndef USE_NEW_DMA
static void InterruptCallbackCardData(void)
{
// DMA強制終了
MI_StopDma(HOTSW_DMA_NO);
// メッセージ送信
OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK);
// メッセージインデックスをインクリメント
HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM;
}
#endif
/*---------------------------------------------------------------------------*
Name: AllocateExCardBus
@ -2261,9 +2293,11 @@ static void SetInterrupt(void)
#else
SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet );
#endif
#ifndef USE_CPU_COPY
(void)OS_EnableIrqMask(OS_IE_NDMA2);
#ifdef USE_NEW_DMA
(void)OS_EnableIrqMask(OS_IE_NDMA2);
#else
SetInterruptCallback( OS_IE_CARD_DATA , InterruptCallbackCardData );
#endif
}

View File

@ -66,9 +66,11 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
#ifdef USE_NEW_DMA
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
#endif
// リトルエンディアンで作って
@ -78,20 +80,18 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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;
}
@ -112,9 +112,11 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR;
}
#ifndef USE_CPU_COPY
#ifdef USE_NEW_DMA
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#else
HOTSW_DmaCopy32_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
// リトルエンディアンで作って
@ -125,20 +127,17 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
#ifdef USE_NEW_DMA
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK);
#else
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
#endif
// 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

@ -19,6 +19,10 @@
#include <firm/os/common/system.h>
#include <../ARM7/include/hotswTypes.h>
#include <../ARM7/include/customNDma.h>
// Extern -------------------------------------------------------------------
extern CardThreadData HotSwThreadData;
// define -------------------------------------------------------------------
#define HOTSW_READ_MSG_NUM 1
@ -408,6 +412,10 @@ static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
u64 i, page;
GCDCmd64 cndLE, cndBE;
#ifdef USE_NEW_DMA
OSMessage msg;
#endif
page = (u32)(start_addr / PAGE_SIZE);
loop = (u32)(size / PAGE_SIZE);
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
@ -420,7 +428,7 @@ static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
return CARD_READ_MODE_ERROR;
}
#ifndef USE_CPU_COPY
#ifdef USE_NEW_DMA
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
@ -452,9 +460,9 @@ static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
// MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = SYSMi_GetWork()->gameCommondParam | START_MASK | HOTSW_PAGE_1;
#ifndef USE_CPU_COPY
#ifdef USE_NEW_DMA
// メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
#else
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}

View File

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