mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
593d57c2ec
commit
292175768e
@ -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" */
|
||||
|
||||
@ -36,6 +36,7 @@ extern "C" {
|
||||
|
||||
// --- NewDMA Ch
|
||||
#define HOTSW_NDMA_NO 2
|
||||
#define HOTSW_DMA_NO 3
|
||||
|
||||
// --- Blowfish
|
||||
#define KEY_BUF_SIZE 3
|
||||
|
||||
@ -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
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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++;
|
||||
}
|
||||
|
||||
@ -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)){}
|
||||
|
||||
@ -25,7 +25,7 @@ extern "C" {
|
||||
|
||||
#define SYSM_HOTSW_ENABLE_ROMEMU
|
||||
#define USE_WRAM_LOAD
|
||||
#define USE_CPU_COPY
|
||||
//#define USE_NEW_DMA
|
||||
|
||||
// enum -------------------------------------------------------------------
|
||||
// スレッドに送るメッセージのステート
|
||||
|
||||
Loading…
Reference in New Issue
Block a user