CPUポーリングでカードリードしている箇所をDMAリードに変更。

カードIFやカードDMAの停止確認があやしい箇所を対処。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@810 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-03-04 11:24:16 +00:00
parent 62fcd271a5
commit 64514d6c07
6 changed files with 71 additions and 37 deletions

View File

@ -12,6 +12,7 @@ extern "C" {
// =========================================================================== // ===========================================================================
// カード // カード
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size); 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 #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -16,7 +16,7 @@
#include <twl.h> #include <twl.h>
#include <twl/os/common/format_rom.h> #include <twl/os/common/format_rom.h>
#include <sysmenu.h> #include <sysmenu.h>
#include "command.h" #include "romSpec.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlIPL - HOTSW - include Project: TwlIPL - HOTSW - include
File: command.h File: romSpec.h
Copyright 2008 Nintendo. All rights reserved. Copyright 2008 Nintendo. All rights reserved.
@ -14,14 +14,28 @@
$Rev: $ $Rev: $
$Author: $ $Author: $
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef __HOTSW_COMMAND_H__ #ifndef __HOTSW_ROMSPEC_H__
#define __HOTSW_COMMAND_H__ #define __HOTSW_ROMSPEC_H__
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #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 // ROM ID
#define HOTSW_ROMID_1TROM_MASK 0x80000000UL #define HOTSW_ROMID_1TROM_MASK 0x80000000UL
@ -128,5 +142,5 @@ extern "C" {
#endif #endif
/* __HOTSW_COMMAND_H__ */ /* __HOTSW_ROMSPEC_H__ */
#endif #endif

View File

@ -4,6 +4,7 @@
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <twl.h> #include <twl.h>
#include <sysmenu.h> #include <sysmenu.h>
#include <hotswTypes.h>
#include <customNDma.h> #include <customNDma.h>
@ -14,6 +15,9 @@
#define NDMA_WORD_COUNT_1 0x1 #define NDMA_WORD_COUNT_1 0x1
#define ASSERT_DMANO( ndmaNo ) SDK_ASSERTMSG( (ndmaNo) <= MI_NDMA_MAX_NUM, "illegal NDMA No." ); #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 // Function Describe
@ -21,6 +25,16 @@
// custom CARD DMA // custom CARD DMA
void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size) 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; u32 contData;
OSIntrMode enabled = OS_DisableInterrupts(); OSIntrMode enabled = OS_DisableInterrupts();
@ -28,6 +42,9 @@ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size)
//--- Assert //--- Assert
ASSERT_DMANO( ndmaNo ); ASSERT_DMANO( ndmaNo );
//---- confirm CARD free
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
//---- confirm DMA free //---- confirm DMA free
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){} 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 //---- decide control register
contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE; 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_ #ifndef DEBUG_USED_CARD_SLOT_B_
contData |= MI_NDMA_TIMING_CARD_A; contData |= MI_NDMA_TIMING_CARD_A;
#else #else

View File

@ -38,6 +38,9 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE)
cndBE.b[1] = cndLE->b[6]; cndBE.b[1] = cndLE->b[6];
cndBE.b[0] = cndLE->b[7]; cndBE.b[0] = cndLE->b[7];
//---- confirm CARD free
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
// MCCMD レジスタ設定 // MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b; reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4]; reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
@ -116,6 +119,16 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR; 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 = HSWOP_N_OP_RD_PAGE;
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
@ -123,23 +136,11 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); 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 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK; reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる) // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL); OS_SleepThread(NULL);
}
else{
// Mode2のときは、データを捨てる。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1;
}
}
page++; page++;
} }
@ -213,6 +214,9 @@ HotSwState LoadTable(void)
GCDCmd64 cndLE; GCDCmd64 cndLE;
u32 temp; u32 temp;
// NewDMA転送読み捨ての準備
HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
// リトルエンディアンで作って // リトルエンディアンで作って
cndLE.dw = HSWOP_N_OP_LD_TABLE; cndLE.dw = HSWOP_N_OP_LD_TABLE;
@ -225,11 +229,8 @@ HotSwState LoadTable(void)
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 // カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ OS_SleepThread(NULL);
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1;
}
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }

View File

@ -98,6 +98,9 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
return HOTSW_PULLED_OUT_ERROR; 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 = HSWOP_N_OP_RD_PAGE;
cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT; cndLE.dw |= page << HSWOP_N_RD_PAGE_ADDR_SHIFT;
@ -111,11 +114,9 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd) // 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); 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){ OS_SleepThread(NULL);
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
*(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
}
page++; page++;
} }