From 53335a137a0eb380d54700a8f786900578408548 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Sat, 8 Mar 2008 10:48:12 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BB=E3=82=AB=E3=83=BC=E3=83=89=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E8=BB=A2=E9=80=81=E7=B5=82=E4=BA=86=E5=89=B2=E3=82=8A=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=81=A7=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89=E3=82=92?= =?UTF-8?q?=E8=B5=B7=E3=81=93=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=82=92=E3=80=81DMA=E3=83=87=E3=83=BC=E3=82=BF=E8=BB=A2?= =?UTF-8?q?=E9=80=81=E7=B5=82=E4=BA=86=E5=89=B2=E3=82=8A=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=81=A7=E8=B5=B7=E3=81=93=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E4=B8=AD=E3=80=82(=E4=BB=8A=E3=81=AE?= =?UTF-8?q?=E6=89=80DMA=E3=82=A4=E3=83=8D=E3=83=BC=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AE=E3=83=9D=E3=83=BC=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@852 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/hotswTypes.h | 34 +++- .../hotsw/ARM7/src/customNDma.c | 17 +- .../hotsw/ARM7/src/dsCardCommon.c | 153 ++++++++++-------- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 57 +++---- .../hotsw/ARM7/src/romEmulation.c | 15 +- 5 files changed, 157 insertions(+), 119 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index e3f14a88..bac9c796 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -35,7 +35,7 @@ extern "C" { #define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ -#define HOTSW_DMA_NO 2 // +#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル #define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ #define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位) @@ -52,6 +52,16 @@ extern "C" { #define PNB_L_VALUE 0x879b9b05 // #define PNB_H_VALUE 0x5c // +#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ +#define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み +#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 +#define HOTSW_PULLED_MSG_NUM 16 // 抜け割り込み送信メッセージの数 +#define HOTSW_CTRL_MSG_NUM 8 // PXI割り込み送信メッセージの数 +#define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM) // 受信バッファの数 + +// コントロールレジスタ0 +#define HOTSW_E2PROM_CTRL_MASK 0x00ff + // コントロールレジスタ1 bit関連 #define START_FLG_MASK 0x80000000 #define READY_FLG_MASK 0x00800000 @@ -273,6 +283,28 @@ typedef struct CardBootData{ BLOWFISH_CTX keyTable; } CardBootData; +// スレッド・メッセージ関係をまとめた構造体 +typedef struct CardThreadData{ + u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; + OSThread thread; + + u32 idx_insert; + u32 idx_pulledOut; + u32 idx_ctrl; + u32 idx_dma; + + OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM]; + HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; + HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; + HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; + + OSMessageQueue hotswQueue; + OSMessageQueue hotswDmaQueue; + + OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; + OSMessage hotswDmaMsgBuffer[HOTSW_DMA_MSG_NUM]; +} CardThreadData; + // カード起動用関数 typedef struct CardBootFunction { HotSwState (*ReadBootSegment_N)(CardBootData *cbd); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index 7b3b17ea..2d76f28b 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -22,18 +22,25 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si // =========================================================================== // Function Describe // =========================================================================== - -// custom CARD DMA +/*---------------------------------------------------------------------------* + Name: HOTSW_NDmaCopy_Card + *---------------------------------------------------------------------------*/ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size) { HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_INC); } +/*---------------------------------------------------------------------------* + Name: HOTSW_NDmaPipe_Card + *---------------------------------------------------------------------------*/ void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size) { HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX); } +/*---------------------------------------------------------------------------* + Name: HOTSWi_NDmaCopy_Card + *---------------------------------------------------------------------------*/ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont) { u32 contData; @@ -46,7 +53,9 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} //---- confirm DMA free - while( MI_IsNDmaBusy(ndmaNo) == TRUE ){} + while( MI_IsNDmaBusy(ndmaNo) == TRUE ){ + OS_TPrintf("Dma is busy..\n"); + } //---- set up registers MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src; @@ -54,7 +63,7 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si 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 | dcont | MI_NDMA_DEST_RELOAD_DISABLE); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 1e912d4e..21545767 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -9,6 +9,9 @@ #include #include +// extern ------------------------------------------------------------------- +extern CardThreadData s_ctData; + // define ------------------------------------------------------------------- #define SECURE_SEGMENT_NUM 4 #define ONE_SEGMENT_PAGE_NUM 8 @@ -16,6 +19,9 @@ #define ROM_EMULATION_START_OFS 0x160 #define ROM_EMULATION_END_OFS 0x180 +// static value ------------------------------------------------------------- +//static OSMessage s_Msg; + // Function prototype ------------------------------------------------------- static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd); static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask); @@ -61,7 +67,7 @@ HotSwState ReadIDNormal(CardBootData *cbd) GCDCmd64 cndLE; // カード割り込みによるDMAコピー - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) ); // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_ID; @@ -75,9 +81,12 @@ HotSwState ReadIDNormal(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + return HOTSW_SUCCESS; } @@ -122,12 +131,12 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) if(cbd->modeType == HOTSW_MODE1){ // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size ); } else{ // NewDMA転送(読み捨て)の準備 // Mode2のときは、データを捨てる。 - HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, size ); + HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, size ); } // リトルエンディアンで作って @@ -140,9 +149,12 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + page++; } @@ -166,7 +178,7 @@ HotSwState ReadStatusNormal(CardBootData *cbd) } // カード割り込みによるDMAコピー - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_STAT; @@ -178,11 +190,13 @@ HotSwState ReadStatusNormal(CardBootData *cbd) reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | - START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} return HOTSW_SUCCESS; } @@ -208,11 +222,9 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | - START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + while(reg_HOTSW_MCCNT1 & START_MASK){} return HOTSW_SUCCESS; } @@ -260,12 +272,10 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd) HOTSWi_SetCommand(&cndLE); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | - START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + + while(reg_HOTSW_MCCNT1 & START_MASK){} - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - return HOTSW_SUCCESS; } @@ -284,7 +294,7 @@ HotSwState LoadTable(void) u32 temp; // NewDMA転送(読み捨て)の準備 - HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE ); + HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE ); // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_LD_TABLE; @@ -298,9 +308,12 @@ HotSwState LoadTable(void) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + return HOTSW_SUCCESS; } @@ -320,14 +333,14 @@ HotSwState ReadRomEmulationData(CardBootData *cbd) { return HOTSW_SUCCESS; } - + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = 0x3e000000; reg_HOTSW_MCCMD1 = 0x0; // MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK); - + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} @@ -340,8 +353,6 @@ HotSwState ReadRomEmulationData(CardBootData *cbd) count+=4; } - MI_CpuCopyFast(cbd->romEmuBuf, (void*)HW_ISD_RESERVED, 32); - return HOTSW_SUCCESS; } @@ -442,14 +453,17 @@ HotSwState ReadIDSecure(CardBootData *cbd) PreSendSecureCommand(cbd, &scrambleMask); // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + // コマンドカウンタインクリメント cbd->vbi++; @@ -503,14 +517,17 @@ HotSwState ReadSegSecure(CardBootData *cbd) for(k=0; kpBootSegBuf->rh.s.secure_cmd_param; - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + // 転送済みページ数 j++; } @@ -521,7 +538,7 @@ HotSwState ReadSegSecure(CardBootData *cbd) // コマンドカウンタインクリメント cbd->vbi++; } - + return HOTSW_SUCCESS; } @@ -550,9 +567,8 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - + while(reg_HOTSW_MCCNT1 & START_MASK){} + // コマンドカウンタインクリメント cbd->vbi++; @@ -584,9 +600,8 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - + while(reg_HOTSW_MCCNT1 & START_MASK){} + // コマンドカウンタインクリメント cbd->vbi++; @@ -620,9 +635,8 @@ HotSwState ChangeModeSecure(CardBootData *cbd) // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - + while(reg_HOTSW_MCCNT1 & START_MASK){} + // コマンドカウンタインクリメント cbd->vbi++; @@ -647,7 +661,7 @@ HotSwState ReadIDGame(CardBootData *cbd) } // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) ); // リトルエンディアンで作って cndLE.dw = HSWOP_G_OP_RD_ID; @@ -655,13 +669,15 @@ HotSwState ReadIDGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | - START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + return HOTSW_SUCCESS; } @@ -682,16 +698,13 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) loop = (u32)(size / PAGE_SIZE); loop = (size % PAGE_SIZE) ? loop + 1 : loop; -// OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf); -// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size); - for(i=0; igameCommondParam | - START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} } return HOTSW_SUCCESS; @@ -725,7 +740,7 @@ HotSwState ReadStatusGame(CardBootData *cbd) } // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) ); // リトルエンディアンで作って cndLE.dw = HSWOP_G_OP_RD_STAT; @@ -734,12 +749,14 @@ HotSwState ReadStatusGame(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | - START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // メッセージ受信 +// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + return HOTSW_SUCCESS; } @@ -763,13 +780,9 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd) HOTSWi_SetCommand(&cndLE); // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | - START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + while(reg_HOTSW_MCCNT1 & START_MASK){} return HOTSW_SUCCESS; } - - diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 96864323..45cc6424 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -32,12 +32,6 @@ #define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8) -#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ -#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 -#define HOTSW_PULLED_MSG_NUM 16 // 抜け割り込み送信メッセージの数 -#define HOTSW_CTRL_MSG_NUM 8 // PXI割り込み送信メッセージの数 -#define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM) // 受信バッファの数 - #define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF #ifdef SDK_ARM9 @@ -50,23 +44,6 @@ #define HOTSW_EXMEMCNT_SELB_SHIFT 10 #endif -// スレッド・メッセージ関係をまとめた構造体 -typedef struct CardThreadData{ - u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)]; - OSThread thread; - - u32 idx_insert; - u32 idx_pulledOut; - u32 idx_ctrl; - - HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; - HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; - HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; - OSMessageQueue hotswQueue; - OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM]; -} -CardThreadData; - // Function prototype ------------------------------------------------------- static BOOL IsSwap(void); static u32 GetMcSlotShift(void); @@ -80,7 +57,7 @@ static void SetInterrupt(void); static void InterruptCallbackCard(void); static void InterruptCallbackCardDet(void); -static void InterruptCallbackCardData(void); +static void InterruptCallbackNDma(void); static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err); static void LockHotSwRsc(OSLockWord* word); @@ -128,7 +105,7 @@ static u32 *s_pSecureSegBuffer; // static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく static CardBootData s_cbData; -static CardThreadData s_ctData; +CardThreadData s_ctData; // HMACSHA1の鍵 static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = { @@ -213,7 +190,7 @@ void HOTSW_Init(u32 threadPrio) // PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。 #endif - + // カードブート用構造体の初期化 MI_CpuClear8(&s_cbData, sizeof(CardBootData)); @@ -247,6 +224,9 @@ void HOTSW_Init(u32 threadPrio) // メッセージキューの初期化 OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); + + // メッセージキューの初期化 + OS_InitMessageQueue( &s_ctData.hotswDmaQueue, &s_ctData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); // スレッド起動 OS_WakeupThreadDirect(&s_ctData.thread); @@ -313,8 +293,8 @@ static HotSwState LoadCardData(void) // ロード処理開始 if(HOTSW_IsCardAccessible()){ // カード側でKey Tableをロードする - state = LoadTable(); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + state = LoadTable(); + retval = (retval == HOTSW_SUCCESS) ? state : retval; // ---------------------- Normal Mode ---------------------- romMode = HOTSW_ROM_MODE_NORMAL; @@ -339,7 +319,7 @@ static HotSwState LoadCardData(void) // Romエミュレーション情報を取得 state = ReadRomEmulationData(&s_cbData); - retval = (retval == HOTSW_SUCCESS) ? state : retval; + retval = (retval == HOTSW_SUCCESS) ? state : retval; // 取得したRomエミュレーション情報を比較 s_cbData.debuggerFlg = TRUE; @@ -887,7 +867,7 @@ static HotSwState DecryptObjectFile(void) else{ retval = HOTSW_DATA_DECRYPT_ERROR; - MI_NDmaFill( HOTSW_DMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア + MI_NDmaFill( HOTSW_NDMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア } MI_CpuCopy32(pEncBuf, pEncDes, (u32)size); @@ -1276,14 +1256,19 @@ static void InterruptCallbackCardDet(void) } /*---------------------------------------------------------------------------* - Name: InterruptCallbackCardData + Name: InterruptCallbackNDma Description: カードB データ転送終了割り込みハンドラ *---------------------------------------------------------------------------*/ -static void InterruptCallbackCardData(void) +static void InterruptCallbackNDma(void) { - // データ転送終了待ちまで寝ていたのを起こす - OS_WakeupThreadDirect(&s_ctData.thread); + // メッセージ送信 +// OS_SendMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_ctData.hotswDmaMsg[s_ctData.idx_dma], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント +// s_ctData.idx_dma = (s_ctData.idx_dma+1) % HOTSW_DMA_MSG_NUM; + + OS_PutString("▽\n"); } /*---------------------------------------------------------------------------* @@ -1400,11 +1385,11 @@ static void SetInterrupt(void) #ifndef DEBUG_USED_CARD_SLOT_B_ SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard ); SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet ); - SetInterruptCallback( OS_IE_CARD_A_DATA , InterruptCallbackCardData ); // DMA転送終了割り込み使う + SetInterruptCallback( OS_IE_NDMA2 , InterruptCallbackNDma ); #else SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard ); SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet ); - SetInterruptCallback( OS_IE_CARD_B_DATA , InterruptCallbackCardData ); // DMA転送終了割り込み使う + SetInterruptCallback( OS_IE_NDMA2 , InterruptCallbackNDma ); #endif } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index 032a4866..7ed7b13e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -61,7 +61,7 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) } // カード割り込みによるDMAコピー - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_ID; @@ -75,8 +75,8 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} return HOTSW_SUCCESS; } @@ -99,7 +99,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) } // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); + HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_PAGE; @@ -114,8 +114,8 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd) reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK); - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + // DMAが終了するまで待つ + while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} page++; } @@ -171,8 +171,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd) // MCCNT1 レジスタ設定 (START = 1 に) reg_HOTSW_MCCNT1 = START_MASK; - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); + while(reg_HOTSW_MCCNT1 & START_MASK){} return HOTSW_SUCCESS; }