(更新: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" { extern "C" {
#endif #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 // Function Describe
// =========================================================================== // ===========================================================================

View File

@ -33,38 +33,49 @@ extern "C" {
#endif #endif
#endif #endif
// --- NewDMA Ch
#define HOTSW_NDMA_NO 2
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ // --- Blowfish
#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル #define KEY_BUF_SIZE 3
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位) // --- Boot Segment
#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位) #define BOOT_SEGMENT_SIZE 0x1000
#define ONE_SEGMENT_SIZE 0x1000 // 1Segmentのサイズ(バイト単位) // --- Secure Segment
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1Segmentのサイズ(ワード単位) #define SECURE_SEGMENT_START 0x4000
#define SECURE_SEGMENT_SIZE 0x4000
#define SECURE_SEGMENT_START 0x4000 // Secure領域のスタートアドレス
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
#define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE) #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 // // --- Page / Segment (Byte)
#define PNB_L_VALUE 0x879b9b05 // #define PAGE_SIZE 0x200
#define PNB_H_VALUE 0x5c // #define ONE_SEGMENT_SIZE 0x1000
#define HOTSW_THREAD_STACK_SIZE (1024 * 2) // スタックサイズ // --- Page / Segment (Word)
#define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み #define PAGE_WORD_SIZE 0x80
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 #define ONE_SEGMENT_WORD_SIZE 0x400
#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 // --- 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 #define HOTSW_E2PROM_CTRL_MASK 0x00ff
// コントロールレジスタ1 bit関連 // --- Card Control Reg 1
#define START_FLG_MASK 0x80000000 #define START_FLG_MASK 0x80000000
#define READY_FLG_MASK 0x00800000 #define READY_FLG_MASK 0x00800000
@ -107,15 +118,27 @@ extern "C" {
#define START_SHIFT 31 #define START_SHIFT 31
#define START_MASK 0x80000000 #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 #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)\ #define AddLatency2ToLatency1(param)\
( (((param) & LATENCY2_MASK) \ ( (((param) & LATENCY2_MASK) \
>> LATENCY2_SHIFT) \ >> LATENCY2_SHIFT) \
+ ((param) & LATENCY1_MASK) \ + ((param) & LATENCY1_MASK) \
) )
// --- Register Define
#ifndef DEBUG_USED_CARD_SLOT_B_ #ifndef DEBUG_USED_CARD_SLOT_B_
// Slot A // Slot A
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c #define SLOT_STATUS_MODE_SELECT_MSK 0x0c

View File

@ -1,45 +1,62 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlSDK Project: TwlIPL
File: 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 <twl.h>
#include <sysmenu.h> #include <sysmenu.h>
#include <hotswTypes.h> #include <hotswTypes.h>
#include <customNDma.h> #include <customNDma.h>
// Define data -------------------------------------------------------------- // 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 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." );
extern CardThreadData HotSwThreadData;
// Function prototype ------------------------------------------------------- // Function prototype -------------------------------------------------------
static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont); static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont);
static void InterruptCallbackNDma(void);
// =========================================================================== // ===========================================================================
// Function Describe // Function Describe
// =========================================================================== // ===========================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: HOTSW_NDmaCopy_Card Name: HOTSW_NDmaCopy_Card
Description: 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); HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_INC);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: HOTSW_NDmaPipe_Card Name: HOTSW_NDmaPipe_Card
Description: DMA転送で読み捨てる
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size) void HOTSW_NDmaPipe_Card(u32 ndmaNo, const void *src, void *dest, u32 size)
{ {
HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX); HOTSWi_NDmaCopy_Card(ndmaNo, src, dest, size, MI_NDMA_DEST_FIX);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: HOTSWi_NDmaCopy_Card Name: HOTSWi_NDmaCopy_Card
Description: DMA転送の準備
DMA転送の準備をしてからstartフラグを上げてください
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont) static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size, u32 dcont)
{ {
@ -50,23 +67,24 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
ASSERT_DMANO( ndmaNo ); ASSERT_DMANO( ndmaNo );
//---- confirm CARD free //---- confirm CARD free
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){} HOTSW_WaitCardCtrl();
//---- confirm DMA free //---- confirm DMA free
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){ HOTSW_WaitDmaCtrl(ndmaNo);
OS_TPrintf("Dma is busy..\n");
} //---- Handler Set
(void)OS_SetIrqFunction(OS_IE_NDMA2, InterruptCallbackNDma);
//---- set up registers //---- set up registers
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_SAD_WOFFSET ) = (u32)src; 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_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_TCNT_WOFFSET ) = (u32)(size/4);
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1; MI_NDMA_REG( ndmaNo, MI_NDMA_REG_WCNT_WOFFSET ) = NDMA_WORD_COUNT_1;
//---- decide control register //---- decide control register
contData = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE; contData = MI_NDMA_BWORD_1 | MI_NDMA_ENABLE/* | MI_NDMA_CONTINUOUS_ON*/;
contData |= (MI_NDMA_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE); contData |= MI_NDMA_SRC_FIX | dcont | MI_NDMA_SRC_RELOAD_DISABLE | 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
@ -81,3 +99,18 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
(void)OS_RestoreInterrupts( enabled ); (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 Project: TwlIPL
File: dsCardType1.c 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 <twl.h>
#include <firm/os/common/system.h> #include <firm/os/common/system.h>
#include <blowfish.h> #include <blowfish.h>
@ -10,7 +17,7 @@
#include <customNDma.h> #include <customNDma.h>
// extern ------------------------------------------------------------------- // extern -------------------------------------------------------------------
extern CardThreadData s_ctData; extern CardThreadData HotSwThreadData;
// define ------------------------------------------------------------------- // define -------------------------------------------------------------------
#define SECURE_SEGMENT_NUM 4 #define SECURE_SEGMENT_NUM 4
@ -20,17 +27,21 @@ extern CardThreadData s_ctData;
#define ROM_EMULATION_END_OFS 0x180 #define ROM_EMULATION_END_OFS 0x180
// static value ------------------------------------------------------------- // static value -------------------------------------------------------------
//static OSMessage s_Msg; static OSMessage s_Msg;
// Function prototype ------------------------------------------------------- // Function prototype -------------------------------------------------------
static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd); static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd);
static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask); static void PreSendSecureCommand(CardBootData *cbd, u32 *scrambleMask);
// =========================================================================== // ===========================================================================
// Function Describe // Function Describe
// =========================================================================== // ===========================================================================
/*---------------------------------------------------------------------------*
Name: HOTSWi_SetCommand
Description:
*---------------------------------------------------------------------------*/
void HOTSWi_SetCommand(GCDCmd64 *cndLE) void HOTSWi_SetCommand(GCDCmd64 *cndLE)
{ {
GCDCmd64 cndBE; GCDCmd64 cndBE;
@ -57,11 +68,11 @@ void HOTSWi_SetCommand(GCDCmd64 *cndLE)
// ■------------------------------------■ // ■------------------------------------■
// ■ ノーマルモードのコマンド ■ // ■ ノーマルモードのコマンド ■
// ■------------------------------------■ // ■------------------------------------■
/* ----------------------------------------------------------------- /*---------------------------------------------------------------------------*
* ReadIDNormal関数 Name: ReadIDNormal
*
* IDを読み込む関数 Description: IDを読み込む関数
* ----------------------------------------------------------------- */ *---------------------------------------------------------------------------*/
HotSwState ReadIDNormal(CardBootData *cbd) HotSwState ReadIDNormal(CardBootData *cbd)
{ {
GCDCmd64 cndLE; GCDCmd64 cndLE;
@ -75,17 +86,19 @@ HotSwState ReadIDNormal(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | (0x1 & LATENCY1_MASK);
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
@ -146,14 +159,19 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); 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 レジスタ設定 // 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;
#if 0
// DMAが終了するまで待つ
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
#else
// メッセージ受信 // メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#endif
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
page++; page++;
} }
@ -162,11 +180,11 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
} }
/* ----------------------------------------------------------------- /*---------------------------------------------------------------------------*
* ReadStatusNormal関数 Name: ReadStatusNormal
*
* Description:
* ----------------------------------------------------------------- */ *---------------------------------------------------------------------------*/
HotSwState ReadStatusNormal(CardBootData *cbd) HotSwState ReadStatusNormal(CardBootData *cbd)
{ {
GCDCmd64 cndLE; GCDCmd64 cndLE;
@ -186,27 +204,29 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
/* ----------------------------------------------------------------- /*---------------------------------------------------------------------------*
* RefreshBadBlockNormal関数 Name: RefreshBadBlockNormal
*
* Description:
* ----------------------------------------------------------------- */ *---------------------------------------------------------------------------*/
HotSwState RefreshBadBlockNormal(CardBootData *cbd) HotSwState RefreshBadBlockNormal(CardBootData *cbd)
{ {
GCDCmd64 cndLE; GCDCmd64 cndLE;
@ -221,10 +241,14 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT1 レジスタ設定 // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); 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; return HOTSW_SUCCESS;
} }
@ -242,6 +266,7 @@ HotSwState ChangeModeNormal(CardBootData *cbd)
return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG_MODE); return HOTSWi_ChangeModeNormal(cbd, HSWOP_N_OP_CHG_MODE);
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ChangeModeNorma2 * Name: ChangeModeNorma2
* *
@ -271,23 +296,27 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT1 レジスタ設定 // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); 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; return HOTSW_SUCCESS;
} }
/* ----------------------------------------------------------------- /*---------------------------------------------------------------------------*
* LoadTable関数 Name: LoadTable
*
* Key Table Description: Key Table
*
*
*  
* ----------------------------------------------------------------- */ *---------------------------------------------------------------------------*/
HotSwState LoadTable(void) HotSwState LoadTable(void)
{ {
GCDCmd64 cndLE; GCDCmd64 cndLE;
@ -302,17 +331,19 @@ HotSwState LoadTable(void)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK | REG_MI_MCCNT0_I_MASK);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に) // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT); reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_16;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
@ -338,8 +369,11 @@ HotSwState ReadRomEmulationInfo(CardBootData *cbd)
reg_HOTSW_MCCMD0 = 0x3e000000; reg_HOTSW_MCCMD0 = 0x3e000000;
reg_HOTSW_MCCMD1 = 0x0; 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) // 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になるまでループ。 // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
@ -363,7 +397,7 @@ HotSwState ReadRomEmulationInfo(CardBootData *cbd)
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: SetSecureCommand Name: SetSecureCommand
Description: Description: Blowfishで暗号化してレジスタにセット
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) 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){ if(cbd->cardType == DS_CARD_TYPE_2){
u32 latency = (u32)cbd->pBootSegBuf->rh.s.secure_cmd_latency * 0x100; 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 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | *scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; reg_HOTSW_MCCNT1 = START_MASK | *scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
@ -455,14 +492,19 @@ HotSwState ReadIDSecure(CardBootData *cbd)
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_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) );
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; reg_HOTSW_MCCNT1 = START_MASK | HOTSW_PAGE_STAT | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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++; cbd->vbi++;
@ -470,6 +512,7 @@ HotSwState ReadIDSecure(CardBootData *cbd)
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadSegSecure * Name: ReadSegSecure
* *
@ -519,14 +562,19 @@ HotSwState ReadSegSecure(CardBootData *cbd)
// NewDMA転送の準備 // NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size ); 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 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (pc << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param; 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); OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#endif
// DMAが終了するまで待つ
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
// 転送済みページ数 // 転送済みページ数
j++; j++;
@ -542,6 +590,7 @@ HotSwState ReadSegSecure(CardBootData *cbd)
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: SwitchONPNGSecure * Name: SwitchONPNGSecure
* *
@ -564,10 +613,14 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ // コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask); PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); 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++; cbd->vbi++;
@ -575,6 +628,7 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd)
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: SwitchOFFPNGSecure * Name: SwitchOFFPNGSecure
* *
@ -597,10 +651,14 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ // コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask); PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); 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++; cbd->vbi++;
@ -608,6 +666,7 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd)
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ChangeModeSecure * Name: ChangeModeSecure
* *
@ -632,10 +691,14 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
// コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ // コマンド初回送信NTR-MROMはレイテンシクロック設定変更のみ
PreSendSecureCommand(cbd, &scrambleMask); PreSendSecureCommand(cbd, &scrambleMask);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK); 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++; cbd->vbi++;
@ -669,18 +732,24 @@ HotSwState ReadIDGame(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT)); reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadPageGame * Name: ReadPageGame
* *
@ -713,19 +782,25 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 // MCCNT1 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT)); reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | HOTSW_PAGE_1;
// メッセージ受信 #if 0
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); // DMAが終了するまで待つ
HOTSW_WaitDmaCtrl(HOTSW_NDMA_NO);
// DMAが終了するまで待つ #else
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){} // メッセージ受信
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#endif
} }
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadStatusGame * Name: ReadStatusGame
* *
@ -748,18 +823,24 @@ HotSwState ReadStatusGame(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ) // 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 | HOTSW_PAGE_STAT;
// メッセージ受信
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* RefreshBadBlockGame関数 * RefreshBadBlockGame関数
* *
@ -779,10 +860,14 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x0 << PC_SHIFT)); 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 | START_MASK | HOTSW_PAGE_0;
// カードデータ転送終了まで待つ
HOTSW_WaitCardCtrl();
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }

