(更新:Akabane Jumpei)

・DMAデータ転送終了割り込みハンドラの設定部分を修正


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1068 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-04-04 12:48:04 +00:00
parent 5741ed8cbb
commit 41158cfed8
6 changed files with 351 additions and 180 deletions

View File

@ -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
// ===========================================================================

View File

@ -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Ě<E2809A>}<7D>X<EFBFBD>N
// --- 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

View File

@ -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 <twl.h>
#include <sysmenu.h>
#include <hotswTypes.h>
#include <customNDma.h>
// 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;
}

View File

@ -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 <twl.h>
#include <firm/os/common/system.h>
#include <blowfish.h>
@ -10,7 +17,7 @@
#include <customNDma.h>
// 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;
}

View File

@ -150,7 +150,7 @@ static CardBootFunction s_funcTable[] = {
// Global Values ------------------------------------------------------------
BLOWFISH_CTX GCDi_BlowfishInitTableBufDS;
CardThreadData s_ctData;
CardThreadData HotSwThreadData;
#include <twl/ltdwram_end.h>
@ -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;
}
/*---------------------------------------------------------------------------*

View File

@ -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;
}