mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
デバッガと実機で挙動が違いすぎるとデバッグに支障があるためゲームモードの関数を統一。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@784 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
7f0cd0f8f9
commit
339352192e
@ -29,7 +29,14 @@ TWL_PROC = ARM7
|
|||||||
SRCDIR = ./src
|
SRCDIR = ./src
|
||||||
INCDIR = ./include
|
INCDIR = ./include
|
||||||
|
|
||||||
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c
|
SRCS = blowfish.c \
|
||||||
|
hotsw.c \
|
||||||
|
ds_blowfish_table.c \
|
||||||
|
dsCardCommon.c \
|
||||||
|
dsCardType1.c \
|
||||||
|
dsCardType2.c \
|
||||||
|
romEmulation.c \
|
||||||
|
customNDma.c \
|
||||||
|
|
||||||
TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a
|
TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Project: TwlFirm - GCD - include
|
Project: TwlIPL - HOTSW - include
|
||||||
File: blowfish.h
|
File: blowfish.h
|
||||||
|
|
||||||
Copyright 2007 Nintendo. All rights reserved.
|
Copyright 2007-2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
These coded instructions, statements, and computer programs contain
|
These coded instructions, statements, and computer programs contain
|
||||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
@ -10,8 +10,8 @@
|
|||||||
not be disclosed to third parties or copied or duplicated in any form,
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
in whole or in part, without the prior written consent of Nintendo.
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifndef FIRM_GCD_BLOWFISH_H
|
#ifndef HOTSW_GCD_BLOWFISH_H
|
||||||
#define FIRM_GCD_BLOWFISH_H
|
#define HOTSW_GCD_BLOWFISH_H
|
||||||
|
|
||||||
|
|
||||||
#include <twl/types.h>
|
#include <twl/types.h>
|
||||||
@ -47,4 +47,4 @@ void GCDm_MakeBlowfishTableDS(BLOWFISH_CTX *tableBufp, ROM_Header_Short *rhs, u3
|
|||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // FIRM_GCD_BLOWFISH_H
|
#endif // HOTSW_GCD_BLOWFISH_H
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef __CUSTOM_NDMA_H__
|
#ifndef __HOTSW_CUSTOM_NDMA_H__
|
||||||
#define __CUSTOM_NDMA_H__
|
#define __HOTSW_CUSTOM_NDMA_H__
|
||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
|
|
||||||
@ -17,4 +17,4 @@ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size);
|
|||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __CUSTOM_NDMA_H__
|
#endif // __HOTSW_CUSTOM_NDMA_H__
|
||||||
39
build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h
Normal file
39
build/libraries_sysmenu/hotsw/ARM7/include/dsCardCommon.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlSDK
|
||||||
|
File:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef __HOTSW_DSCARD_COMMON_H__
|
||||||
|
#define __HOTSW_DSCARD_COMMON_H__
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <hotswTypes.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ===========================================================================
|
||||||
|
// Function Describe
|
||||||
|
// ===========================================================================
|
||||||
|
// ■ ノーマルモードのコマンド ■
|
||||||
|
// DSカードのノーマルモードのID読み込み
|
||||||
|
HotSwState ReadIDNormal(CardBootData *cbd);
|
||||||
|
|
||||||
|
// カード側のKeyTableをロード
|
||||||
|
HotSwState LoadTable(void);
|
||||||
|
|
||||||
|
// デバッガのROMエミュレーション情報読み込み
|
||||||
|
HotSwState ReadRomEmulationData(CardBootData *cbd);
|
||||||
|
|
||||||
|
// ■ ゲームモードのコマンド ■
|
||||||
|
// DSカードのゲームモードのID読み込み
|
||||||
|
HotSwState ReadIDGame(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードのゲームモードの指定ページ読み込み
|
||||||
|
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __HOTSW_DSCARD_COMMON_H__
|
||||||
@ -2,8 +2,8 @@
|
|||||||
Project: TwlSDK
|
Project: TwlSDK
|
||||||
File:
|
File:
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifndef __DSCARD_TYPE1_H__
|
#ifndef __HOTSW_DSCARD_TYPE1_H__
|
||||||
#define __DSCARD_TYPE1_H__
|
#define __HOTSW_DSCARD_TYPE1_H__
|
||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <hotswTypes.h>
|
#include <hotswTypes.h>
|
||||||
@ -41,15 +41,8 @@ HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
|
|||||||
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
|
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
// ■ ゲームモードのコマンド ■
|
|
||||||
// DSカードType1のゲームモードのID読み込み
|
|
||||||
HotSwState ReadIDGame_DSType1(CardBootData *cbd);
|
|
||||||
|
|
||||||
// DSカードType1のゲームモードの指定ページ読み込み
|
|
||||||
HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __DSCARD_TYPE1_H__
|
#endif // __HOTSW_DSCARD_TYPE1_H__
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
Project: TwlSDK
|
Project: TwlSDK
|
||||||
File:
|
File:
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifndef __DSCARD_TYPE2_H__
|
#ifndef __HOTSW_DSCARD_TYPE2_H__
|
||||||
#define __DSCARD_TYPE2_H__
|
#define __HOTSW_DSCARD_TYPE2_H__
|
||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <hotswTypes.h>
|
#include <hotswTypes.h>
|
||||||
@ -40,15 +40,8 @@ HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
|
|||||||
HotSwState ChangeModeSecure_DSType2(CardBootData *cbd);
|
HotSwState ChangeModeSecure_DSType2(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
// ■ ゲームモードのコマンド ■
|
|
||||||
// DSカードType2のゲームモードのID読み込み (Type1と同じ処理)
|
|
||||||
#define ReadIDGame_DSType2 ReadIDGame_DSType1
|
|
||||||
|
|
||||||
// DSカードType2のゲームモードの指定ページ読み込み
|
|
||||||
#define ReadPageGame_DSType2 ReadPageGame_DSType1
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __DSCARD_TYPE2_H__
|
#endif // __HOTSW_DSCARD_TYPE2_H__
|
||||||
|
|||||||
@ -242,8 +242,6 @@ typedef struct CardBootData{
|
|||||||
u32 arm9Ltd;
|
u32 arm9Ltd;
|
||||||
u32 arm7Ltd;
|
u32 arm7Ltd;
|
||||||
|
|
||||||
u32 secureLatency;
|
|
||||||
|
|
||||||
BOOL twlFlg;
|
BOOL twlFlg;
|
||||||
BOOL debuggerFlg;
|
BOOL debuggerFlg;
|
||||||
|
|
||||||
@ -251,6 +249,8 @@ typedef struct CardBootData{
|
|||||||
u32 keyBuf[KEY_BUF_SIZE];
|
u32 keyBuf[KEY_BUF_SIZE];
|
||||||
|
|
||||||
CardTypeEx cardType;
|
CardTypeEx cardType;
|
||||||
|
u32 secureLatency;
|
||||||
|
u32 gameCommondParam;
|
||||||
|
|
||||||
BootSegmentData *pBootSegBuf;
|
BootSegmentData *pBootSegBuf;
|
||||||
u32 *pSecureSegBuf;
|
u32 *pSecureSegBuf;
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
Project: TwlSDK
|
Project: TwlSDK
|
||||||
File: romEmulation.h
|
File: romEmulation.h
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifndef __ROM_EMULATION_H__
|
#ifndef __HOTSW_ROM_EMULATION_H__
|
||||||
#define __ROM_EMULATION_H__
|
#define __HOTSW_ROM_EMULATION_H__
|
||||||
|
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <hotswTypes.h>
|
#include <hotswTypes.h>
|
||||||
@ -52,4 +52,4 @@ HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32
|
|||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __ROM_EMULATION_H__
|
#endif // __HOTSW_ROM_EMULATION_H__
|
||||||
|
|||||||
212
build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c
Normal file
212
build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlSDK
|
||||||
|
File: dsCardType1.c
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <blowfish.h>
|
||||||
|
#include <dsCardCommon.h>
|
||||||
|
#include <customNDma.h>
|
||||||
|
|
||||||
|
// define -------------------------------------------------------------------
|
||||||
|
#define ROM_EMULATION_START_OFS 0x160
|
||||||
|
#define ROM_EMULATION_END_OFS 0x180
|
||||||
|
|
||||||
|
// Function prototype -------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// ===========================================================================
|
||||||
|
// Function Describe
|
||||||
|
// ===========================================================================
|
||||||
|
|
||||||
|
// ■------------------------------------■
|
||||||
|
// ■ ノーマルモードのコマンド ■
|
||||||
|
// ■------------------------------------■
|
||||||
|
/* -----------------------------------------------------------------
|
||||||
|
* ReadIDNormal関数
|
||||||
|
*
|
||||||
|
* ノーマルモード時のカードIDを読み込む関数
|
||||||
|
* ----------------------------------------------------------------- */
|
||||||
|
HotSwState ReadIDNormal(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
// カード割り込みによるDMAコピー
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = 0x00000090;
|
||||||
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------
|
||||||
|
* LoadTable関数
|
||||||
|
*
|
||||||
|
* カード側の Key Table をロードする関数。
|
||||||
|
*
|
||||||
|
* ※この関数は開発カード用に発行しないといけない。
|
||||||
|
* 製品版カードの場合、このコマンドは無視される
|
||||||
|
* ----------------------------------------------------------------- */
|
||||||
|
HotSwState LoadTable(void)
|
||||||
|
{
|
||||||
|
u32 temp;
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = 0x0000009f;
|
||||||
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
|
||||||
|
|
||||||
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
temp = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadRomEmulationData
|
||||||
|
|
||||||
|
Description: Romエミュレーションデータの読み込み
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadRomEmulationData(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 count=0;
|
||||||
|
u32 temp;
|
||||||
|
u32 *dst = cbd->romEmuBuf;
|
||||||
|
|
||||||
|
// 量産用CPUでは平文アクセス防止のためリードしない
|
||||||
|
if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) )
|
||||||
|
{
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = 0x3e000000;
|
||||||
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
if(count >= ROM_EMULATION_START_OFS && count < ROM_EMULATION_END_OFS){
|
||||||
|
*dst++ = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
temp = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
count+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
MI_CpuCopyFast(cbd->romEmuBuf, (void*)HW_ISD_RESERVED, 32);
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ■------------------------------------■
|
||||||
|
// ■ ゲームモードのコマンド ■
|
||||||
|
// ■------------------------------------■
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ReadIDGame
|
||||||
|
*
|
||||||
|
* Description: ゲームモードでIDを読み込む
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadIDGame(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = 0x000000B8;
|
||||||
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
||||||
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||||
|
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Name: ReadPageGame
|
||||||
|
*
|
||||||
|
* Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
||||||
|
*
|
||||||
|
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
||||||
|
{
|
||||||
|
u32 loop, counter=0;
|
||||||
|
u64 i, page;
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
|
page = (u32)(start_addr / PAGE_SIZE);
|
||||||
|
loop = (u32)(size / PAGE_SIZE);
|
||||||
|
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++){
|
||||||
|
if(!HOTSW_IsCardAccessible()){
|
||||||
|
return HOTSW_PULLED_OUT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
||||||
|
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// コマンド作成
|
||||||
|
cndLE.dw = (page + i) << 33;
|
||||||
|
cndLE.dw |= 0xB700000000000000;
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
|
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 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
||||||
|
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
|
||||||
|
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return HOTSW_SUCCESS;
|
||||||
|
}
|
||||||
@ -354,28 +354,7 @@ HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
|
|||||||
*
|
*
|
||||||
* Description: ゲームモードでIDを読み込む
|
* Description: ゲームモードでIDを読み込む
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadIDGame_DSType1(CardBootData *cbd)
|
// 共通
|
||||||
{
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x000000B8;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
|
|
||||||
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
|
|
||||||
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
* Name: ReadPageGame_DSType1
|
* Name: ReadPageGame_DSType1
|
||||||
@ -384,55 +363,5 @@ HotSwState ReadIDGame_DSType1(CardBootData *cbd)
|
|||||||
*
|
*
|
||||||
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
|
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
// 共通
|
||||||
{
|
|
||||||
u32 loop, counter=0;
|
|
||||||
u64 i, page;
|
|
||||||
GCDCmd64 cndLE, cndBE;
|
|
||||||
|
|
||||||
page = (u32)(start_addr / PAGE_SIZE);
|
|
||||||
loop = (u32)(size / PAGE_SIZE);
|
|
||||||
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++){
|
|
||||||
if(!HOTSW_IsCardAccessible()){
|
|
||||||
return HOTSW_PULLED_OUT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDMA転送の準備
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
|
||||||
|
|
||||||
// ゼロクリア
|
|
||||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
|
||||||
|
|
||||||
// コマンド作成
|
|
||||||
cndLE.dw = (page + i) << 33;
|
|
||||||
cndLE.dw |= 0xB700000000000000;
|
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
|
||||||
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 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
|
|
||||||
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
|
|
||||||
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
@ -423,7 +423,7 @@ HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
|
|||||||
|
|
||||||
Description: ゲームモードでIDを読み込む
|
Description: ゲームモードでIDを読み込む
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
// Type1と同じ
|
// 共通
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -431,4 +431,4 @@ HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
|
|||||||
*
|
*
|
||||||
* Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
* Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
// Type1と同じ
|
// 共通
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
#include <hotswTypes.h>
|
#include <hotswTypes.h>
|
||||||
#include <blowfish.h>
|
#include <blowfish.h>
|
||||||
|
#include <dsCardCommon.h>
|
||||||
#include <dsCardType1.h>
|
#include <dsCardType1.h>
|
||||||
#include <dsCardType2.h>
|
#include <dsCardType2.h>
|
||||||
#include <romEmulation.h>
|
#include <romEmulation.h>
|
||||||
@ -34,9 +35,6 @@
|
|||||||
|
|
||||||
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
|
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
|
||||||
|
|
||||||
#define ROM_EMULATION_START_OFS 0x160
|
|
||||||
#define ROM_EMULATION_END_OFS 0x180
|
|
||||||
|
|
||||||
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
|
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
|
||||||
#define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
#define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
|
||||||
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
|
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
|
||||||
@ -100,9 +98,6 @@ static void SetMCSCR(void);
|
|||||||
|
|
||||||
static void GenVA_VB_VD(void);
|
static void GenVA_VB_VD(void);
|
||||||
static HotSwState DecryptObjectFile(void);
|
static HotSwState DecryptObjectFile(void);
|
||||||
static HotSwState LoadTable(void);
|
|
||||||
static HotSwState ReadRomEmulationData(void);
|
|
||||||
static HotSwState ReadIDNormal(void);
|
|
||||||
static HotSwState LoadBannerData(void);
|
static HotSwState LoadBannerData(void);
|
||||||
static HotSwState LoadStaticModule(void);
|
static HotSwState LoadStaticModule(void);
|
||||||
static HotSwState LoadCardData(void);
|
static HotSwState LoadCardData(void);
|
||||||
@ -164,19 +159,19 @@ static CardBootFunction s_funcTable[] = {
|
|||||||
// DS Card Type 1
|
// DS Card Type 1
|
||||||
{ ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数
|
{ ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数
|
||||||
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数
|
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数
|
||||||
ReadIDGame_DSType1, ReadPageGame_DSType1}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// DS Card Type 2
|
// DS Card Type 2
|
||||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
||||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
||||||
ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// TWL Card Type 1
|
// TWL Card Type 1
|
||||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
||||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
||||||
ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
// RomEmulation
|
// RomEmulation
|
||||||
{ ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数
|
{ ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数
|
||||||
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
|
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
|
||||||
ReadIDGame_ROMEMU, ReadPageGame_ROMEMU} // Game モード関数
|
ReadIDGame, ReadPageGame}, // Game モード関数
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -318,7 +313,7 @@ static HotSwState LoadCardData(void)
|
|||||||
|
|
||||||
// ---------------------- Normal Mode ----------------------
|
// ---------------------- Normal Mode ----------------------
|
||||||
// カードID読み込み
|
// カードID読み込み
|
||||||
state = ReadIDNormal();
|
state = ReadIDNormal(&s_cbData);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
|
||||||
@ -336,7 +331,7 @@ static HotSwState LoadCardData(void)
|
|||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// Romエミュレーション情報を取得
|
// Romエミュレーション情報を取得
|
||||||
state = ReadRomEmulationData();
|
state = ReadRomEmulationData(&s_cbData);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
// 取得したRomエミュレーション情報を比較
|
// 取得したRomエミュレーション情報を比較
|
||||||
@ -350,12 +345,13 @@ static HotSwState LoadCardData(void)
|
|||||||
if(s_cbData.debuggerFlg){
|
if(s_cbData.debuggerFlg){
|
||||||
OS_PutString("Read Debugger\n");
|
OS_PutString("Read Debugger\n");
|
||||||
s_cbData.cardType = ROM_EMULATION;
|
s_cbData.cardType = ROM_EMULATION;
|
||||||
SYSMi_GetWork()->gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
|
s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
|
||||||
OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n",SYSMi_GetWork()->gameCommondParam);
|
OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n", s_cbData.gameCommondParam);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
SYSMi_GetWork()->gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param;
|
s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param;
|
||||||
}
|
}
|
||||||
|
SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam;
|
||||||
|
|
||||||
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
|
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
|
||||||
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
|
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
|
||||||
@ -755,104 +751,6 @@ static void GenVA_VB_VD(void)
|
|||||||
s_cbData.vd &= 0xffffff;
|
s_cbData.vd &= 0xffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
|
||||||
* LoadTable関数
|
|
||||||
*
|
|
||||||
* カード側の Key Table をロードする関数。
|
|
||||||
*
|
|
||||||
* ※この関数は開発カード用に発行しないといけない。
|
|
||||||
* 製品版カードの場合、このコマンドは無視される
|
|
||||||
* ----------------------------------------------------------------- */
|
|
||||||
static HotSwState LoadTable(void)
|
|
||||||
{
|
|
||||||
u32 temp;
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x0000009f;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
|
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
|
||||||
temp = reg_HOTSW_MCD1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ReadRomEmulationData
|
|
||||||
|
|
||||||
Description: Romエミュレーションデータの読み込み
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static HotSwState ReadRomEmulationData(void)
|
|
||||||
{
|
|
||||||
u32 count=0;
|
|
||||||
u32 temp;
|
|
||||||
u32 *dst = s_cbData.romEmuBuf;
|
|
||||||
|
|
||||||
// 量産用CPUでは平文アクセス防止のためリードしない
|
|
||||||
if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) )
|
|
||||||
{
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x3e000000;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
|
||||||
if(count >= ROM_EMULATION_START_OFS && count < ROM_EMULATION_END_OFS){
|
|
||||||
*dst++ = reg_HOTSW_MCD1;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
temp = reg_HOTSW_MCD1;
|
|
||||||
}
|
|
||||||
count+=4;
|
|
||||||
}
|
|
||||||
|
|
||||||
MI_CpuCopyFast(s_cbData.romEmuBuf, (void*)HW_ISD_RESERVED, 32);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
|
||||||
* ReadIDNormal関数
|
|
||||||
*
|
|
||||||
* ノーマルモード時のカードIDを読み込む関数
|
|
||||||
* ----------------------------------------------------------------- */
|
|
||||||
static HotSwState ReadIDNormal(void)
|
|
||||||
{
|
|
||||||
// カード割り込みによるDMAコピー
|
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) );
|
|
||||||
|
|
||||||
// MCCMD レジスタ設定
|
|
||||||
reg_HOTSW_MCCMD0 = 0x00000090;
|
|
||||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
|
||||||
OS_SleepThread(NULL);
|
|
||||||
|
|
||||||
return HOTSW_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
* DecryptObjectFile関数
|
* DecryptObjectFile関数
|
||||||
*
|
*
|
||||||
|
|||||||
@ -287,6 +287,8 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
// ■ ゲームモードのコマンド ■
|
// ■ ゲームモードのコマンド ■
|
||||||
// ■------------------------------------■
|
// ■------------------------------------■
|
||||||
|
#if 0
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ReadIDGame_ROMEMU
|
Name: ReadIDGame_ROMEMU
|
||||||
|
|
||||||
@ -377,3 +379,5 @@ HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32
|
|||||||
|
|
||||||
return HOTSW_SUCCESS;
|
return HOTSW_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user