View File

@ -150,7 +150,7 @@ static CardBootFunction s_funcTable[] = {
// Global Values ------------------------------------------------------------ // Global Values ------------------------------------------------------------
BLOWFISH_CTX GCDi_BlowfishInitTableBufDS; BLOWFISH_CTX GCDi_BlowfishInitTableBufDS;
CardThreadData s_ctData; CardThreadData HotSwThreadData;
#include <twl/ltdwram_end.h> #include <twl/ltdwram_end.h>
@ -198,7 +198,7 @@ void HOTSW_Init(u32 threadPrio)
MI_CpuClear8(&s_cbData, sizeof(CardBootData)); MI_CpuClear8(&s_cbData, sizeof(CardBootData));
// カードスレッド用構造体の初期化 // カードスレッド用構造体の初期化
MI_CpuClear8(&s_ctData, sizeof(CardThreadData)); MI_CpuClear8(&HotSwThreadData, sizeof(CardThreadData));
// HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける) // HotSwリソースの排他制御用Lock IDの取得(開放しないで持ち続ける)
{ {
@ -217,22 +217,22 @@ void HOTSW_Init(u32 threadPrio)
} }
// カードブート用スレッドの生成 // カードブート用スレッドの生成
OS_CreateThread(&s_ctData.thread, OS_CreateThread(&HotSwThreadData.thread,
McThread, McThread,
NULL, NULL,
s_ctData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64), HotSwThreadData.stack + HOTSW_THREAD_STACK_SIZE / sizeof(u64),
HOTSW_THREAD_STACK_SIZE, HOTSW_THREAD_STACK_SIZE,
threadPrio 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 バッファの設定 // Boot Segment バッファの設定
HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE ); 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()){ 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{ else{
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE; SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
@ -1193,7 +1193,7 @@ static void McThread(void *arg)
HotSwMessage *msg; HotSwMessage *msg;
while(1){ 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 ) { if( msg->ctrl == TRUE ) {
// [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。 // [TODO]とりあえず、ここでHOTSWを抑制した時点でisExistCardがFALSEなら、HOTSWのFinalizeをするようにする。
@ -1304,15 +1304,15 @@ static void McThread(void *arg)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCard(void) static void InterruptCallbackCard(void)
{ {
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].ctrl = FALSE; HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].ctrl = FALSE;
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].value = 0; HotSwThreadData.hotswPulledOutMsg[HotSwThreadData.idx_pulledOut].value = 0;
s_ctData.hotswPulledOutMsg[s_ctData.idx_pulledOut].type = HOTSW_PULLOUT; 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"); OS_PutString("\n");
} }
@ -1324,15 +1324,15 @@ static void InterruptCallbackCard(void)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void InterruptCallbackCardDet(void) static void InterruptCallbackCardDet(void)
{ {
s_ctData.hotswInsertMsg[s_ctData.idx_insert].ctrl = FALSE; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].ctrl = FALSE;
s_ctData.hotswInsertMsg[s_ctData.idx_insert].value = 0; HotSwThreadData.hotswInsertMsg[HotSwThreadData.idx_insert].value = 0;
s_ctData.hotswInsertMsg[s_ctData.idx_insert].type = HOTSW_INSERT; 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"); OS_PutString("\n");
} }
@ -1345,10 +1345,10 @@ static void InterruptCallbackCardDet(void)
static void InterruptCallbackNDma(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"); OS_PutString("\n");
} }
@ -1366,15 +1366,15 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
d.data = data; d.data = data;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].ctrl = (d.msg.ctrl) ? TRUE : FALSE;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].value = d.msg.value; HotSwThreadData.hotswPxiMsg[HotSwThreadData.idx_ctrl].value = d.msg.value;
s_ctData.hotswPxiMsg[s_ctData.idx_ctrl].type = HOTSW_CONTROL; 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 BOOT_PAGE_NUM 8
#define SECURE_PAGE_NUM 32 #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 レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に) // MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK); reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
#if 0
// DMAが終了するまで待つ // 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; return HOTSW_SUCCESS;
} }
@ -108,14 +119,19 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) // MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000); 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) // 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);
#if 0
// DMAが終了するまで待つ // 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++; page++;
} }
@ -168,10 +184,13 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
// MCCMD レジスタ設定 // MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE); HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 に) // MCCNT1 レジスタ設定 (START = 1 に)
reg_HOTSW_MCCNT1 = START_MASK; reg_HOTSW_MCCNT1 = START_MASK;
while(reg_HOTSW_MCCNT1 & START_MASK){} HOTSW_WaitCardCtrl();
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }