From 64514d6c07c5252727ef60e7c3fe7e4f243f5cfc Mon Sep 17 00:00:00 2001 From: nakasima Date: Tue, 4 Mar 2008 11:24:16 +0000 Subject: [PATCH] =?UTF-8?q?CPU=E3=83=9D=E3=83=BC=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=81=A7=E3=82=AB=E3=83=BC=E3=83=89=E3=83=AA=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E7=AE=87=E6=89=80?= =?UTF-8?q?=E3=82=92DMA=E3=83=AA=E3=83=BC=E3=83=89=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=80=82=20=E3=82=AB=E3=83=BC=E3=83=89IF=E3=82=84?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=83=89DMA=E3=81=AE=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E3=81=8C=E3=81=82=E3=82=84=E3=81=97=E3=81=84?= =?UTF-8?q?=E7=AE=87=E6=89=80=E3=82=92=E5=AF=BE=E5=87=A6=E3=80=82?= 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@810 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/customNDma.h | 1 + .../hotsw/ARM7/include/hotswTypes.h | 2 +- .../ARM7/include/{command.h => romSpec.h} | 22 +++++++-- .../hotsw/ARM7/src/customNDma.c | 21 ++++++++- .../hotsw/ARM7/src/dsCardCommon.c | 47 ++++++++++--------- .../hotsw/ARM7/src/romEmulation.c | 15 +++--- 6 files changed, 71 insertions(+), 37 deletions(-) rename build/libraries_sysmenu/hotsw/ARM7/include/{command.h => romSpec.h} (86%) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h index 97f2ad61..65f97412 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/customNDma.h @@ -12,6 +12,7 @@ extern "C" { // =========================================================================== // カード 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); #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 0011b595..44ee5649 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -16,7 +16,7 @@ #include #include #include -#include "command.h" +#include "romSpec.h" #ifdef __cplusplus extern "C" { diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/command.h b/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h similarity index 86% rename from build/libraries_sysmenu/hotsw/ARM7/include/command.h rename to build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h index c12b74a2..703ca705 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/command.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/romSpec.h @@ -1,6 +1,6 @@ /*---------------------------------------------------------------------------* Project: TwlIPL - HOTSW - include - File: command.h + File: romSpec.h Copyright 2008 Nintendo. All rights reserved. @@ -14,14 +14,28 @@ $Rev: $ $Author: $ *---------------------------------------------------------------------------*/ -#ifndef __HOTSW_COMMAND_H__ -#define __HOTSW_COMMAND_H__ +#ifndef __HOTSW_ROMSPEC_H__ +#define __HOTSW_ROMSPEC_H__ #ifdef __cplusplus extern "C" { #endif +// ROM memory map + +#define HOTSW_LOAD_TABLE_SIZE 0x2000 // 8KB +#define HOTSW_DS_ROM_HEADER_SIZE 0x200 // 512B +#define HOTSW_ROM_HEADER_SIZE 0x1000 // 4KB +#define HOTSW_SECURE_AREA_SIZE 0x4000 // 16KB +#define HOTSW_SECURE2_AREA_SIZE 0x4000 // 16KB + +#define HOTSW_SECURE_AREA_OFS 0x4000 // 16KB +#define HOTSW_GAME_AREA_OFS 0x8000 // 32KB +#define HOTSW_SECURE2_AREA_OFS 0x3000 // 12KB +#define HOTSW_GAME2_AREA_OFS 0x7000 // 28KB + + // ROM ID #define HOTSW_ROMID_1TROM_MASK 0x80000000UL @@ -128,5 +142,5 @@ extern "C" { #endif -/* __HOTSW_COMMAND_H__ */ +/* __HOTSW_ROMSPEC_H__ */ #endif diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c index f3748541..7b3b17ea 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/customNDma.c @@ -4,6 +4,7 @@ *---------------------------------------------------------------------------*/ #include #include +#include #include @@ -14,6 +15,9 @@ #define NDMA_WORD_COUNT_1 0x1 #define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." ); +// Function prototype ------------------------------------------------------- +static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont); + // =========================================================================== // Function Describe @@ -21,13 +25,26 @@ // custom CARD 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); +} + +void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size) +{ + HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX); +} + +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 ); - + + //---- confirm CARD free + while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} + //---- confirm DMA free while( MI_IsNDmaBusy(ndmaNo) == TRUE ){} @@ -40,7 +57,7 @@ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size) //---- 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_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE); #ifndef DEBUG_USED_CARD_SLOT_B_ contData |= MI_NDMA_TIMING_CARD_A; #else diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index c1a6c14e..beeab4de 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -38,6 +38,9 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE) cndBE.b[1] = cndLE->b[6]; cndBE.b[0] = cndLE->b[7]; + //---- confirm CARD free + while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} + // MCCMD レジスタ設定 reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; @@ -115,7 +118,17 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } - + + if(cbd->modeType == HOTSW_MODE1){ + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_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 ); + } + // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_PAGE; cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; @@ -123,23 +136,11 @@ HotSwState ReadBootSegNormal(CardBootData *cbd) // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); - if(cbd->modeType == HOTSW_MODE1){ - // NewDMA転送の準備 - HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size ); - - // MCCNT1 レジスタ設定 - reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; + // MCCNT1 レジスタ設定 + reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; - // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) - OS_SleepThread(NULL); - } - else{ - // Mode2のときは、データを捨てる。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - temp = reg_HOTSW_MCD1; - } - } + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); page++; } @@ -213,6 +214,9 @@ HotSwState LoadTable(void) GCDCmd64 cndLE; u32 temp; + // NewDMA転送(読み捨て)の準備 + HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE ); + // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_LD_TABLE; @@ -224,12 +228,9 @@ HotSwState LoadTable(void) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); - - // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 - while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ - while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} - temp = reg_HOTSW_MCD1; - } + + // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) + OS_SleepThread(NULL); return HOTSW_SUCCESS; } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c index c6195ead..032a4866 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c @@ -97,7 +97,10 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd) if(!HOTSW_IsCardAccessible()){ return HOTSW_PULLED_OUT_ERROR; } - + + // NewDMA転送の準備 + HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE ); + // リトルエンディアンで作って cndLE.dw = HSWOP_N_OP_RD_PAGE; cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; @@ -110,12 +113,10 @@ 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); - - // 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); + page++; }