mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
更新: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:
parent
d36b53e02d
commit
c3361bc1ac
@ -16,6 +16,8 @@ extern "C" {
|
||||
// Function Describe
|
||||
// ===========================================================================
|
||||
|
||||
void ReadRomEmulationData_DSType2(CardBootData *cbd);
|
||||
|
||||
// ■ ノーマルモードのコマンド ■
|
||||
// DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||
void ReadBootSegNormal_DSType2(CardBootData *cbd);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user