From 292175768e887b6dc69336d325d03ffa9630f5c9 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 21 May 2008 07:36:17 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E3=83=93=E3=83=AB=E3=83=89=E3=82=B9=E3=82=A4=E3=83=83?= =?UTF-8?q?=E3=83=81=E3=81=A7=E3=80=81=E3=82=AB=E3=83=BC=E3=83=89=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E8=BB=A2=E9=80=81=E3=81=A7=E4=BD=BF=E3=81=86?= =?UTF-8?q?DMA=E3=82=92=E3=80=81=E6=96=B0DMA,=E6=97=A7DMA=E5=88=87?= =?UTF-8?q?=E6=9B=BF=E3=81=88=E3=82=89=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3=20=E3=83=87=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=88=E3=81=A7=E3=81=AF=E6=97=A7DMA=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ビルドスイッチ:#define USE_NEW_DMA git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1441 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/customNDma.h | 29 ++- .../hotsw/ARM7/include/hotswTypes.h | 1 + .../hotsw/ARM7/src/customNDma.c | 166 +++++++++++++- .../hotsw/ARM7/src/dsCardCommon.c | 206 ++++++++---------- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 48 +++- .../hotsw/ARM7/src/romEmulation.c | 35 ++- .../hotsw/ARM9/src/hotsw_ctrl.c | 14 +- include/sysmenu/hotsw/common/hotsw.h | 2 +- 8 files changed, 350 insertions(+), 151 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h index 5af0facb..18a6d088 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h @@ -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 // =========================================================================== -// J[h +#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" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 07f4af35..38092ec1 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -36,6 +36,7 @@ extern "C" { // --- NewDMA Ch #define HOTSW_NDMA_NO 2 +#define HOTSW_DMA_NO 3 // --- Blowfish #define KEY_BUF_SIZE 3 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index 93621480..7c534867 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -15,16 +15,43 @@ #include #include -// 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: J[h瑗Ăf[^wAhXDMA] + Description: J[h瑗Ăf[^wAhXNDMA] *---------------------------------------------------------------------------*/ +#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: J[h瑗Ăf[^wAhXDMA]œǂݎ̂Ă + Description: J[h瑗Ăf[^wAhXNDMA]œǂݎ̂Ă *---------------------------------------------------------------------------*/ +#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]̏ Fɂ̊֐DMA]̏ĂAJ[hWX^starttOグĂ *---------------------------------------------------------------------------*/ +#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: J[hB f[^]I荞݃nh *---------------------------------------------------------------------------*/ +#ifdef USE_NEW_DMA static void InterruptCallbackNDma(void) { // bZ[WM @@ -114,3 +148,115 @@ static void InterruptCallbackNDma(void) // bZ[WCfbNXCNg HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM; } +#endif + + +/*---------------------------------------------------------------------------* + Name: HOTSW_DmaCopy32_Card + + Description: J[h瑗Ăf[^wAhXDMA] + *---------------------------------------------------------------------------*/ +#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: J[h瑗Ăf[^wAhXDMA]œǂݎ̂Ă + *---------------------------------------------------------------------------*/ +#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]̏ + + Fɂ̊֐DMA]̏ĂAJ[hWX^starttOグĂ + *---------------------------------------------------------------------------*/ +#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: DMÃp[^Zbg + *---------------------------------------------------------------------------*/ +#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 \ No newline at end of file diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index c200d8fd..aa29e2b4 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -76,33 +76,32 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE) HotSwState ReadIDNormal(CardBootData *cbd) { GCDCmd64 cndLE; - -#ifndef USE_CPU_COPY - // J[h荞݂ɂDMARs[ + + // 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 - + // gGfBAō cndLE.dw = HSWOP_N_OP_RD_ID; // MCCMD WX^ݒ HOTSWi_SetCommand(&cndLE); - // MCCNT0 WX^ݒ - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK ); + // MCCNT0 WX^ݒ +#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 WX^ݒ reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK); -#ifndef USE_CPU_COPY // bZ[WM 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]iǂݎ̂āj̏ - // Mode2̂Ƃ́Af[^̂ĂB + // DMA]iǂݎ̂āj̏ +#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 + } // gGfBAō cndLE.dw = HSWOP_N_OP_RD_PAGE; @@ -173,25 +173,18 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; -#ifndef USE_CPU_COPY - // bZ[WM + // bZ[WM 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 - // J[h荞݂ɂDMARs[ + // 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 // gGfBAō @@ -229,20 +224,17 @@ HotSwState ReadStatusNormal(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT; -#ifndef USE_CPU_COPY // bZ[WM 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]iǂݎ̂āj̏ + // 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 - + // gGfBAō cndLE.dw = HSWOP_N_OP_LD_TABLE; @@ -363,20 +357,17 @@ HotSwState LoadTable(void) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ +#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 WX^ݒ reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16 | LATENCY2_MASK & (0x18 << LATENCY2_SHIFT); -#ifndef USE_CPU_COPY // bZ[WM 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) // R}h񑗐MiNTR-MROM̓CeVNbNݒύX̂݁j 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 WX^ݒ - 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 WX^ݒ reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; -#ifndef USE_CPU_COPY // bZ[WM 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 - + // R}hJE^CNg cbd->vbi++; @@ -601,29 +591,28 @@ HotSwState ReadSegSecure(CardBootData *cbd) PreSendSecureCommand(cbd, &scrambleMask); for(k=0; kpBootSegBuf->rh.s.secure_cmd_param; -#ifndef USE_CPU_COPY // bZ[WM OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // ]ς݃y[W j++; -#else - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - *(buf + j++) = reg_HOTSW_MCD1; - } -#endif } // ǂݍ݃ZOgԍCNg @@ -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 // gGfBAō @@ -781,20 +772,17 @@ HotSwState ReadIDGame(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; -#ifndef USE_CPU_COPY // bZ[WM 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 // R}h쐬 @@ -838,20 +828,17 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1; -#ifndef USE_CPU_COPY - // bZ[WM + // bZ[WM 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 // gGfBAō @@ -886,20 +875,17 @@ HotSwState ReadStatusGame(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ (START = 1 W/R = 0 PC = 111(Xe[^X[h) ̑Romwb_̏ɂ܂) reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; -#ifndef USE_CPU_COPY // bZ[WM 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; } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 5122fce4..ba0c0e49 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -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: // J[hDMAImF - HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); - +#ifdef USE_NEW_DMA + HOTSW_WaitNDmaCtrl(HOTSW_NDMA_NO); +#else + HOTSW_WaitDmaCtrl(HOTSW_DMA_NO); +#endif + // J[hANZXImF HOTSW_WaitCardCtrl(); @@ -1827,7 +1834,7 @@ static void FinalizeHotSw(HotSwApliType type) } // NANDAvwb_̓Rs[ς - 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: J[hB f[^]I荞݃nh + *---------------------------------------------------------------------------*/ +#ifndef USE_NEW_DMA +static void InterruptCallbackCardData(void) +{ + // DMAI + MI_StopDma(HOTSW_DMA_NO); + + // bZ[WM + OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK); + + // bZ[WCfbNXCNg + 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 } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index 46bcaa4f..f8546a32 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -66,9 +66,11 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) return HOTSW_PULLED_OUT_ERROR; } -#ifndef USE_CPU_COPY +#ifdef USE_NEW_DMA // J[h荞݂ɂDMARs[ 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 // gGfBAō @@ -78,20 +80,18 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ (START = 1 PC = 111(Xe[^X[h) latency1 = 1 ) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); -#ifndef USE_CPU_COPY // bZ[WM 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 // gGfBAō @@ -125,20 +127,17 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT0 WX^ݒ - 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 WX^ݒ (START = 1 PC_MASK PC = 001(1y[W[h) latency1 = 0xd) reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK); -#ifndef USE_CPU_COPY // bZ[WM 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++; } diff --git a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c index 48d4af6b..e2d2f68c 100644 --- a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c +++ b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c @@ -19,6 +19,10 @@ #include #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 WX^ݒ reg_HOTSW_MCCNT1 = SYSMi_GetWork()->gameCommondParam | START_MASK | HOTSW_PAGE_1; -#ifndef USE_CPU_COPY +#ifdef USE_NEW_DMA // bZ[WM - 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)){} diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 8e3c067a..8b2c0987 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -25,7 +25,7 @@ extern "C" { #define SYSM_HOTSW_ENABLE_ROMEMU #define USE_WRAM_LOAD -#define USE_CPU_COPY +//#define USE_NEW_DMA // enum ------------------------------------------------------------------- // Xbhɑ郁bZ[W̃Xe[g