From 41158cfed87bb60efb54d46be41b7de153f5b9f6 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Fri, 4 Apr 2008 12:48:04 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BBDMA=E3=83=87=E3=83=BC=E3=82=BF=E8=BB=A2=E9=80=81?= =?UTF-8?q?=E7=B5=82=E4=BA=86=E5=89=B2=E3=82=8A=E8=BE=BC=E3=81=BF=E3=83=8F?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=83=A9=E3=81=AE=E8=A8=AD=E5=AE=9A=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=82=92=E4=BF=AE=E6=AD=A3?= 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@1068 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/customNDma.h | 11 + .../hotsw/ARM7/include/hotswTypes.h | 69 ++-- .../hotsw/ARM7/src/customNDma.c | 67 +++- .../hotsw/ARM7/src/dsCardCommon.c | 297 +++++++++++------- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 54 ++-- .../hotsw/ARM7/src/romEmulation.c | 33 +- 6 files changed, 351 insertions(+), 180 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h index 65f97412..5af0facb 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h @@ -7,6 +7,17 @@ extern "C" { #endif + +static inline void HOTSW_WaitCardCtrl(void) +{ + while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} +} + +static inline void HOTSW_WaitDmaCtrl(u32 ndmaNo) +{ + while( MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) & MI_NDMA_ENABLE_MASK ){} +} + // =========================================================================== // Function Describe // =========================================================================== diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index ee48e7bf..9082a559 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -33,38 +33,49 @@ extern "C" { #endif #endif +// --- NewDMA Ch +#define HOTSW_NDMA_NO 2 -#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ -#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル -#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ +// --- Blowfish +#define KEY_BUF_SIZE 3 -#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位) -#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位) +// --- Boot Segment +#define BOOT_SEGMENT_SIZE 0x1000 -#define ONE_SEGMENT_SIZE 0x1000 // 1Segmentのサイズ(バイト単位) -#define ONE_SEGMENT_WORD_SIZE 0x400 // 1Segmentのサイズ(ワード単位) - -#define SECURE_SEGMENT_START 0x4000 // Secure領域のスタートアドレス -#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ +// --- Secure Segment +#define SECURE_SEGMENT_START 0x4000 +#define SECURE_SEGMENT_SIZE 0x4000 #define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE) +#define PNA_BASE_VALUE 0x60e8 +#define PNB_L_VALUE 0x879b9b05 +#define PNB_H_VALUE 0x5c -#define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ +// --- TWL Card +#define TWLCARD_BORDER_OFFSET 0x80000 -#define PNA_BASE_VALUE 0x60e8 // -#define PNB_L_VALUE 0x879b9b05 // -#define PNB_H_VALUE 0x5c // +// --- Page / Segment (Byte) +#define PAGE_SIZE 0x200 +#define ONE_SEGMENT_SIZE 0x1000 -#define HOTSW_THREAD_STACK_SIZE (1024 * 2) // スタックサイズ -#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) // 受信バッファの数 +// --- Page / Segment (Word) +#define PAGE_WORD_SIZE 0x80 +#define ONE_SEGMENT_WORD_SIZE 0x400 -// コントロールレジスタ0 +// --- Rom Emulation +#define ROM_EMULATION_DATA_SIZE 0x20 + +// --- Thread +#define HOTSW_THREAD_STACK_SIZE (1024 * 2) +#define HOTSW_DMA_MSG_NUM 8 +#define HOTSW_INSERT_MSG_NUM 16 +#define HOTSW_PULLED_MSG_NUM 16 +#define HOTSW_CTRL_MSG_NUM 8 +#define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM) + +// --- Card Control Reg 0 #define HOTSW_E2PROM_CTRL_MASK 0x00ff -// コントロールレジスタ1 bit関連 +// --- Card Control Reg 1 #define START_FLG_MASK 0x80000000 #define READY_FLG_MASK 0x00800000 @@ -107,15 +118,27 @@ extern "C" { #define START_SHIFT 31 #define START_MASK 0x80000000 -#define SCRAMBLE_MASK 0x1840e000 +#define SCRAMBLE_MASK 0x1840e000 // スクランブル関係のフラグマスク #define SECURE_COMMAND_SCRAMBLE_MASK 0x00406000 // CS SE DSのマスク +// --- Page Count +#define HOTSW_PAGE_0 0x0UL << PC_SHIFT +#define HOTSW_PAGE_1 0x1UL << PC_SHIFT +#define HOTSW_PAGE_2 0x2UL << PC_SHIFT +#define HOTSW_PAGE_4 0x3UL << PC_SHIFT +#define HOTSW_PAGE_8 0x4UL << PC_SHIFT +#define HOTSW_PAGE_16 0x5UL << PC_SHIFT +#define HOTSW_PAGE_32 0x6UL << PC_SHIFT +#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT + +// --- Latency #define AddLatency2ToLatency1(param)\ ( (((param) & LATENCY2_MASK) \ >> LATENCY2_SHIFT) \ + ((param) & LATENCY1_MASK) \ ) +// --- Register Define #ifndef DEBUG_USED_CARD_SLOT_B_ // Slot A #define SLOT_STATUS_MODE_SELECT_MSK 0x0c diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index 2d76f28b..93621480 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -1,45 +1,62 @@ /*---------------------------------------------------------------------------* - Project: TwlSDK - File: + Project: TwlIPL + File: customNDma.c + + 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. *---------------------------------------------------------------------------*/ #include #include #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." ); + +extern CardThreadData HotSwThreadData; + // Function prototype ------------------------------------------------------- static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont); - +static void InterruptCallbackNDma(void); // =========================================================================== // Function Describe // =========================================================================== /*---------------------------------------------------------------------------* Name: HOTSW_NDmaCopy_Card + + Description: カードから送られてきたデータを指定アドレスに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); } + /*---------------------------------------------------------------------------* Name: HOTSW_NDmaPipe_Card + + Description: カードから送られてきたデータを指定アドレスに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); } + /*---------------------------------------------------------------------------* Name: HOTSWi_NDmaCopy_Card + + Description: DMA転送の準備 + + 注:先にこの関数でDMA転送の準備をしてから、カードレジスタのstartフラグを上げてください *---------------------------------------------------------------------------*/ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont) { @@ -48,25 +65,26 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si //--- Assert ASSERT_DMANO( ndmaNo ); - + //---- confirm CARD free - while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} + HOTSW_WaitCardCtrl(); //---- confirm DMA free - while( MI_IsNDmaBusy(ndmaNo) == TRUE ){ - OS_TPrintf("Dma is busy..\n"); - } + HOTSW_WaitDmaCtrl(ndmaNo); + //---- Handler Set + (void)OS_SetIrqFunction(OS_IE_NDMA2, InterruptCallbackNDma); + //---- 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_BCNT_WOFFSET ) = MI_NDMA_INTERVAL_PS_1; 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); + contData = MI_NDMA_BWORD_1 | MI_NDMA_ENABLE/* | MI_NDMA_CONTINUOUS_ON*/; + contData |= MI_NDMA_SRC_FIX | dcont | MI_NDMA_SRC_RELOAD_DISABLE | MI_NDMA_DEST_RELOAD_DISABLE; #ifndef DEBUG_USED_CARD_SLOT_B_ contData |= MI_NDMA_TIMING_CARD_A; #else @@ -75,9 +93,24 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si //---- set interrupt enable contData |= MI_NDMA_IF_ENABLE; - + //---- start MI_NDMA_REG( ndmaNo, MI_NDMA_REG_CNT_WOFFSET ) = contData; - + (void)OS_RestoreInterrupts( enabled ); } + + +/*---------------------------------------------------------------------------* + Name: InterruptCallbackNDma + + Description: カードB データ転送終了割り込みハンドラ + *---------------------------------------------------------------------------*/ +static void InterruptCallbackNDma(void) +{ + // メッセージ送信 + OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK); + + // メッセージインデックスをインクリメント + HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM; +} diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index 236a55c5..9a49cac3 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -1,8 +1,15 @@ /*---------------------------------------------------------------------------* - Project: TwlSDK - File: dsCardType1.c - *---------------------------------------------------------------------------*/ + Project: TwlIPL + File: dsCardCommon.c + 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. + *---------------------------------------------------------------------------*/ #include #include #include @@ -10,7 +17,7 @@ #include // extern ------------------------------------------------------------------- -extern CardThreadData s_ctData; +extern CardThreadData HotSwThreadData; // define ------------------------------------------------------------------- #define SECURE_SEGMENT_NUM 4 @@ -20,17 +27,21 @@ extern CardThreadData s_ctData; #define ROM_EMULATION_END_OFS 0x180 // static value ------------------------------------------------------------- -//static OSMessage s_Msg; +static OSMessage s_Msg; // Function prototype ------------------------------------------------------- static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd); static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask); - // =========================================================================== // Function Describe // =========================================================================== +/*---------------------------------------------------------------------------* + Name: HOTSWi_SetCommand + + Description: 引数で与えられたコマンドのエンディアンを変えてレジスタにセットする + *---------------------------------------------------------------------------*/ void HOTSWi_SetCommand(GCDCmd64 *cndLE) { GCDCmd64 cndBE; @@ -57,11 +68,11 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE) // ■------------------------------------■ // ■ ノーマルモードのコマンド ■ // ■------------------------------------■ -/* ----------------------------------------------------------------- - * ReadIDNormal関数 - * - * ノーマルモード時のカードIDを読み込む関数 - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: ReadIDNormal + + Description: ノーマルモード時のカードIDを読み込む関数 + *---------------------------------------------------------------------------*/ HotSwState ReadIDNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -75,17 +86,19 @@ HotSwState ReadIDNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); - - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK); + +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } @@ -146,14 +159,19 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) // 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); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; +#if 0 + // DMAが終了するまで待つ + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - - // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif page++; } @@ -162,11 +180,11 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) } -/* ----------------------------------------------------------------- - * ReadStatusNormal関数 - * - * ノーマルモードでステータスを読み込む - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: ReadStatusNormal + + Description: ノーマルモードでステータスを読み込む + *---------------------------------------------------------------------------*/ HotSwState ReadStatusNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -186,27 +204,29 @@ HotSwState ReadStatusNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); - - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT; +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } -/* ----------------------------------------------------------------- - * RefreshBadBlockNormal関数 - * - * ノーマルモードでバッドブロックを置換 - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: RefreshBadBlockNormal + + Description: ノーマルモードでバッドブロックを置換 + *---------------------------------------------------------------------------*/ HotSwState RefreshBadBlockNormal(CardBootData *cbd) { GCDCmd64 cndLE; @@ -221,10 +241,14 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0; - while(reg_HOTSW_MCCNT1 & START_MASK){} + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } @@ -242,6 +266,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd) return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG_MODE); } + /*---------------------------------------------------------------------------* * Name: ChangeModeNorma2 * @@ -271,23 +296,27 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - while(reg_HOTSW_MCCNT1 & START_MASK){} + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_0; + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } -/* ----------------------------------------------------------------- - * LoadTable関数 - * - * カード側の Key Table をロードする関数。 - * - * ※この関数は開発カード用に発行しないといけない。 - * 製品版カードの場合、このコマンドは無視される - * ----------------------------------------------------------------- */ +/*---------------------------------------------------------------------------* + Name: LoadTable + + Description: カード側の Key Table をロードする関数 + + ※この関数は開発カード用に発行しないといけない。 +  製品版カードの場合、このコマンドは無視される + *---------------------------------------------------------------------------*/ HotSwState LoadTable(void) { GCDCmd64 cndLE; @@ -295,24 +324,26 @@ HotSwState LoadTable(void) // NewDMA転送(読み捨て)の準備 HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE ); - + // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_LD_TABLE; - + // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); - - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); - - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16; + +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } @@ -338,8 +369,11 @@ HotSwState ReadRomEmulationInfo(CardBootData *cbd) reg_HOTSW_MCCMD0 = 0x3e000000; reg_HOTSW_MCCMD1 = 0x0; + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe) - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK); + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_1 | (0x5fe & LATENCY1_MASK); // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ @@ -363,7 +397,7 @@ HotSwState ReadRomEmulationInfo(CardBootData *cbd) /*---------------------------------------------------------------------------* Name: SetSecureCommand - Description: + Description: 引数で与えられたコマンドをBlowfishで暗号化してレジスタにセット *---------------------------------------------------------------------------*/ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) { @@ -415,6 +449,9 @@ static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask) if(cbd->cardType == DS_CARD_TYPE_2){ u32 latency = (u32)cbd->pBootSegBuf->rh.s.secure_cmd_latency * 0x100; + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | *scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; @@ -454,15 +491,20 @@ HotSwState ReadIDSecure(CardBootData *cbd) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) ); + + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; - - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); + reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif // コマンドカウンタインクリメント cbd->vbi++; @@ -470,6 +512,7 @@ HotSwState ReadIDSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadSegSecure * @@ -519,14 +562,19 @@ HotSwState ReadSegSecure(CardBootData *cbd) // NewDMA転送の準備 HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size ); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (pc << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; +#if 0 + // DMAが終了するまで待つ + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - - // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif // 転送済みページ数 j++; @@ -542,6 +590,7 @@ HotSwState ReadSegSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: SwitchONPNGSecure * @@ -564,10 +613,14 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -575,6 +628,7 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: SwitchOFFPNGSecure * @@ -597,10 +651,14 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -608,6 +666,7 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd) return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ChangeModeSecure * @@ -632,10 +691,14 @@ HotSwState ChangeModeSecure(CardBootData *cbd) // コマンド初回送信(NTR-MROMはレイテンシクロック設定変更のみ) PreSendSecureCommand(cbd, &scrambleMask); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); - - while(reg_HOTSW_MCCNT1 & START_MASK){} + + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); // コマンドカウンタインクリメント cbd->vbi++; @@ -669,18 +732,24 @@ HotSwState ReadIDGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; + +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadPageGame * @@ -713,19 +782,25 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - - // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1; + +#if 0 + // DMAが終了するまで待つ + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif } return HOTSW_SUCCESS; } + /*---------------------------------------------------------------------------* * Name: ReadStatusGame * @@ -748,18 +823,24 @@ HotSwState ReadStatusGame(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)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); - // メッセージ受信 -// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); - + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT; + +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } + /* ----------------------------------------------------------------- * RefreshBadBlockGame関数 * @@ -779,10 +860,14 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ) - reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_0; - while(reg_HOTSW_MCCNT1 & START_MASK){} + // カードデータ転送終了まで待つ + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 452c99f9..12ef224e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -150,7 +150,7 @@ static CardBootFunction s_funcTable[] = { // Global Values ------------------------------------------------------------ BLOWFISH_CTX GCDi_BlowfishInitTableBufDS; -CardThreadData s_ctData; +CardThreadData HotSwThreadData; #include @@ -198,7 +198,7 @@ void HOTSW_Init(u32 threadPrio) MI_CpuClear8(&s_cbData, sizeof(CardBootData)); // カードスレッド用構造体の初期化 - MI_CpuClear8(&s_ctData, sizeof(CardThreadData)); + MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData)); // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) { @@ -217,22 +217,22 @@ void HOTSW_Init(u32 threadPrio) } // カードブート用スレッドの生成 - OS_CreateThread(&s_ctData.thread, + OS_CreateThread(&HotSwThreadData.thread, McThread, NULL, - s_ctData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), + HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HOTSW_THREAD_STACK_SIZE, threadPrio ); // メッセージキューの初期化 - OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswQueue, &HotSwThreadData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM ); // メッセージキューの初期化 - OS_InitMessageQueue( &s_ctData.hotswDmaQueue, &s_ctData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); + OS_InitMessageQueue( &HotSwThreadData.hotswDmaQueue, &HotSwThreadData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM ); // スレッド起動 - OS_WakeupThreadDirect(&s_ctData.thread); + OS_WakeupThreadDirect(&HotSwThreadData.thread); // Boot Segment バッファの設定 HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); @@ -246,10 +246,10 @@ void HOTSW_Init(u32 threadPrio) // カードが挿さってあったらスレッドを起動する if(HOTSW_IsCardExist()){ // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; } else{ SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; @@ -1193,7 +1193,7 @@ static void McThread(void *arg) HotSwMessage *msg; while(1){ - OS_ReceiveMessage(&s_ctData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); + OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); if( msg->ctrl == TRUE ) { // [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。 @@ -1304,15 +1304,15 @@ static void McThread(void *arg) *---------------------------------------------------------------------------*/ static void InterruptCallbackCard(void) { - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].ctrl = FALSE; - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].value = 0; - s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLOUT; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0; + HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].type = HOTSW_PULLOUT; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_pulledOut = (s_ctData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; + HotSwThreadData.idx_pulledOut = (HotSwThreadData.idx_pulledOut+1) % HOTSW_PULLED_MSG_NUM; OS_PutString("○\n"); } @@ -1324,15 +1324,15 @@ static void InterruptCallbackCard(void) *---------------------------------------------------------------------------*/ static void InterruptCallbackCardDet(void) { - s_ctData.hotswInsertMsg[s_ctData.idx_insert].ctrl = FALSE; - s_ctData.hotswInsertMsg[s_ctData.idx_insert].value = 0; - s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0; + HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].type = HOTSW_INSERT; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswInsertMsg[s_ctData.idx_insert], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_insert = (s_ctData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; + HotSwThreadData.idx_insert = (HotSwThreadData.idx_insert+1) % HOTSW_INSERT_MSG_NUM; OS_PutString("●\n"); } @@ -1345,10 +1345,10 @@ static void InterruptCallbackCardDet(void) static void InterruptCallbackNDma(void) { // メッセージ送信 -// OS_SendMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_ctData.hotswDmaMsg[s_ctData.idx_dma], OS_MESSAGE_NOBLOCK); +// OS_SendMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&HotSwThreadData.hotswDmaMsg[HotSwThreadData.idx_dma], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント -// s_ctData.idx_dma = (s_ctData.idx_dma+1) % HOTSW_DMA_MSG_NUM; +// HotSwThreadData.idx_dma = (HotSwThreadData.idx_dma+1) % HOTSW_DMA_MSG_NUM; OS_PutString("▽\n"); } @@ -1366,15 +1366,15 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) d.data = data; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].value = d.msg.value; - s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].type = HOTSW_CONTROL; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value; + HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].type = HOTSW_CONTROL; // メッセージ送信 - OS_SendMessage(&s_ctData.hotswQueue, (OSMessage *)&s_ctData.hotswPxiMsg[s_ctData.idx_ctrl], OS_MESSAGE_NOBLOCK); + OS_SendMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl], OS_MESSAGE_NOBLOCK); // メッセージインデックスをインクリメント - s_ctData.idx_ctrl = (s_ctData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; + HotSwThreadData.idx_ctrl = (HotSwThreadData.idx_ctrl+1) % HOTSW_CTRL_MSG_NUM; } /*---------------------------------------------------------------------------* diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index 7ed7b13e..edd67de1 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -13,6 +13,12 @@ #define BOOT_PAGE_NUM 8 #define SECURE_PAGE_NUM 32 +// static value ------------------------------------------------------------- +static OSMessage s_Msg; + +// extern ------------------------------------------------------------------- +extern CardThreadData HotSwThreadData; + // =========================================================================== @@ -69,14 +75,19 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif return HOTSW_SUCCESS; } @@ -108,14 +119,19 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) - reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); // 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); +#if 0 // DMAが終了するまで待つ - while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} + HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO); +#else + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#endif page++; } @@ -168,10 +184,13 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); + // MCCNT0 レジスタ設定 + reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK ); + // MCCNT1 レジスタ設定 (START = 1 に) reg_HOTSW_MCCNT1 = START_MASK; - while(reg_HOTSW_MCCNT1 & START_MASK){} + HOTSW_WaitCardCtrl(); return HOTSW_SUCCESS; }