mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・カードデータ転送終了割り込みでスレッドを起こしていたのを、DMAデータ転送終了割り込みで起こすように変更中。(今の所DMAイネーブルフラグのポーリング) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@852 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
4be2d0fdb4
commit
53335a137a
@ -35,7 +35,7 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
|
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
|
||||||
#define HOTSW_DMA_NO 2 //
|
#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル
|
||||||
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
|
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
|
||||||
|
|
||||||
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
|
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
|
||||||
@ -52,6 +52,16 @@ extern "C" {
|
|||||||
#define PNB_L_VALUE 0x879b9b05 //
|
#define PNB_L_VALUE 0x879b9b05 //
|
||||||
#define PNB_H_VALUE 0x5c //
|
#define PNB_H_VALUE 0x5c //
|
||||||
|
|
||||||
|
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
|
||||||
|
#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) // 受信バッファの数
|
||||||
|
|
||||||
|
// コントロールレジスタ0
|
||||||
|
#define HOTSW_E2PROM_CTRL_MASK 0x00ff
|
||||||
|
|
||||||
// コントロールレジスタ1 bit関連
|
// コントロールレジスタ1 bit関連
|
||||||
#define START_FLG_MASK 0x80000000
|
#define START_FLG_MASK 0x80000000
|
||||||
#define READY_FLG_MASK 0x00800000
|
#define READY_FLG_MASK 0x00800000
|
||||||
@ -273,6 +283,28 @@ typedef struct CardBootData{
|
|||||||
BLOWFISH_CTX keyTable;
|
BLOWFISH_CTX keyTable;
|
||||||
} CardBootData;
|
} CardBootData;
|
||||||
|
|
||||||
|
// スレッド・メッセージ関係をまとめた構造体
|
||||||
|
typedef struct CardThreadData{
|
||||||
|
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
|
||||||
|
OSThread thread;
|
||||||
|
|
||||||
|
u32 idx_insert;
|
||||||
|
u32 idx_pulledOut;
|
||||||
|
u32 idx_ctrl;
|
||||||
|
u32 idx_dma;
|
||||||
|
|
||||||
|
OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM];
|
||||||
|
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
|
||||||
|
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
|
||||||
|
HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
|
||||||
|
|
||||||
|
OSMessageQueue hotswQueue;
|
||||||
|
OSMessageQueue hotswDmaQueue;
|
||||||
|
|
||||||
|
OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM];
|
||||||
|
OSMessage hotswDmaMsgBuffer[HOTSW_DMA_MSG_NUM];
|
||||||
|
} CardThreadData;
|
||||||
|
|
||||||
// カード起動用関数
|
// カード起動用関数
|
||||||
typedef struct CardBootFunction {
|
typedef struct CardBootFunction {
|
||||||
HotSwState (*ReadBootSegment_N)(CardBootData *cbd);
|
HotSwState (*ReadBootSegment_N)(CardBootData *cbd);
|
||||||
|
|||||||
@ -22,18 +22,25 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
|
|||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Function Describe
|
// Function Describe
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
// custom CARD DMA
|
Name: HOTSW_NDmaCopy_Card
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
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
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
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
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
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)
|
||||||
{
|
{
|
||||||
u32 contData;
|
u32 contData;
|
||||||
@ -46,7 +53,9 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
|
|||||||
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
|
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
|
||||||
|
|
||||||
//---- confirm DMA free
|
//---- confirm DMA free
|
||||||
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){}
|
while( MI_IsNDmaBusy(ndmaNo) == TRUE ){
|
||||||
|
OS_TPrintf("Dma is busy..\n");
|
||||||
|
}
|
||||||
|
|
||||||
//---- 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;
|
||||||
@ -54,7 +63,7 @@ static void HOTSWi_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 si
|
|||||||
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE;
|
MI_NDMA_REG( ndmaNo, MI_NDMA_REG_BCNT_WOFFSET ) = NDMA_NO_INTERVAL_NORMAL_SCALE;
|
||||||
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 = NDMA_BLOCK_WORD_COUNT_1 | MI_NDMA_ENABLE;
|
||||||
contData |= (MI_NDMA_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE);
|
contData |= (MI_NDMA_SRC_FIX | dcont | MI_NDMA_DEST_RELOAD_DISABLE);
|
||||||
|
|||||||
@ -9,6 +9,9 @@
|
|||||||
#include <dsCardCommon.h>
|
#include <dsCardCommon.h>
|
||||||
#include <customNDma.h>
|
#include <customNDma.h>
|
||||||
|
|
||||||
|
// extern -------------------------------------------------------------------
|
||||||
|
extern CardThreadData s_ctData;
|
||||||
|
|
||||||
// define -------------------------------------------------------------------
|
// define -------------------------------------------------------------------
|
||||||
#define SECURE_SEGMENT_NUM 4
|
#define SECURE_SEGMENT_NUM 4
|
||||||
#define ONE_SEGMENT_PAGE_NUM 8
|
#define ONE_SEGMENT_PAGE_NUM 8
|
||||||
@ -16,6 +19,9 @@
|
|||||||
#define ROM_EMULATION_START_OFS 0x160
|
#define ROM_EMULATION_START_OFS 0x160
|
||||||
#define ROM_EMULATION_END_OFS 0x180
|
#define ROM_EMULATION_END_OFS 0x180
|
||||||
|
|
||||||
|
// static value -------------------------------------------------------------
|
||||||
|
//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);
|
||||||
@ -61,7 +67,7 @@ HotSwState ReadIDNormal(CardBootData *cbd)
|
|||||||
GCDCmd64 cndLE;
|
GCDCmd64 cndLE;
|
||||||
|
|
||||||
// カード割り込みによるDMAコピー
|
// カード割り込みによるDMAコピー
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_RD_ID;
|
cndLE.dw = HSWOP_N_OP_RD_ID;
|
||||||
@ -75,9 +81,12 @@ HotSwState ReadIDNormal(CardBootData *cbd)
|
|||||||
// 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);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,12 +131,12 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
|
|
||||||
if(cbd->modeType == HOTSW_MODE1){
|
if(cbd->modeType == HOTSW_MODE1){
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// NewDMA転送(読み捨て)の準備
|
// NewDMA転送(読み捨て)の準備
|
||||||
// Mode2のときは、データを捨てる。
|
// Mode2のときは、データを捨てる。
|
||||||
HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, size );
|
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, size );
|
||||||
}
|
}
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
@ -140,9 +149,12 @@ HotSwState ReadBootSegNormal(CardBootData *cbd)
|
|||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
page++;
|
page++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +178,7 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// カード割り込みによるDMAコピー
|
// カード割り込みによるDMAコピー
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_RD_STAT;
|
cndLE.dw = HSWOP_N_OP_RD_STAT;
|
||||||
@ -178,11 +190,13 @@ HotSwState ReadStatusNormal(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -208,11 +222,9 @@ HotSwState RefreshBadBlockNormal(CardBootData *cbd)
|
|||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
while(reg_HOTSW_MCCNT1 & START_MASK){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -260,12 +272,10 @@ static HotSwState HOTSWi_ChangeModeNormal(CardBootData *cbd, u64 cmd)
|
|||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) |
|
reg_HOTSW_MCCNT1 = (cbd->gameCommondParam & ~SCRAMBLE_MASK) | START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_MASK){}
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,7 +294,7 @@ HotSwState LoadTable(void)
|
|||||||
u32 temp;
|
u32 temp;
|
||||||
|
|
||||||
// NewDMA転送(読み捨て)の準備
|
// NewDMA転送(読み捨て)の準備
|
||||||
HOTSW_NDmaPipe_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
|
HOTSW_NDmaPipe_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &temp, HOTSW_LOAD_TABLE_SIZE );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_LD_TABLE;
|
cndLE.dw = HSWOP_N_OP_LD_TABLE;
|
||||||
@ -298,9 +308,12 @@ HotSwState LoadTable(void)
|
|||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,14 +333,14 @@ HotSwState ReadRomEmulationData(CardBootData *cbd)
|
|||||||
{
|
{
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
reg_HOTSW_MCCMD0 = 0x3e000000;
|
reg_HOTSW_MCCMD0 = 0x3e000000;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
// 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 | PC_MASK & (0x1 << PC_SHIFT) | (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){
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
@ -340,8 +353,6 @@ HotSwState ReadRomEmulationData(CardBootData *cbd)
|
|||||||
count+=4;
|
count+=4;
|
||||||
}
|
}
|
||||||
|
|
||||||
MI_CpuCopyFast(cbd->romEmuBuf, (void*)HW_ISD_RESERVED, 32);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,14 +453,17 @@ HotSwState ReadIDSecure(CardBootData *cbd)
|
|||||||
PreSendSecureCommand(cbd, &scrambleMask);
|
PreSendSecureCommand(cbd, &scrambleMask);
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_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) );
|
||||||
|
|
||||||
// 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 | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
// コマンドカウンタインクリメント
|
||||||
cbd->vbi++;
|
cbd->vbi++;
|
||||||
|
|
||||||
@ -503,14 +517,17 @@ HotSwState ReadSegSecure(CardBootData *cbd)
|
|||||||
|
|
||||||
for(k=0; k<loop; k++){
|
for(k=0; k<loop; k++){
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
|
||||||
|
|
||||||
// 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;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
// 転送済みページ数
|
// 転送済みページ数
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
@ -521,7 +538,7 @@ HotSwState ReadSegSecure(CardBootData *cbd)
|
|||||||
// コマンドカウンタインクリメント
|
// コマンドカウンタインクリメント
|
||||||
cbd->vbi++;
|
cbd->vbi++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,9 +567,8 @@ HotSwState SwitchONPNGSecure(CardBootData *cbd)
|
|||||||
// 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){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
// コマンドカウンタインクリメント
|
||||||
cbd->vbi++;
|
cbd->vbi++;
|
||||||
|
|
||||||
@ -584,9 +600,8 @@ HotSwState SwitchOFFPNGSecure(CardBootData *cbd)
|
|||||||
// 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){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
// コマンドカウンタインクリメント
|
||||||
cbd->vbi++;
|
cbd->vbi++;
|
||||||
|
|
||||||
@ -620,9 +635,8 @@ HotSwState ChangeModeSecure(CardBootData *cbd)
|
|||||||
// 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){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
// コマンドカウンタインクリメント
|
||||||
cbd->vbi++;
|
cbd->vbi++;
|
||||||
|
|
||||||
@ -647,7 +661,7 @@ HotSwState ReadIDGame(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_G_OP_RD_ID;
|
cndLE.dw = HSWOP_G_OP_RD_ID;
|
||||||
@ -655,13 +669,15 @@ HotSwState ReadIDGame(CardBootData *cbd)
|
|||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,16 +698,13 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
|||||||
loop = (u32)(size / PAGE_SIZE);
|
loop = (u32)(size / PAGE_SIZE);
|
||||||
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
|
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
|
||||||
|
|
||||||
// OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf);
|
|
||||||
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
|
|
||||||
|
|
||||||
for(i=0; i<loop; i++){
|
for(i=0; i<loop; i++){
|
||||||
if(!HOTSW_IsCardAccessible()){
|
if(!HOTSW_IsCardAccessible()){
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
||||||
|
|
||||||
// コマンド作成
|
// コマンド作成
|
||||||
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
||||||
@ -700,12 +713,14 @@ HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
|||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
}
|
}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
@ -725,7 +740,7 @@ HotSwState ReadStatusGame(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, &cbd->romStatus, sizeof(cbd->romStatus) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_G_OP_RD_STAT;
|
cndLE.dw = HSWOP_G_OP_RD_STAT;
|
||||||
@ -734,12 +749,14 @@ HotSwState ReadStatusGame(CardBootData *cbd)
|
|||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// メッセージ受信
|
||||||
OS_SleepThread(NULL);
|
// OS_ReceiveMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK);
|
||||||
|
|
||||||
|
// DMAが終了するまで待つ
|
||||||
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -763,13 +780,9 @@ HotSwState RefreshBadBlockGame(CardBootData *cbd)
|
|||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 000(コマンドのみ) その他Romヘッダの情報におまかせ)
|
||||||
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam | START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
||||||
START_MASK | (PC_MASK & (0x0 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
while(reg_HOTSW_MCCNT1 & START_MASK){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -32,12 +32,6 @@
|
|||||||
|
|
||||||
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
|
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
|
||||||
|
|
||||||
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
|
|
||||||
#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) // 受信バッファの数
|
|
||||||
|
|
||||||
#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF
|
#define SLOT_B_LOCK_BUF HW_CTRDG_LOCK_BUF
|
||||||
|
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
@ -50,23 +44,6 @@
|
|||||||
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// スレッド・メッセージ関係をまとめた構造体
|
|
||||||
typedef struct CardThreadData{
|
|
||||||
u64 stack[HOTSW_THREAD_STACK_SIZE / sizeof(u64)];
|
|
||||||
OSThread thread;
|
|
||||||
|
|
||||||
u32 idx_insert;
|
|
||||||
u32 idx_pulledOut;
|
|
||||||
u32 idx_ctrl;
|
|
||||||
|
|
||||||
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
|
|
||||||
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
|
|
||||||
HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
|
|
||||||
OSMessageQueue hotswQueue;
|
|
||||||
OSMessage hotswMsgBuffer[HOTSW_MSG_BUFFER_NUM];
|
|
||||||
}
|
|
||||||
CardThreadData;
|
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
static BOOL IsSwap(void);
|
static BOOL IsSwap(void);
|
||||||
static u32 GetMcSlotShift(void);
|
static u32 GetMcSlotShift(void);
|
||||||
@ -80,7 +57,7 @@ static void SetInterrupt(void);
|
|||||||
|
|
||||||
static void InterruptCallbackCard(void);
|
static void InterruptCallbackCard(void);
|
||||||
static void InterruptCallbackCardDet(void);
|
static void InterruptCallbackCardDet(void);
|
||||||
static void InterruptCallbackCardData(void);
|
static void InterruptCallbackNDma(void);
|
||||||
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
|
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
|
||||||
|
|
||||||
static void LockHotSwRsc(OSLockWord* word);
|
static void LockHotSwRsc(OSLockWord* word);
|
||||||
@ -128,7 +105,7 @@ static u32 *s_pSecureSegBuffer; //
|
|||||||
static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく
|
static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく
|
||||||
|
|
||||||
static CardBootData s_cbData;
|
static CardBootData s_cbData;
|
||||||
static CardThreadData s_ctData;
|
CardThreadData s_ctData;
|
||||||
|
|
||||||
// HMACSHA1の鍵
|
// HMACSHA1の鍵
|
||||||
static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
||||||
@ -213,7 +190,7 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
|
// PXI経由でARM7にチャッタリングカウンタ・カウンタAの値を設定してもらう。設定されるまで待つ。
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// カードブート用構造体の初期化
|
// カードブート用構造体の初期化
|
||||||
MI_CpuClear8(&s_cbData, sizeof(CardBootData));
|
MI_CpuClear8(&s_cbData, sizeof(CardBootData));
|
||||||
|
|
||||||
@ -247,6 +224,9 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
|
|
||||||
// メッセージキューの初期化
|
// メッセージキューの初期化
|
||||||
OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM );
|
OS_InitMessageQueue( &s_ctData.hotswQueue, &s_ctData.hotswMsgBuffer[0], HOTSW_MSG_BUFFER_NUM );
|
||||||
|
|
||||||
|
// メッセージキューの初期化
|
||||||
|
OS_InitMessageQueue( &s_ctData.hotswDmaQueue, &s_ctData.hotswDmaMsgBuffer[0], HOTSW_DMA_MSG_NUM );
|
||||||
|
|
||||||
// スレッド起動
|
// スレッド起動
|
||||||
OS_WakeupThreadDirect(&s_ctData.thread);
|
OS_WakeupThreadDirect(&s_ctData.thread);
|
||||||
@ -313,8 +293,8 @@ static HotSwState LoadCardData(void)
|
|||||||
// ロード処理開始
|
// ロード処理開始
|
||||||
if(HOTSW_IsCardAccessible()){
|
if(HOTSW_IsCardAccessible()){
|
||||||
// カード側でKey Tableをロードする
|
// カード側でKey Tableをロードする
|
||||||
state = LoadTable();
|
state = LoadTable();
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// ---------------------- Normal Mode ----------------------
|
// ---------------------- Normal Mode ----------------------
|
||||||
romMode = HOTSW_ROM_MODE_NORMAL;
|
romMode = HOTSW_ROM_MODE_NORMAL;
|
||||||
@ -339,7 +319,7 @@ static HotSwState LoadCardData(void)
|
|||||||
|
|
||||||
// Romエミュレーション情報を取得
|
// Romエミュレーション情報を取得
|
||||||
state = ReadRomEmulationData(&s_cbData);
|
state = ReadRomEmulationData(&s_cbData);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// 取得したRomエミュレーション情報を比較
|
// 取得したRomエミュレーション情報を比較
|
||||||
s_cbData.debuggerFlg = TRUE;
|
s_cbData.debuggerFlg = TRUE;
|
||||||
@ -887,7 +867,7 @@ static HotSwState DecryptObjectFile(void)
|
|||||||
else{
|
else{
|
||||||
retval = HOTSW_DATA_DECRYPT_ERROR;
|
retval = HOTSW_DATA_DECRYPT_ERROR;
|
||||||
|
|
||||||
MI_NDmaFill( HOTSW_DMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア
|
MI_NDmaFill( HOTSW_NDMA_NO, pEncBuf, UNDEF_CODE, (u32)size ); // 未定義コードでクリア
|
||||||
}
|
}
|
||||||
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
|
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
|
||||||
|
|
||||||
@ -1276,14 +1256,19 @@ static void InterruptCallbackCardDet(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: InterruptCallbackCardData
|
Name: InterruptCallbackNDma
|
||||||
|
|
||||||
Description: カードB データ転送終了割り込みハンドラ
|
Description: カードB データ転送終了割り込みハンドラ
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static void InterruptCallbackCardData(void)
|
static void InterruptCallbackNDma(void)
|
||||||
{
|
{
|
||||||
// データ転送終了待ちまで寝ていたのを起こす
|
// メッセージ送信
|
||||||
OS_WakeupThreadDirect(&s_ctData.thread);
|
// OS_SendMessage(&s_ctData.hotswDmaQueue, (OSMessage *)&s_ctData.hotswDmaMsg[s_ctData.idx_dma], OS_MESSAGE_NOBLOCK);
|
||||||
|
|
||||||
|
// メッセージインデックスをインクリメント
|
||||||
|
// s_ctData.idx_dma = (s_ctData.idx_dma+1) % HOTSW_DMA_MSG_NUM;
|
||||||
|
|
||||||
|
OS_PutString("▽\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -1400,11 +1385,11 @@ static void SetInterrupt(void)
|
|||||||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||||
SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard );
|
SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard );
|
||||||
SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet );
|
SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet );
|
||||||
SetInterruptCallback( OS_IE_CARD_A_DATA , InterruptCallbackCardData ); // DMA転送終了割り込み使う
|
SetInterruptCallback( OS_IE_NDMA2 , InterruptCallbackNDma );
|
||||||
#else
|
#else
|
||||||
SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard );
|
SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard );
|
||||||
SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet );
|
SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet );
|
||||||
SetInterruptCallback( OS_IE_CARD_B_DATA , InterruptCallbackCardData ); // DMA転送終了割り込み使う
|
SetInterruptCallback( OS_IE_NDMA2 , InterruptCallbackNDma );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -61,7 +61,7 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// カード割り込みによるDMAコピー
|
// カード割り込みによるDMAコピー
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_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) );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_RD_ID;
|
cndLE.dw = HSWOP_N_OP_RD_ID;
|
||||||
@ -75,8 +75,8 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// 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);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// DMAが終了するまで待つ
|
||||||
OS_SleepThread(NULL);
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)cbd->pSecureSegBuf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
// リトルエンディアンで作って
|
||||||
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
cndLE.dw = HSWOP_N_OP_RD_PAGE;
|
||||||
@ -114,8 +114,8 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd)
|
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// DMAが終了するまで待つ
|
||||||
OS_SleepThread(NULL);
|
while( MI_IsNDmaBusy(HOTSW_NDMA_NO) == TRUE ){}
|
||||||
|
|
||||||
page++;
|
page++;
|
||||||
}
|
}
|
||||||
@ -171,8 +171,7 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// MCCNT1 レジスタ設定 (START = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK;
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
while(reg_HOTSW_MCCNT1 & START_MASK){}
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user