更新:akabane_jumpei エミュレーション情報を読み込む処理追加。(今の所、自分でエミュレーションメモリをいじらないと All 0 が返ってくる。)

エミュレーション情報を格納したバッファへのポインタを返す関数も追加。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@369 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2007-12-17 13:23:11 +00:00
parent d36b53e02d
commit c3361bc1ac
6 changed files with 127 additions and 69 deletions

View File

@ -16,6 +16,8 @@ extern "C" {
// Function Describe
// ===========================================================================
void ReadRomEmulationData_DSType2(CardBootData *cbd);
// ■ ノーマルモードのコマンド ■
// DSカードType2のーマルモードのBoot Segment(4Kbyte)読み込み
void ReadBootSegNormal_DSType2(CardBootData *cbd);

View File

@ -23,13 +23,18 @@ extern "C" {
// Define -------------------------------------------------------------------
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
#define DMA_NO 2 //
#define HOTSW_DMA_NO 2 //
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位)
#define ONE_SEGMENT_SIZE 0x1000 // 1 Segmentのサイズ(バイト単位)
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1 Segmentのサイズ(ワード単位)
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値))
#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値)
#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値)
#define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ
#define PNA_BASE_VALUE 0x60e8 //
#define PNB_L_VALUE 0x879b9b05 //
@ -117,6 +122,7 @@ extern "C" {
#ifdef USE_SLOT_A
// Slot A
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
#define SLOT_STATUS_CDET_MSK 0x01
#define SLOT_STATUS_MODE_00 0x00
#define SLOT_STATUS_MODE_01 0x04
#define SLOT_STATUS_MODE_10 0x08
@ -128,15 +134,19 @@ extern "C" {
#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_A
#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_A
#define HOTSW_MCD1 REG_MCD1_A_ADDR
#define reg_HOTSW_MCD1 reg_MI_MCD1_A
#define reg_HOTSW_MCSCR0 reg_MI_MCSCR0_A
#define reg_HOTSW_MCSCR1 reg_MI_MCSCR1_A
#define reg_HOTSW_MCSCR2 reg_MI_MCSCR2_A
#define HOTSW_IF_CARD_DET OS_IE_CARD_A_DET
#else
// Slot B
#define SLOT_STATUS_MODE_SELECT_MSK 0xc0
#define SLOT_STATUS_CDET_MSK 0x10
#define SLOT_STATUS_MODE_00 0x00
#define SLOT_STATUS_MODE_01 0x40
#define SLOT_STATUS_MODE_10 0x80
@ -148,12 +158,15 @@ extern "C" {
#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_B
#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_B
#define HOTSW_MCD1 REG_MCD1_B_ADDR
#define reg_HOTSW_MCD1 reg_MI_MCD1_B
#define reg_HOTSW_MCSCR0 reg_MI_MCSCR0_B
#define reg_HOTSW_MCSCR1 reg_MI_MCSCR1_B
#define reg_HOTSW_MCSCR2 reg_MI_MCSCR2_B
#define HOTSW_IF_CARD_DET OS_IE_CARD_B_DET
#endif
@ -229,9 +242,10 @@ typedef struct CardBootData{
u32 arm7LtdSize;
BOOL twlFlg;
u32 keyBuf[KEY_BUF_SIZE];
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
u32 keyBuf[KEY_BUF_SIZE];
u64 secureSegNum;
CardTypeEx cardType;

View File

@ -7,9 +7,6 @@
#include <blowfish.h>
#include <dsCardType1.h>
// Define data --------------------------------------------------------------
#define PAGE_SIZE 512
// Function prototype -------------------------------------------------------
static void SetSecureCommand(SecureCommandType type, CardBootData *cbd);
static void SetMCSCR(void);

View File

@ -10,7 +10,9 @@
// Define Data --------------------------------------------------------------
#define SECURE_SEGMENT_NUM 4
#define ONE_SEGMENT_PAGE_NUM 8
#define COMMAND_DECRYPTION_WAIT 25 // 25ms
#define COMMAND_DECRYPTION_WAIT 25 // 25ms
#define ROM_EMULATION_START_OFS 0x160
#define ROM_EMULATION_END_OFS 0x180
// Function prototype -------------------------------------------------------
@ -25,6 +27,38 @@ static void SetMCSCR(void);
// ■--------------------------------------■
// ■ ノーマルモードのコマンド ■
// ■--------------------------------------■
/*---------------------------------------------------------------------------*
Name: ReadRomEmulationData_DSType2
Description: DSカードType2のRomエミュレーションデータの読み込み
*---------------------------------------------------------------------------*/
void ReadRomEmulationData_DSType2(CardBootData *cbd)
{
u32 count=0;
u32 temp;
u32 *buf = cbd->romEmuBuf;
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x3e000000;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に)
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 1540));
// 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){
*buf++ = reg_HOTSW_MCD1;
}
else{
temp = reg_HOTSW_MCD1;
}
count+=4;
}
}
/*---------------------------------------------------------------------------*
Name: ReadIDNormal_DSType2

View File

@ -53,6 +53,7 @@ static void GenVA_VB_VD(void);
static void LoadTable(void);
static void ReadIDNormal(void);
static void DecryptObjectFile(void);
static void ReadPageNormalFromDebugger(u32 page, void* buf);
static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest);
@ -182,6 +183,8 @@ BOOL HOTSW_Boot(void)
// カードID読み込み
ReadIDNormal();
ShowRomHeaderData();
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
if(s_cbData.id_nml & 0x80000000){
s_cbData.cardType = DS_CARD_TYPE_2;
@ -200,6 +203,16 @@ BOOL HOTSW_Boot(void)
// Boot Segment読み込み
s_funcTable[s_cbData.cardType].ReadBootSegment_N(&s_cbData);
// Romエミュレーションデータを取得
if(s_cbData.cardType == DS_CARD_TYPE_1){
// Type1の場合
MI_CpuCopy8(s_cbData.pBootSegBuf->rh.s.reserved_C, s_cbData.romEmuBuf, ROM_EMULATION_DATA_SIZE);
}
else if(s_cbData.cardType == DS_CARD_TYPE_2){
// Type2の場合
ReadRomEmulationData_DSType2(&s_cbData);
}
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n",
@ -290,6 +303,16 @@ BOOL HOTSW_Boot(void)
return retval;
}
/* -----------------------------------------------------------------
* HOTSW_GetRomEmulationBuffer関数
*
* Romエミュレーション情報を格納しているバッファへのポインタを返す
* ----------------------------------------------------------------- */
void* HOTSW_GetRomEmulationBuffer(void)
{
return s_cbData.romEmuBuf;
}
/* -----------------------------------------------------------------
* HOTSW_LoadStaticModule関数
*
@ -475,6 +498,50 @@ static void ReadIDNormal(void)
}
/* -----------------------------------------------------------------
* ReadPageNormalFromDebugger関数
*
* Romエミュレーション情報を読む
* ----------------------------------------------------------------- */
void ReadPageNormalFromDebugger(u32 page, void* buf)
{
GCDCmd64 le , be;
u64 page_data = page;
// u32 i=0;
// ゼロクリア
MI_CpuClear8(&le, sizeof(GCDCmd64));
// コマンド作成
le.dw = (page_data << 33);
// ビッグエンディアンに直す
be.b[7] = le.b[0];
be.b[6] = le.b[1];
be.b[5] = le.b[2];
be.b[4] = le.b[3];
be.b[3] = le.b[4];
be.b[2] = le.b[5];
be.b[1] = le.b[6];
be.b[0] = le.b[7];
// MCCMD レジスタ設定
reg_MI_MCCMD0_B = *(u32*)be.b;
reg_MI_MCCMD1_B = *(u32*)&be.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に)
reg_MI_MCCNT1_B = (u32)((reg_MI_MCCNT1_B & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
CNT1_FLD(1,0,0,0, 0,1, 0,0, 0, 0,0,0, 20));
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_MI_MCCNT1_B & START_FLG_MASK){
while(!(reg_MI_MCCNT1_B & READY_FLG_MASK)){}
*( ((u32 *)buf)++ ) = reg_MI_MCD1_B;
}
}
/* -----------------------------------------------------------------
* DecryptObjectFile関数
*
@ -675,65 +742,6 @@ static void SetMCSCR(void)
CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0));
}
//--------------------------------------------------------------------
// 改造DMA用
//--------------------------------------------------------------------
/* ---------------------------------------------------------------------------------------------------------------------------------------- */
// DMAイネーブル・DSカード起動モード・転送ビット幅 32ビット・繰り返しモード・ソースアドレス固定・デスティネーションアドレス固定・ワードカウント=1
#define MI_CNT_CARDWRITE32 ( MI_DMA_ENABLE | MI_DMA_TIMING_CARD | MI_DMA_32BIT_BUS | MI_DMA_CONTINUOUS_ON | MI_DMA_SRC_FIX | MI_DMA_DEST_FIX | 1 )
/* ---------------------------------------------------------------------------------------------------------------------------------------- */
// NitroSDK/build/libraries/mi/common/include/mi_dma.hより抜粋
#define MIi_Wait_BeforeDMA( dmaCntp, dmaNo ) \
do { \
dmaCntp = &((vu32*)REG_DMA0SAD_ADDR)[dmaNo * 3 + 2]; \
while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \
}while(0)
#define MIi_Wait_AfterDMA( dmaCntp ) \
do { \
while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \
}while(0)
inline void MIi_DmaSetParams_wait(u32 dmaNo, u32 src, u32 dest, u32 ctrl)
{
OSIntrMode enabled = OS_DisableInterrupts();
vu32 *p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12);
*p = (vu32)src;
*(p + 1) = (vu32)dest;
*(p + 2) = (vu32)ctrl;
// ARM7 must wait 2 cycle (load is 3 cycle)
{
u32 dummy = reg_MI_DMA0SAD;
}
(void)OS_RestoreInterrupts(enabled);
}
//------------------------------------------------------------------------------
//
// NitroSDK DMA転送関数 改造版
//
//------------------------------------------------------------------------------
// NitroSDK/build/libraries/mi/common/src/mi_dma_card.cより抜粋
static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest)
{
vu32 *dmaCntp;
MIi_Wait_BeforeDMA(dmaCntp, dmaNo);
MIi_DmaSetParams_wait(dmaNo, (u32)src, (u32)dest,(u32)MI_CNT_CARDWRITE32);
/*
* ON .
* CARD .
*/
}
/*---------------------------------------------------------------------------*
Name: InterruptCallbackCard
InterruptCallbackCardDet

View File

@ -27,6 +27,9 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
// Secure Segment バッファの指定
void HOTSW_SetSecureSegmentBuffer(void* buf, u32 size);
// Romエミュレーション情報を格納しているバッファのポインタを返す
void* HOTSW_GetRomEmulationBuffer(void);
#ifdef __cplusplus
} /* extern "C" */
#endif