diff --git a/build/libraries_sysmenu/hotsw/ARM7/Makefile b/build/libraries_sysmenu/hotsw/ARM7/Makefile index 1935bdf9..6b0e2643 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/Makefile +++ b/build/libraries_sysmenu/hotsw/ARM7/Makefile @@ -29,7 +29,7 @@ TWL_PROC = ARM7 SRCDIR = ./src INCDIR = ./include -SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c +SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c customNDma.c TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h new file mode 100644 index 00000000..e2fdefaa --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h @@ -0,0 +1,20 @@ +#ifndef __CUSTOM_NDMA_H__ +#define __CUSTOM_NDMA_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// =========================================================================== +// Function Describe +// =========================================================================== +// カード +void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // __CUSTOM_NDMA_H__ \ No newline at end of file diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h index c953dcbd..766adb19 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/dsCardType2.h @@ -15,10 +15,10 @@ extern "C" { // =========================================================================== // Function Describe // =========================================================================== - +// ■ ノーマルモードのコマンド ■ +// DSカードType2のRomエミュレーションデータの読み込み void ReadRomEmulationData_DSType2(CardBootData *cbd); -// ■ ノーマルモードのコマンド ■ // DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み void ReadBootSegNormal_DSType2(CardBootData *cbd); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c new file mode 100644 index 00000000..49bca406 --- /dev/null +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: + *---------------------------------------------------------------------------*/ +#include +#include + + +// Define data -------------------------------------------------------------- +#define NDMA_BLOCK_WORD_COUNT_1 0x0 +#define NDMA_NO_INTERVAL_NORMAL_SCALE 0x0 +#define NDMA_TOTAL_WORD_COUNT_1 0x1 +#define NDMA_WORD_COUNT_1 0x1 +#define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." ); + + +// =========================================================================== +// Function Describe +// =========================================================================== + +// custom CARD DMA +void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size) +{ + u32 contData; + OSIntrMode enabled = OS_DisableInterrupts(); + + //--- Assert + ASSERT_DMANO( ndmaNo ); + + //---- confirm DMA free + while( MI_IsNDmaBusy(ndmaNo) == TRUE ){} + + //---- set up registers + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src; + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_DAD_WOFFSET ) = (u32)dest; + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE; + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_TCNT_WOFFSET ) = (u32)(size/4); + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1; + + //---- decide control register + contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE; + contData |= (MI_NDMA_SRC_FIX | MI_NDMA_DEST_INC | MI_NDMA_DEST_RELOAD_DISABLE); + contData |= MI_NDMA_TIMING_CARD_B; + + //---- set interrupt enable + contData |= MI_NDMA_IF_ENABLE; + + //---- start + MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) = contData; + + (void)OS_RestoreInterrupts( enabled ); +} diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index eef06742..bca38ece 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -1,11 +1,12 @@ /*---------------------------------------------------------------------------* Project: TwlSDK - File: + File: dsCardType1.c *---------------------------------------------------------------------------*/ #include #include #include +#include // Function prototype ------------------------------------------------------- static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); @@ -33,10 +34,9 @@ static void SetMCSCR(void); *---------------------------------------------------------------------------*/ void ReadBootSegNormal_DSType1(CardBootData *cbd) { - #pragma unused( cbd ) + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE ); - u32 i = 0; - // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x00000000; reg_HOTSW_MCCMD1 = 0x00000000; @@ -47,12 +47,9 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pBootSegBuf->word + i++) = reg_HOTSW_MCD1; - } + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); } /*---------------------------------------------------------------------------* @@ -90,11 +87,9 @@ void ChangeModeNormal_DSType1(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - } + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); } @@ -137,7 +132,7 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) break; } - // コマンドの暗号化 + // コマンドの暗号化 EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); // ビッグエンディアンに直す(暗号化後) @@ -163,6 +158,9 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadIDSecure_DSType1(CardBootData *cbd) { + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + // コマンド作成・設定 SetSecureCommand(S_RD_ID, cbd); @@ -170,12 +168,9 @@ void ReadIDSecure_DSType1(CardBootData *cbd) // (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - cbd->id_scr = reg_HOTSW_MCD1; - } + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -194,6 +189,9 @@ void ReadSegSecure_DSType1(CardBootData *cbd) GCDCmd64 cndLE, cndBE; for(i=0; i<4; i++){ + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE ); + MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); cndLE.dw = cbd->vbi; @@ -223,11 +221,8 @@ void ReadSegSecure_DSType1(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296)); - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - *(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1; - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // 読み込みセグメント番号インクリメント segNum++; @@ -251,9 +246,8 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -273,9 +267,8 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -295,9 +288,8 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -314,6 +306,9 @@ void ChangeModeSecure_DSType1(CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadIDGame_DSType1(CardBootData *cbd) { + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x000000B8; reg_HOTSW_MCCMD1 = 0x00000000; @@ -321,12 +316,9 @@ void ReadIDGame_DSType1(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 1)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - cbd->id_gam = reg_HOTSW_MCD1; - } + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); } /*---------------------------------------------------------------------------* @@ -348,6 +340,9 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size) OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; i #include #include +#include // Define Data -------------------------------------------------------------- #define SECURE_SEGMENT_NUM 4 @@ -14,7 +15,6 @@ #define ROM_EMULATION_START_OFS 0x160 #define ROM_EMULATION_END_OFS 0x180 - // Function prototype ------------------------------------------------------- static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); static void SetMCSCR(void); @@ -73,14 +73,15 @@ void ReadRomEmulationData_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadBootSegNormal_DSType2(CardBootData *cbd) { - #pragma unused( cbd ) - u32 i = 0; u32 *dst = cbd->pBootSegBuf->word; u64 page = 0; GCDCmd64 cndLE, cndBE; for(i=0; ipBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); + // ゼロクリア MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); @@ -105,13 +106,10 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - *dst++ = reg_HOTSW_MCD1; - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + page++; } } @@ -189,7 +187,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadIDSecure_DSType2(CardBootData *cbd) { - OSTick start; + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); // コマンド作成・設定 SetSecureCommand(S_RD_ID, cbd); @@ -199,8 +198,7 @@ void ReadIDSecure_DSType2(CardBootData *cbd) CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0)); // 25ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} + OS_Sleep(COMMAND_DECRYPTION_WAIT); // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; @@ -210,10 +208,8 @@ void ReadIDSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - cbd->id_scr = reg_HOTSW_MCD1; - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -229,12 +225,10 @@ void ReadIDSecure_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadSegSecure_DSType2(CardBootData *cbd) { - u32 i,j; - u32 *dst = cbd->pSecureSegBuf ; + u32 i,j=0,k; u64 segNum = 4; u64 vae = cbd->vae; GCDCmd64 cndLE, cndBE; - OSTick start; for(i=0; ipSecureSegBuf + (PAGE_WORD_SIZE * j), PAGE_SIZE ); + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; @@ -284,13 +280,13 @@ void ReadSegSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540)); - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - *dst++ = reg_HOTSW_MCD1; - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); + + // 転送済みページ数 + j++; } - + // 読み込みセグメント番号インクリメント segNum++; @@ -306,8 +302,6 @@ void ReadSegSecure_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void SwitchONPNGSecure_DSType2(CardBootData *cbd) { - OSTick start; - // コマンド作成・設定 SetSecureCommand(S_PNG_ON, cbd); @@ -318,10 +312,9 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); - // 25ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} - + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; @@ -330,7 +323,8 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -343,8 +337,6 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) { - OSTick start; - // コマンド作成・設定 SetSecureCommand(S_PNG_OFF, cbd); @@ -355,10 +347,9 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); - // 25ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} - + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; @@ -367,7 +358,8 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -380,8 +372,6 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void ChangeModeSecure_DSType2(CardBootData *cbd) { - OSTick start; - // コマンド作成・設定 SetSecureCommand(S_CHG_MODE, cbd); @@ -392,10 +382,9 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0)); - // 25ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){} - + // 25ms待ち + OS_Sleep(COMMAND_DECRYPTION_WAIT); + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x0; reg_HOTSW_MCCMD1 = 0x0; @@ -404,7 +393,8 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0)); - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){} + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); // コマンドカウンタインクリメント cbd->vbi++; @@ -429,8 +419,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd) *---------------------------------------------------------------------------*/ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size) { - u32 loop; - u32 *b = (u32 *)buf; + u32 loop, counter=0; u64 i, page; GCDCmd64 cndLE, cndBE; @@ -442,6 +431,9 @@ void ReadPageGame_DSType2(u32 start_addr, void* buf, u32 size) OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); for(i=0; i #include -//#include - #include #include #include #include #include #include +#include // define ------------------------------------------------------------------- #define STACK_SIZE 1024 // スタックサイズ #define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度 -#define ML_THREAD_PRIO 12 // Boot Segment読み込み終わったら起動する。カードブートスレッドより優先度低。 - -#define DEBUG_CARD_TYPE 1 // DS Card Type1 = 0 DS Card Type2 = 1 - #define UNDEF_CODE 0xe7ffdeff // 未定義コード #define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB @@ -44,8 +39,6 @@ static void InterruptCallbackCardDet(void); static void InterruptCallbackCardData(void); static void McThread(void *arg); -static void StaticModuleLoadThread(void *arg); -static void LoadStaticModule_Secure(void); static void McPowerOn(void); static void SetMCSCR(void); @@ -53,9 +46,6 @@ static void GenVA_VB_VD(void); static void LoadTable(void); static void ReadIDNormal(void); static void DecryptObjectFile(void); -static void ReadPageNormalFromDebugger(u32 page, void* buf); - -static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest); static void ShowRegisterData(void); static void ShowRomHeaderData(void); @@ -192,8 +182,6 @@ BOOL HOTSW_Boot(void) // ---------------------- Normal Mode ---------------------- // カードID読み込み ReadIDNormal(); - - ShowRomHeaderData(); // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM if(s_cbData.id_nml & 0x80000000){ @@ -267,9 +255,6 @@ BOOL HOTSW_Boot(void) // Secure領域のSegment読み込み s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData); - - // Arm9の常駐モジュールを指定先に転送 - LoadStaticModule_Secure(); // ゲームモードに移行 s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData); @@ -487,71 +472,26 @@ static void LoadTable(void) * * ノーマルモード時のカードIDを読み込む関数 * ----------------------------------------------------------------- */ -static void ReadIDNormal(void) +void ReadIDNormal(void) { - // MCCMD レジスタ設定 + // カード割り込みによるDMAコピー + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) ); + + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x00000090; reg_HOTSW_MCCMD1 = 0x00000000; // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に) - reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 2320)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - s_cbData.id_nml = reg_HOTSW_MCD1; - } + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 1 に) + reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 0)); + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); } - -/* ----------------------------------------------------------------- - * ReadPageNormalFromDebugger関数 - * - * Romエミュレーション情報を読む - * ----------------------------------------------------------------- */ -void ReadPageNormalFromDebugger(u32 page, void* buf) -{ - GCDCmd64 le , be; - u64 page_data = page; -// u32 i=0; - - // ゼロクリア - MI_CpuClear8(&le, sizeof(GCDCmd64)); - - // コマンド作成 - le.dw = (page_data << 33); - - // ビッグエンディアンに直す - be.b[7] = le.b[0]; - be.b[6] = le.b[1]; - be.b[5] = le.b[2]; - be.b[4] = le.b[3]; - be.b[3] = le.b[4]; - be.b[2] = le.b[5]; - be.b[1] = le.b[6]; - be.b[0] = le.b[7]; - - // MCCMD レジスタ設定 - reg_MI_MCCMD0_B = *(u32*)be.b; - reg_MI_MCCMD1_B = *(u32*)&be.b[4]; - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に) - reg_MI_MCCNT1_B = (u32)((reg_MI_MCCNT1_B & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | - CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 20)); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_MI_MCCNT1_B & START_FLG_MASK){ - while(!(reg_MI_MCCNT1_B & READY_FLG_MASK)){} - *( ((u32 *)buf)++ ) = reg_MI_MCD1_B; - } -} - - /* ----------------------------------------------------------------- * DecryptObjectFile関数 * @@ -613,7 +553,8 @@ static void DecryptObjectFile(void) } else{ OS_PutString("▼ DecryptObjectFile : Error...\n"); - // CpuClearFast32(UNDEF_CODE, pEncBuf, size); // 未定義コードでクリア + + MI_NDmaFill( HOTSW_DMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア } MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); } @@ -624,15 +565,11 @@ static void DecryptObjectFile(void) * * カードの存在判定 * - * ※SCFG_MC1のSlot モード選択フラグを見ている - * - * モード選択フラグが 10 (全ての端子から有効出力) の時ささっていると判定 - Slot A の場合 if((reg_MI_MC1 & 0x0c) == 0x08) - Slot B の場合 if((reg_MI_MC1 & 0xc0) == 0x80) + * ※SCFG_MC1のCDETフラグを見ている * ----------------------------------------------------------------- */ static BOOL IsCardExist(void) { - if((reg_MI_MC1 & SLOT_STATUS_MODE_SELECT_MSK) == SLOT_STATUS_MODE_10){ + if(!(reg_MI_MC1 & SLOT_STATUS_CDET_MSK)){ return TRUE; } else{ @@ -655,71 +592,36 @@ static void McThread(void *arg) } } -/* ----------------------------------------------------------------- - * StaticModuleLoadThread 関数 - * ----------------------------------------------------------------- */ -static void StaticModuleLoadThread(void *arg) -{ - #pragma unused( arg ) - - while(1){ - OS_SleepThread(NULL); - - - } -} - -static void LoadStaticModule_Secure(void) -{ - if(s_cbData.pBootSegBuf->rh.s.main_size >= SECURE_SEGMENT_SIZE){ - MI_DmaCopy32(1, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_ram_address, SECURE_SEGMENT_SIZE); - } - else{ - MI_DmaCopy32(1, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_ram_address, s_cbData.pBootSegBuf->rh.s.main_size); - } -} - /* ----------------------------------------------------------------- * McPowerOn関数 * ----------------------------------------------------------------- */ static void McPowerOn(void) { - OSTick start; - // SCFG_MC1 の Slot Status の M1,M0 を 11 にする reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | 0xc0); // 10ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){} + OS_Sleep(10); - // SCFG_MC1 の Slot Status の M1,M0 を 00 にする reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | 0x00); // 10ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){} + OS_Sleep(10); - // SCFG_MC1 の Slot Status の M1,M0 を 01 にする reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_01); // 10ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){} + OS_Sleep(10); - // SCFG_MC1 の Slot Status の M1,M0 を 10 にする reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_10); // 10ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){} + OS_Sleep(10); - // リセットをhighに (RESB = 1にする) reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) | - CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0)); + CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0)); // 10ms待ち - start = OS_GetTick(); - while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 10){} + OS_Sleep(10); OS_TPrintf("MC Power ON\n"); } @@ -801,8 +703,11 @@ static void InterruptCallbackCardDet(void) // カードB データ転送終了 static void InterruptCallbackCardData(void) { + // データ転送終了待ちまで寝ていたのを起こす + OS_WakeupThreadDirect(&s_MCThread); + #ifdef USE_SLOT_A - OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA); + OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA); #else OS_SetIrqCheckFlagEx(OS_IE_CARD_B_DATA); #endif @@ -858,7 +763,7 @@ static void SetInterrupt(void) *---------------------------------------------------------------------------*/ static void ShowRomHeaderData(void) { - OS_TPrintf("Debug Data -------------------------------\n"); + OS_TPrintf("\nDebug Data -------------------------------\n"); OS_TPrintf("1. Normal Mode ID : 0x%08x\n" , s_cbData.id_nml); OS_TPrintf("2. Secure Mode ID : 0x%08x\n" , s_cbData.id_scr); OS_TPrintf("3. Game Mode ID : 0x%08x\n" , s_cbData.id_gam); @@ -877,6 +782,7 @@ static void ShowRomHeaderData(void) OS_TPrintf("sub entry addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_entry_address); OS_TPrintf("sub ram addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ram_address); OS_TPrintf("sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_size); + OS_TPrintf("------------------------------------------\n\n"); } /*---------------------------------------------------------------------------*