mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
5741ed8cbb
commit
41158cfed8
@ -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
|
||||
// ===========================================================================
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user