mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・カード読み関数を統一(完成途中) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@789 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
0c81e7e981
commit
c2135086c0
@ -33,10 +33,10 @@ SRCS = blowfish.c \
|
|||||||
hotsw.c \
|
hotsw.c \
|
||||||
ds_blowfish_table.c \
|
ds_blowfish_table.c \
|
||||||
dsCardCommon.c \
|
dsCardCommon.c \
|
||||||
dsCardType1.c \
|
|
||||||
dsCardType2.c \
|
|
||||||
romEmulation.c \
|
romEmulation.c \
|
||||||
customNDma.c \
|
customNDma.c \
|
||||||
|
# dsCardType1.c \
|
||||||
|
# dsCardType2.c \
|
||||||
|
|
||||||
TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a
|
TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,9 @@ extern "C" {
|
|||||||
// DSカードのノーマルモードのID読み込み
|
// DSカードのノーマルモードのID読み込み
|
||||||
HotSwState ReadIDNormal(CardBootData *cbd);
|
HotSwState ReadIDNormal(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||||
|
HotSwState ReadBootSegNormal(CardBootData *cbd);
|
||||||
|
|
||||||
// DSカードType1のノーマルモードのモード変更
|
// DSカードType1のノーマルモードのモード変更
|
||||||
HotSwState ChangeModeNormal(CardBootData *cbd);
|
HotSwState ChangeModeNormal(CardBootData *cbd);
|
||||||
|
|
||||||
@ -29,6 +32,23 @@ HotSwState LoadTable(void);
|
|||||||
HotSwState ReadRomEmulationData(CardBootData *cbd);
|
HotSwState ReadRomEmulationData(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
|
// ■ セキュアモードのコマンド ■
|
||||||
|
// DSカードのセキュアモードのID読み込み
|
||||||
|
HotSwState ReadIDSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのセキュアモードのSecure Segment(16Kbyte)読み込み
|
||||||
|
HotSwState ReadSegSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのセキュアモードのPNジェネレータON
|
||||||
|
HotSwState SwitchONPNGSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのセキュアモードのPNジェネレータOFF
|
||||||
|
HotSwState SwitchOFFPNGSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのセキュアモードのモード変更
|
||||||
|
HotSwState ChangeModeSecure(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
// ■ ゲームモードのコマンド ■
|
// ■ ゲームモードのコマンド ■
|
||||||
// DSカードのゲームモードのID読み込み
|
// DSカードのゲームモードのID読み込み
|
||||||
HotSwState ReadIDGame(CardBootData *cbd);
|
HotSwState ReadIDGame(CardBootData *cbd);
|
||||||
|
|||||||
@ -1,45 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Project: TwlSDK
|
|
||||||
File:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
#ifndef __HOTSW_DSCARD_TYPE1_H__
|
|
||||||
#define __HOTSW_DSCARD_TYPE1_H__
|
|
||||||
|
|
||||||
#include <twl.h>
|
|
||||||
#include <hotswTypes.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ===========================================================================
|
|
||||||
// Function Describe
|
|
||||||
// ===========================================================================
|
|
||||||
|
|
||||||
// ■ ノーマルモードのコマンド ■
|
|
||||||
// DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み
|
|
||||||
HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
|
|
||||||
// ■ セキュアモードのコマンド ■
|
|
||||||
// DSカードType1のセキュアモードのID読み込み
|
|
||||||
HotSwState ReadIDSecure_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み
|
|
||||||
HotSwState ReadSegSecure_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType1のセキュアモードのPNジェネレータON
|
|
||||||
HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType1のセキュアモードのPNジェネレータOFF
|
|
||||||
HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType1のセキュアモードのモード変更
|
|
||||||
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __HOTSW_DSCARD_TYPE1_H__
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Project: TwlSDK
|
|
||||||
File:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
#ifndef __HOTSW_DSCARD_TYPE2_H__
|
|
||||||
#define __HOTSW_DSCARD_TYPE2_H__
|
|
||||||
|
|
||||||
#include <twl.h>
|
|
||||||
#include <hotswTypes.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ===========================================================================
|
|
||||||
// Function Describe
|
|
||||||
// ===========================================================================
|
|
||||||
// ■ ノーマルモードのコマンド ■
|
|
||||||
// DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み
|
|
||||||
HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
|
|
||||||
// ■ セキュアモードのコマンド ■
|
|
||||||
// DSカードType2のセキュアモードのID読み込み
|
|
||||||
HotSwState ReadIDSecure_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType2のセキュアモードのSecure Segment(16Kbyte)読み込み
|
|
||||||
HotSwState ReadSegSecure_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType2のセキュアモードのPNジェネレータON
|
|
||||||
HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType2のセキュアモードのPNジェネレータOFF
|
|
||||||
HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType2のセキュアモードのモード変更
|
|
||||||
HotSwState ChangeModeSecure_DSType2(CardBootData *cbd);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __HOTSW_DSCARD_TYPE2_H__
|
|
||||||
@ -230,6 +230,7 @@ typedef struct CardBootData{
|
|||||||
|
|
||||||
u32 id_nml;
|
u32 id_nml;
|
||||||
u32 id_scr;
|
u32 id_scr;
|
||||||
|
u32 id_scr2;
|
||||||
u32 id_gam;
|
u32 id_gam;
|
||||||
|
|
||||||
u32 arm9StcSize;
|
u32 arm9StcSize;
|
||||||
@ -249,12 +250,14 @@ typedef struct CardBootData{
|
|||||||
u32 keyBuf[KEY_BUF_SIZE];
|
u32 keyBuf[KEY_BUF_SIZE];
|
||||||
|
|
||||||
CardTypeEx cardType;
|
CardTypeEx cardType;
|
||||||
|
ModeType modeType;
|
||||||
u32 secureLatency;
|
u32 secureLatency;
|
||||||
u32 gameCommondParam;
|
u32 gameCommondParam;
|
||||||
|
|
||||||
BootSegmentData *pBootSegBuf;
|
BootSegmentData *pBootSegBuf;
|
||||||
u32 *pSecureSegBuf;
|
u32 *pSecureSegBuf;
|
||||||
|
u32 *pSecure2SegBuf;
|
||||||
|
|
||||||
BLOWFISH_CTX keyTable;
|
BLOWFISH_CTX keyTable;
|
||||||
} CardBootData;
|
} CardBootData;
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,10 @@
|
|||||||
#include <customNDma.h>
|
#include <customNDma.h>
|
||||||
|
|
||||||
// define -------------------------------------------------------------------
|
// define -------------------------------------------------------------------
|
||||||
|
#define SECURE_SEGMENT_NUM 4
|
||||||
|
#define ONE_SEGMENT_PAGE_NUM 8
|
||||||
|
#define COMMAND_DECRYPTION_WAIT 25 // 25ms
|
||||||
|
|
||||||
#define ROM_EMULATION_START_OFS 0x160
|
#define ROM_EMULATION_START_OFS 0x160
|
||||||
#define ROM_EMULATION_END_OFS 0x180
|
#define ROM_EMULATION_END_OFS 0x180
|
||||||
|
|
||||||
@ -48,6 +52,91 @@ HotSwState ReadIDNormal(CardBootData *cbd)
|
|||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ReadBootSegNormal
|
||||||
|
*
|
||||||
|
* Description: Type1のノーマルモードのBoot Segment読み込み
|
||||||
|
*
|
||||||
|
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadBootSegNormal(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 i, loop, pc, size;
|
||||||
|
u32 *dst = cbd->pBootSegBuf->word;
|
||||||
|
u32 temp;
|
||||||
|
u64 page = 0;
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_1){
|
||||||
|
loop = 0x1UL;
|
||||||
|
pc = 0x4UL;
|
||||||
|
size = BOOT_SEGMENT_SIZE;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
loop = ONE_SEGMENT_PAGE_NUM;
|
||||||
|
pc = 0x1UL;
|
||||||
|
size = PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// secure2モード移行の為、Boot Segmentを1ページ分読み込む。データは捨てバッファに格納
|
||||||
|
if(cbd->modeType == HOTSW_MODE2){
|
||||||
|
loop = 0x1UL;
|
||||||
|
pc = 0x1UL;
|
||||||
|
size = PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<loop; i++){
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
cndLE.dw = 0x0 << 24;
|
||||||
|
cndLE.dw |= page << 33;
|
||||||
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
cndBE.b[0] = cndLE.b[7];
|
||||||
|
cndBE.b[1] = cndLE.b[6];
|
||||||
|
cndBE.b[2] = cndLE.b[5];
|
||||||
|
cndBE.b[3] = cndLE.b[4];
|
||||||
|
cndBE.b[4] = cndLE.b[3];
|
||||||
|
cndBE.b[5] = cndLE.b[2];
|
||||||
|
cndBE.b[6] = cndLE.b[1];
|
||||||
|
cndBE.b[7] = cndLE.b[0];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
||||||
|
|
||||||
|
if(cbd->modeType == HOTSW_MODE1){
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, dst + (u32)(PAGE_WORD_SIZE*i), size );
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (pc << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// Mode2のときは、データを捨てる。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
temp = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
* Name: ChangeModeNormal
|
* Name: ChangeModeNormal
|
||||||
*
|
*
|
||||||
@ -168,6 +257,343 @@ HotSwState ReadRomEmulationData(CardBootData *cbd)
|
|||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ■--------------------------------------■
|
||||||
|
// ■ セキュアモードのコマンド ■
|
||||||
|
// ■--------------------------------------■
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SetSecureCommand
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
||||||
|
{
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
u64 data;
|
||||||
|
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||||
|
data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae;
|
||||||
|
|
||||||
|
cndLE.dw = cbd->vbi;
|
||||||
|
cndLE.dw |= data << 20;
|
||||||
|
|
||||||
|
// comannd0部分
|
||||||
|
switch(type){
|
||||||
|
case S_RD_ID:
|
||||||
|
cndLE.dw |= 0x1000000000000000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_PNG_ON:
|
||||||
|
cndLE.dw |= 0x4000000000000000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_PNG_OFF:
|
||||||
|
cndLE.dw |= 0x6000000000000000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_CHG_MODE:
|
||||||
|
cndLE.dw |= 0xa000000000000000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!cbd->debuggerFlg){
|
||||||
|
// コマンドの暗号化
|
||||||
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
|
cndBE.b[7] = cndLE.b[0];
|
||||||
|
cndBE.b[6] = cndLE.b[1];
|
||||||
|
cndBE.b[5] = cndLE.b[2];
|
||||||
|
cndBE.b[4] = cndLE.b[3];
|
||||||
|
cndBE.b[3] = cndLE.b[4];
|
||||||
|
cndBE.b[2] = cndLE.b[5];
|
||||||
|
cndBE.b[1] = cndLE.b[6];
|
||||||
|
cndBE.b[0] = cndLE.b[7];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ReadIDSecure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadIDSecure(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 scrambleMask;
|
||||||
|
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// スクランブルの設定
|
||||||
|
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
|
||||||
|
// コマンド作成・設定
|
||||||
|
SetSecureCommand(S_RD_ID, cbd);
|
||||||
|
|
||||||
|
// ★ 3DM対応
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// 25ms待ち
|
||||||
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
|
}
|
||||||
|
// ★ MROM対応
|
||||||
|
else{
|
||||||
|
scrambleMask |= TRM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
// コマンドカウンタインクリメント
|
||||||
|
cbd->vbi++;
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ReadSegSecure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadSegSecure(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf;
|
||||||
|
u32 loop, pc, size, interval, i, j=0, k;
|
||||||
|
u64 segNum = 4;
|
||||||
|
u64 vae = cbd->vae;
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_1){
|
||||||
|
loop = 0x1UL;
|
||||||
|
pc = 0x4UL;
|
||||||
|
size = ONE_SEGMENT_SIZE;
|
||||||
|
interval = ONE_SEGMENT_WORD_SIZE;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
loop = ONE_SEGMENT_PAGE_NUM;
|
||||||
|
pc = 0x1UL;
|
||||||
|
size = PAGE_SIZE;
|
||||||
|
interval = PAGE_WORD_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<SECURE_SEGMENT_NUM; i++){
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
cndLE.dw = cbd->vbi;
|
||||||
|
cndLE.dw |= vae << 20;
|
||||||
|
cndLE.dw |= segNum << 44;
|
||||||
|
cndLE.dw |= 0x2000000000000000;
|
||||||
|
|
||||||
|
// コマンドの暗号化
|
||||||
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
|
cndBE.b[7] = cndLE.b[0];
|
||||||
|
cndBE.b[6] = cndLE.b[1];
|
||||||
|
cndBE.b[5] = cndLE.b[2];
|
||||||
|
cndBE.b[4] = cndLE.b[3];
|
||||||
|
cndBE.b[3] = cndLE.b[4];
|
||||||
|
cndBE.b[2] = cndLE.b[5];
|
||||||
|
cndBE.b[1] = cndLE.b[6];
|
||||||
|
cndBE.b[0] = cndLE.b[7];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// 25ms待ち
|
||||||
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// MROM対応
|
||||||
|
scrambleMask |= TRM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(k=0; k<loop; k++){
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, buf + (interval*j), size );
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (pc << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
// 転送済みページ数
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 読み込みセグメント番号インクリメント
|
||||||
|
segNum++;
|
||||||
|
|
||||||
|
// コマンドカウンタインクリメント
|
||||||
|
cbd->vbi++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: SwitchONPNGSecure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState SwitchONPNGSecure(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 scrambleMask;
|
||||||
|
|
||||||
|
if(!HOTSW_IsCardExist()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// スクランブルの設定
|
||||||
|
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
|
||||||
|
// コマンド作成・設定
|
||||||
|
SetSecureCommand(S_PNG_ON, cbd);
|
||||||
|
|
||||||
|
// ★ 3DM対応
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// 25ms待ち
|
||||||
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
|
}
|
||||||
|
// ★ MROM対応
|
||||||
|
else{
|
||||||
|
scrambleMask |= TRM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
// コマンドカウンタインクリメント
|
||||||
|
cbd->vbi++;
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: SwitchOFFPNGSecure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState SwitchOFFPNGSecure(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 scrambleMask;
|
||||||
|
|
||||||
|
if(!HOTSW_IsCardExist()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// スクランブルの設定
|
||||||
|
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
|
||||||
|
// コマンド作成・設定
|
||||||
|
SetSecureCommand(S_PNG_OFF, cbd);
|
||||||
|
|
||||||
|
// ★ 3DM対応
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// 25ms待ち
|
||||||
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
|
}
|
||||||
|
// ★ MROM対応
|
||||||
|
else{
|
||||||
|
scrambleMask |= TRM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
// コマンドカウンタインクリメント
|
||||||
|
cbd->vbi++;
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ChangeModeSecure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ChangeModeSecure(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 scrambleMask;
|
||||||
|
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// スクランブルの設定
|
||||||
|
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
|
||||||
|
// コマンド作成・設定
|
||||||
|
SetSecureCommand(S_CHG_MODE, cbd);
|
||||||
|
|
||||||
|
// ★ 3DM対応
|
||||||
|
if(cbd->cardType == DS_CARD_TYPE_2){
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
||||||
|
|
||||||
|
// 25ms待ち
|
||||||
|
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
||||||
|
}
|
||||||
|
// ★ MROM対応
|
||||||
|
else{
|
||||||
|
scrambleMask |= TRM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param | (cbd->secureLatency & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
// コマンドカウンタインクリメント
|
||||||
|
cbd->vbi++;
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
// ■ ゲームモードのコマンド ■
|
// ■ ゲームモードのコマンド ■
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
|
|||||||
@ -1,319 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Project: TwlSDK
|
|
||||||
File: dsCardType1.c
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <twl.h>
|
|
||||||
#include <blowfish.h>
|
|
||||||
#include <dsCardType1.h>
|
|
||||||
#include <customNDma.h>
|
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
|
|
||||||
static void SetMCSCR(void);
|
|
||||||
|
|
||||||
|
|
||||||
// ===========================================================================
|
|
||||||
// Function Describe
|
|
||||||
// ===========================================================================
|
|
||||||
|
|
||||||
// ■--------------------------------------■
|
|
||||||
// ■ ノーマルモードのコマンド ■
|
|
||||||
// ■--------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ReadIDNormal_DSType1
|
|
||||||
|
|
||||||
Description: Type1のノーマルモードのID読み込み
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadBootSegNormal_DSType1
|
|
||||||
*
|
|
||||||
* Description: Type1のノーマルモードのBoot Segment読み込み
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadBootSegNormal_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE );
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x00000000;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x4 << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ■--------------------------------------■
|
|
||||||
// ■ セキュアモードのコマンド ■
|
|
||||||
// ■--------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: SetSecureCommand
|
|
||||||
|
|
||||||
Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|
||||||
{
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
u64 data;
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae;
|
|
||||||
|
|
||||||
cndLE.dw = cbd->vbi;
|
|
||||||
cndLE.dw |= data << 20;
|
|
||||||
|
|
||||||
// comannd0部分
|
|
||||||
switch(type){
|
|
||||||
case S_RD_ID:
|
|
||||||
cndLE.dw |= 0x1000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_PNG_ON:
|
|
||||||
cndLE.dw |= 0x4000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_PNG_OFF:
|
|
||||||
cndLE.dw |= 0x6000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_CHG_MODE:
|
|
||||||
cndLE.dw |= 0xa000000000000000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!cbd->debuggerFlg){
|
|
||||||
// コマンドの暗号化
|
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadIDSecure_DSType1
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadIDSecure_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_RD_ID, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
// (START = 1 TRM = 1 PC = 111(ステータスリード) 後はRomヘッダ情報にお任せ)
|
|
||||||
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
|
|
||||||
| START_MASK | TRM_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK ;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadSegSecure_DSType1
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadSegSecure_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 i,j=0;
|
|
||||||
u64 segNum = 4;
|
|
||||||
u64 vae = cbd->vae;
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
for(i=0; i<4; i++){
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (cbd->pSecureSegBuf + ONE_SEGMENT_WORD_SIZE*i), ONE_SEGMENT_SIZE );
|
|
||||||
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
cndLE.dw = cbd->vbi;
|
|
||||||
cndLE.dw |= vae << 20;
|
|
||||||
cndLE.dw |= segNum << 44;
|
|
||||||
cndLE.dw |= 0x2000000000000000;
|
|
||||||
|
|
||||||
// コマンドの暗号化
|
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
// (START = 1 TRM = 1 PC = 100(8ページリード) 後はRomヘッダ情報にお任せ)
|
|
||||||
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param
|
|
||||||
| START_MASK | TRM_MASK | PC_MASK & (0x4 << PC_SHIFT) | SE_MASK | DS_MASK;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// 読み込みセグメント番号インクリメント
|
|
||||||
segNum++;
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: SwitchONPNGSecure_DSType1
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState SwitchONPNGSecure_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_PNG_ON, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
|
||||||
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: SwitchOFFPNGSecure_DSType1
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_PNG_OFF, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
|
||||||
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ChangeModeSecure_DSType1
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_CHG_MODE, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = (cbd->pBootSegBuf->rh.s.secure_cmd_param & CT_MASK) |
|
|
||||||
START_MASK | TRM_MASK | SE_MASK | DS_MASK | (cbd->secureLatency & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ■------------------------------------■
|
|
||||||
// ■ ゲームモードのコマンド ■
|
|
||||||
// ■------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadIDGame_DSType1
|
|
||||||
*
|
|
||||||
* Description: ゲームモードでIDを読み込む
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadPageGame_DSType1
|
|
||||||
*
|
|
||||||
* Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
|
||||||
*
|
|
||||||
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
@ -1,434 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Project: TwlSDK
|
|
||||||
File: dsCardType2.c
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <twl.h>
|
|
||||||
#include <blowfish.h>
|
|
||||||
#include <dsCardType2.h>
|
|
||||||
#include <customNDma.h>
|
|
||||||
|
|
||||||
// Define Data --------------------------------------------------------------
|
|
||||||
#define SECURE_SEGMENT_NUM 4
|
|
||||||
#define ONE_SEGMENT_PAGE_NUM 8
|
|
||||||
#define COMMAND_DECRYPTION_WAIT 25 // 25ms
|
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
|
|
||||||
static void SetMCSCR(void);
|
|
||||||
|
|
||||||
|
|
||||||
// ===========================================================================
|
|
||||||
// Function Describe
|
|
||||||
// ===========================================================================
|
|
||||||
|
|
||||||
// ■--------------------------------------■
|
|
||||||
// ■ ノーマルモードのコマンド ■
|
|
||||||
// ■--------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ReadIDNormal_DSType2
|
|
||||||
|
|
||||||
Description: Type2のノーマルモードのID読み込み
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadBootSegNormal_DSType2
|
|
||||||
*
|
|
||||||
* Description: Type2のノーマルモードのBoot Segment読み込み
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x1fff Latency2=0x3f Pagecount=8page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadBootSegNormal_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 i = 0;
|
|
||||||
u32 loop = ONE_SEGMENT_PAGE_NUM;
|
|
||||||
u32 *dst = cbd->pBootSegBuf->word;
|
|
||||||
u64 page = 0;
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
for(i=0; i<ONE_SEGMENT_PAGE_NUM; i++){
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pBootSegBuf->word + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// リトルエンディアンで作って
|
|
||||||
cndLE.dw = 0x0 << 24;
|
|
||||||
cndLE.dw |= page << 33;
|
|
||||||
|
|
||||||
// ビックエンディアンにする
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32 *)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32 *)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | LATENCY2_MASK | LATENCY1_MASK;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
page++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ChangeModeNormal_DSType2
|
|
||||||
*
|
|
||||||
* Description: Type2のノーマルモードのモード変更
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x18 Latency2=0 Pagecount=0page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
|
|
||||||
// ■--------------------------------------■
|
|
||||||
// ■ セキュアモードのコマンド ■
|
|
||||||
// ■--------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: SetSecureCommand
|
|
||||||
|
|
||||||
Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|
||||||
{
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
u64 data;
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae;
|
|
||||||
|
|
||||||
cndLE.dw = cbd->vbi;
|
|
||||||
cndLE.dw |= data << 20;
|
|
||||||
|
|
||||||
// comannd0部分
|
|
||||||
switch(type){
|
|
||||||
case S_RD_ID:
|
|
||||||
cndLE.dw |= 0x1000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_PNG_ON:
|
|
||||||
cndLE.dw |= 0x4000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_PNG_OFF:
|
|
||||||
cndLE.dw |= 0x6000000000000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_CHG_MODE:
|
|
||||||
cndLE.dw |= 0xa000000000000000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!cbd->debuggerFlg){
|
|
||||||
// コマンドの暗号化
|
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadIDSecure_DSType2
|
|
||||||
*
|
|
||||||
* Description: デバッガを読み込んだ場合はSCRAMBLE_MASK -> CS SE DS をマスク
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=Status
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadIDSecure_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 scrambleMask;
|
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// スクランブルの設定
|
|
||||||
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_RD_ID, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// 25ms待ち
|
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadSegSecure_DSType2
|
|
||||||
*
|
|
||||||
* Description: Secure領域を読み込む関数
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=1page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ReadSegSecure_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 i,j=0,k;
|
|
||||||
u64 segNum = 4;
|
|
||||||
u64 vae = cbd->vae;
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
// スクランブルの設定
|
|
||||||
u32 scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
|
||||||
|
|
||||||
for(i=0; i<SECURE_SEGMENT_NUM; i++){
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
cndLE.dw = cbd->vbi;
|
|
||||||
cndLE.dw |= vae << 20;
|
|
||||||
cndLE.dw |= segNum << 44;
|
|
||||||
cndLE.dw |= 0x2000000000000000;
|
|
||||||
|
|
||||||
// コマンドの暗号化
|
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
cndBE.b[7] = cndLE.b[0];
|
|
||||||
cndBE.b[6] = cndLE.b[1];
|
|
||||||
cndBE.b[5] = cndLE.b[2];
|
|
||||||
cndBE.b[4] = cndLE.b[3];
|
|
||||||
cndBE.b[3] = cndLE.b[4];
|
|
||||||
cndBE.b[2] = cndLE.b[5];
|
|
||||||
cndBE.b[1] = cndLE.b[6];
|
|
||||||
cndBE.b[0] = cndLE.b[7];
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
|
||||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// 25ms待ち
|
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
|
||||||
|
|
||||||
for(k=0; k<ONE_SEGMENT_PAGE_NUM; k++){
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pSecureSegBuf + (PAGE_WORD_SIZE * j), PAGE_SIZE );
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// 転送済みページ数
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 読み込みセグメント番号インクリメント
|
|
||||||
segNum++;
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: SwitchONPNGSecure_DSType2
|
|
||||||
*
|
|
||||||
* Description: PNジェネレータをONにする
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState SwitchONPNGSecure_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 scrambleMask;
|
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// スクランブルの設定
|
|
||||||
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_PNG_ON, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// 25ms待ち
|
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: SwitchOFFPNGSecure_DSType2
|
|
||||||
*
|
|
||||||
* Description: PNジェネレータをOFFする
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 scrambleMask;
|
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// スクランブルの設定
|
|
||||||
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_PNG_OFF, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// 25ms待ち
|
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ChangeModeSecure_DSType2
|
|
||||||
*
|
|
||||||
* Description: Gameモードに移行する
|
|
||||||
*
|
|
||||||
* CT=240ns Latency1=0x8f8+0x18 Latency2=0 Pagecount=0page
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
|
|
||||||
{
|
|
||||||
u32 scrambleMask;
|
|
||||||
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// スクランブルの設定
|
|
||||||
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK);
|
|
||||||
|
|
||||||
// コマンド作成・設定
|
|
||||||
SetSecureCommand(S_CHG_MODE, cbd);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// 25ms待ち
|
|
||||||
OS_Sleep(COMMAND_DECRYPTION_WAIT);
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 SE = 1 DS = 1 Latency1 = 0 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | scrambleMask | cbd->pBootSegBuf->rh.s.secure_cmd_param;
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
// コマンドカウンタインクリメント
|
|
||||||
cbd->vbi++;
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ■------------------------------------■
|
|
||||||
// ■ ゲームモードのコマンド ■
|
|
||||||
// ■------------------------------------■
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ReadIDGame_DSType2
|
|
||||||
|
|
||||||
Description: ゲームモードでIDを読み込む
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
* Name: ReadPageGame_DSType2
|
|
||||||
*
|
|
||||||
* Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
// 共通
|
|
||||||
@ -17,8 +17,6 @@
|
|||||||
#include <hotswTypes.h>
|
#include <hotswTypes.h>
|
||||||
#include <blowfish.h>
|
#include <blowfish.h>
|
||||||
#include <dsCardCommon.h>
|
#include <dsCardCommon.h>
|
||||||
#include <dsCardType1.h>
|
|
||||||
#include <dsCardType2.h>
|
|
||||||
#include <romEmulation.h>
|
#include <romEmulation.h>
|
||||||
#include <customNDma.h>
|
#include <customNDma.h>
|
||||||
#include <../build/libraries/mb/common/include/mb_fileinfo.h>
|
#include <../build/libraries/mb/common/include/mb_fileinfo.h>
|
||||||
@ -117,16 +115,17 @@ static void ShowRomHeaderData(void);
|
|||||||
static void DebugPrintErrorMessage(HotSwState state);
|
static void DebugPrintErrorMessage(HotSwState state);
|
||||||
|
|
||||||
// Static Values ------------------------------------------------------------
|
// Static Values ------------------------------------------------------------
|
||||||
static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj";
|
static char encrypt_object_key[] ATTRIBUTE_ALIGN(4) = "encryObj";
|
||||||
static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD";
|
static char rom_emu_info[] ATTRIBUTE_ALIGN(4) = "TWLD";
|
||||||
|
|
||||||
static u16 s_RscLockID;
|
static u16 s_RscLockID;
|
||||||
static u16 s_CardLockID;
|
static u16 s_CardLockID;
|
||||||
|
|
||||||
static u32 s_SecureSegBufSize, s_BootSegBufSize;
|
static u32 s_BootSegBufSize, s_SecureSegBufSize, s_Secure2SegBufSize;
|
||||||
|
|
||||||
static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく
|
|
||||||
static BootSegmentData *s_pBootSegBuffer; // カード抜けてもバッファの場所覚えとく
|
static BootSegmentData *s_pBootSegBuffer; // カード抜けてもバッファの場所覚えとく
|
||||||
|
static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく
|
||||||
|
static u32 *s_pSecure2SegBuffer; // カード抜けてもバッファの場所覚えとく
|
||||||
|
|
||||||
static CardBootData s_cbData;
|
static CardBootData s_cbData;
|
||||||
static CardThreadData s_ctData;
|
static CardThreadData s_ctData;
|
||||||
@ -156,19 +155,19 @@ static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
|||||||
|
|
||||||
static CardBootFunction s_funcTable[] = {
|
static CardBootFunction s_funcTable[] = {
|
||||||
// DS Card Type 1
|
// DS Card Type 1
|
||||||
{ ReadBootSegNormal_DSType1, ChangeModeNormal, // Normalモード関数
|
{ ReadBootSegNormal, ChangeModeNormal, // Normalモード関数
|
||||||
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数
|
ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数
|
||||||
ReadIDGame, ReadPageGame}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// DS Card Type 2
|
// DS Card Type 2
|
||||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数
|
{ ReadBootSegNormal, ChangeModeNormal, // Normalモード関数
|
||||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数
|
||||||
ReadIDGame, ReadPageGame}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// TWL Card Type 1
|
// TWL Card Type 1
|
||||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数
|
{ ReadBootSegNormal, ChangeModeNormal, // Normalモード関数
|
||||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
ReadIDSecure, ReadSegSecure, SwitchONPNGSecure, ChangeModeSecure, // Secureモード関数
|
||||||
ReadIDGame, ReadPageGame}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// RomEmulation
|
// RomEmulation
|
||||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal, // Normalモード関数
|
{ ReadBootSegNormal, ChangeModeNormal, // Normalモード関数
|
||||||
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
|
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
|
||||||
ReadIDGame, ReadPageGame}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
};
|
};
|
||||||
@ -250,9 +249,12 @@ void HOTSW_Init(void)
|
|||||||
// 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 );
|
||||||
|
|
||||||
// Secure Segment バッファの設定
|
// Secure1 Segment バッファの設定
|
||||||
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
|
// Secure2 Segment バッファの設定
|
||||||
|
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
// カードが挿さってあったらスレッドを起動する
|
// カードが挿さってあったらスレッドを起動する
|
||||||
if(HOTSW_IsCardExist()){
|
if(HOTSW_IsCardExist()){
|
||||||
// メッセージ送信
|
// メッセージ送信
|
||||||
@ -273,8 +275,6 @@ void HOTSW_Init(void)
|
|||||||
*
|
*
|
||||||
* ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから
|
* ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから
|
||||||
* この関数を呼んでください。
|
* この関数を呼んでください。
|
||||||
*
|
|
||||||
* [TODO:]カードのロックを見直し。InitでロックIDをがめておいて使うのでもOK
|
|
||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
static HotSwState LoadCardData(void)
|
static HotSwState LoadCardData(void)
|
||||||
{
|
{
|
||||||
@ -305,7 +305,7 @@ static HotSwState LoadCardData(void)
|
|||||||
s_cbData.pSecureSegBuf = s_pSecureSegBuffer;
|
s_cbData.pSecureSegBuf = s_pSecureSegBuffer;
|
||||||
|
|
||||||
// ブート処理開始
|
// ブート処理開始
|
||||||
if(HOTSW_IsCardAccessible()){
|
if(HOTSW_IsCardExist()){
|
||||||
// カード側でKey Tableをロードする
|
// カード側でKey Tableをロードする
|
||||||
state = LoadTable();
|
state = LoadTable();
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
@ -708,17 +708,28 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
|
|||||||
*
|
*
|
||||||
* 注:カードブート処理中は呼び出さないようにする
|
* 注:カードブート処理中は呼び出さないようにする
|
||||||
* ----------------------------------------------------------------- */
|
* ----------------------------------------------------------------- */
|
||||||
void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size)
|
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size)
|
||||||
{
|
{
|
||||||
SDK_ASSERT(size > SECURE_SEGMENT_SIZE);
|
SDK_ASSERT(size > SECURE_SEGMENT_SIZE);
|
||||||
|
|
||||||
s_pSecureSegBuffer = (u32 *)buf;
|
|
||||||
s_SecureSegBufSize = size;
|
|
||||||
|
|
||||||
s_cbData.pSecureSegBuf = s_pSecureSegBuffer;
|
if(type == HOTSW_MODE1){
|
||||||
|
s_pSecureSegBuffer = (u32 *)buf;
|
||||||
|
s_SecureSegBufSize = size;
|
||||||
|
|
||||||
|
s_cbData.pSecureSegBuf = s_pSecureSegBuffer;
|
||||||
|
|
||||||
// バッファの初期化
|
// バッファの初期化
|
||||||
MI_CpuClear8(s_pSecureSegBuffer, size);
|
MI_CpuClear8(s_pSecureSegBuffer, size);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
s_pSecure2SegBuffer = (u32 *)buf;
|
||||||
|
s_Secure2SegBufSize = size;
|
||||||
|
|
||||||
|
s_cbData.pSecure2SegBuf = s_pSecure2SegBuffer;
|
||||||
|
|
||||||
|
// バッファの初期化
|
||||||
|
MI_CpuClear8(s_pSecure2SegBuffer, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
|
|||||||
@ -33,6 +33,11 @@ typedef enum HotSwMessageType{
|
|||||||
HOTSW_CONTROL
|
HOTSW_CONTROL
|
||||||
} HotSwMessageType;
|
} HotSwMessageType;
|
||||||
|
|
||||||
|
typedef enum ModeType{
|
||||||
|
HOTSW_MODE1,
|
||||||
|
HOTSW_MODE2
|
||||||
|
} ModeType;
|
||||||
|
|
||||||
// union -------------------------------------------------------------------
|
// union -------------------------------------------------------------------
|
||||||
// PXI用メッセージ
|
// PXI用メッセージ
|
||||||
typedef union HotSwPxiMessage{
|
typedef union HotSwPxiMessage{
|
||||||
@ -67,7 +72,7 @@ BOOL HOTSW_IsCardAccessible(void);
|
|||||||
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
|
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
|
||||||
|
|
||||||
// Secure Segment バッファの指定
|
// Secure Segment バッファの指定
|
||||||
void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size);
|
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size);
|
||||||
|
|
||||||
// Romエミュレーション情報を格納しているバッファのポインタを返す
|
// Romエミュレーション情報を格納しているバッファのポインタを返す
|
||||||
#ifdef SDK_ARM7
|
#ifdef SDK_ARM7
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user