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@277 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
ba33ee2fbf
commit
143a61fbd7
@ -15,7 +15,7 @@
|
||||
|
||||
|
||||
#include <twl/types.h>
|
||||
#include <sysmenu/hotsw.h>
|
||||
#include <hotswTypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@ -5,22 +5,18 @@
|
||||
#ifndef __DSCARD_TYPE1_H__
|
||||
#define __DSCARD_TYPE1_H__
|
||||
|
||||
#include <twl.h>
|
||||
#include <hotswTypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <twl.h>
|
||||
#include <sysmenu/hotsw.h>
|
||||
|
||||
// ===========================================================================
|
||||
// Function Describe
|
||||
// ===========================================================================
|
||||
|
||||
// ■ ノーマルモードのコマンド ■
|
||||
// DSカードType1のノーマルモードのID読み込み
|
||||
void ReadIDNormal_DSType1(CardBootData *cbd);
|
||||
|
||||
// DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||
void ReadBootSegNormal_DSType1(CardBootData *cbd);
|
||||
|
||||
|
||||
@ -5,14 +5,13 @@
|
||||
#ifndef __DSCARD_TYPE2_H__
|
||||
#define __DSCARD_TYPE2_H__
|
||||
|
||||
#include <twl.h>
|
||||
#include <hotswTypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <twl.h>
|
||||
#include <sysmenu/hotsw.h>
|
||||
|
||||
// ===========================================================================
|
||||
// Function Describe
|
||||
// ===========================================================================
|
||||
@ -21,6 +20,10 @@ extern "C" {
|
||||
// DSカードType2のノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||
void ReadBootSegNormal_DSType2(CardBootData *cbd);
|
||||
|
||||
// DSカードType2のノーマルモードのモード変更 (Type1と同じ処理)
|
||||
#define ChangeModeNormal_DSType2 ChangeModeNormal_DSType1
|
||||
|
||||
|
||||
// ■ セキュアモードのコマンド ■
|
||||
// DSカードType2のセキュアモードのID読み込み
|
||||
void ReadIDSecure_DSType2(CardBootData *cbd);
|
||||
@ -37,8 +40,13 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
|
||||
// DSカードType2のセキュアモードのモード変更
|
||||
void ChangeModeSecure_DSType2(CardBootData *cbd);
|
||||
|
||||
|
||||
// ■ ゲームモードのコマンド ■
|
||||
// Type1と同じコマンドを使う
|
||||
// DSカードType2のゲームモードのID読み込み (Type1と同じ処理)
|
||||
#define ReadIDGame_DSType2 ReadIDGame_DSType1
|
||||
|
||||
// DSカードType2のゲームモードの指定ページ読み込み (Type1と同じ処理)
|
||||
#define ReadPageGame_DSType2 ReadPageGame_DSType1
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
|
||||
267
build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h
Normal file
267
build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h
Normal file
@ -0,0 +1,267 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: TwlFirm - GCD - include
|
||||
File: type.h
|
||||
|
||||
Copyright 2007 Nintendo. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
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.
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifndef __HOTSW_TYPES_H__
|
||||
#define __HOTSW_TYPES_H__
|
||||
|
||||
#include <twl.h>
|
||||
#include <twl/os/common/format_rom.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// Define -------------------------------------------------------------------
|
||||
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
|
||||
#define DMA_NO 2 //
|
||||
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
|
||||
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
|
||||
|
||||
#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値))
|
||||
#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値)
|
||||
#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値)
|
||||
|
||||
#define PNA_BASE_VALUE 0x60e8 //
|
||||
#define PNB_L_VALUE 0x879b9b05 //
|
||||
#define PNB_H_VALUE 0x5c //
|
||||
|
||||
// コントロールレジスタ1 bit関連
|
||||
#define START_FLG_MASK 0x80000000
|
||||
#define READY_FLG_MASK 0x00800000
|
||||
|
||||
#define LATENCY1_SHIFT 0
|
||||
#define LATENCY1_MASK 0x00001fff
|
||||
|
||||
#define DS_SHIFT 13
|
||||
#define DS_MASK 0x00002000
|
||||
|
||||
#define SE_SHIFT 14
|
||||
#define SE_MASK 0x00004000
|
||||
|
||||
#define SCR_SHIFT 15
|
||||
#define SCR_MASK 0x00008000
|
||||
|
||||
#define LATENCY2_SHIFT 16
|
||||
#define LATENCY2_MASK 0x003f0000
|
||||
|
||||
#define CS_SHIFT 22
|
||||
#define CS_MASK 0x00400000
|
||||
|
||||
#define RDY_SHIFT 23
|
||||
#define RDY_MASK 0x00800000
|
||||
|
||||
#define PC_SHIFT 24
|
||||
#define PC_MASK 0x07000000
|
||||
|
||||
#define CT_SHIFT 27
|
||||
#define CT_MASK 0x08000000
|
||||
|
||||
#define TRM_SHIFT 28
|
||||
#define TRM_MASK 0x10000000
|
||||
|
||||
#define RESB_SHIFT 29
|
||||
#define RESB_MASK 0x20000000
|
||||
|
||||
#define WR_SHIFT 30
|
||||
#define WR_MASK 0x40000000
|
||||
|
||||
#define START_SHIFT 31
|
||||
#define START_MASK 0x80000000
|
||||
|
||||
#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \
|
||||
(u32)( \
|
||||
((u32)(start)<< START_SHIFT) | \
|
||||
((u32)(wr) << WR_SHIFT) | \
|
||||
((u32)(resb) << RESB_SHIFT) | \
|
||||
((u32)(rtm) << TRM_SHIFT) | \
|
||||
((u32)(ct) << CT_SHIFT) | \
|
||||
((u32)(pc) << PC_SHIFT) | \
|
||||
((u32)(rdy) << RDY_SHIFT) | \
|
||||
((u32)(cs) << CS_SHIFT) | \
|
||||
((u32)(l2) << LATENCY2_SHIFT) | \
|
||||
((u32)(scr) << SCR_SHIFT) | \
|
||||
((u32)(se) << SE_SHIFT) | \
|
||||
((u32)(ds) << DS_SHIFT) | \
|
||||
((u32)(l1) << LATENCY1_SHIFT) \
|
||||
)
|
||||
|
||||
#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \
|
||||
(u32)( ((start) ? START_MASK : 0) | \
|
||||
((wr) ? WR_MASK : 0) | \
|
||||
((resb) ? RESB_MASK : 0) | \
|
||||
((rtm) ? TRM_MASK : 0) | \
|
||||
((ct) ? CT_MASK : 0) | \
|
||||
((pc) ? PC_MASK : 0) | \
|
||||
((rdy) ? RDY_MASK : 0) | \
|
||||
((cs) ? CS_MASK : 0) | \
|
||||
((l2) ? LATENCY2_MASK : 0)| \
|
||||
((scr) ? SCR_MASK : 0) | \
|
||||
((se) ? SE_MASK : 0) | \
|
||||
((ds) ? DS_MASK : 0) | \
|
||||
((l1) ? LATENCY1_MASK : 0))
|
||||
|
||||
|
||||
|
||||
//#define USE_SLOT_A
|
||||
|
||||
#ifdef USE_SLOT_A
|
||||
// Slot A
|
||||
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
|
||||
#define SLOT_STATUS_MODE_00 0x00
|
||||
#define SLOT_STATUS_MODE_01 0x04
|
||||
#define SLOT_STATUS_MODE_10 0x08
|
||||
#define SLOT_STATUS_MODE_11 0x0c
|
||||
|
||||
#define reg_HOTSW_MCCMD0 reg_MI_MCCMD0_A
|
||||
#define reg_HOTSW_MCCMD1 reg_MI_MCCMD1_A
|
||||
|
||||
#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_A
|
||||
#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_A
|
||||
|
||||
#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
|
||||
|
||||
#else
|
||||
// Slot B
|
||||
#define SLOT_STATUS_MODE_SELECT_MSK 0xc0
|
||||
#define SLOT_STATUS_MODE_00 0x00
|
||||
#define SLOT_STATUS_MODE_01 0x40
|
||||
#define SLOT_STATUS_MODE_10 0x80
|
||||
#define SLOT_STATUS_MODE_11 0xc0
|
||||
|
||||
#define reg_HOTSW_MCCMD0 reg_MI_MCCMD0_B
|
||||
#define reg_HOTSW_MCCMD1 reg_MI_MCCMD1_B
|
||||
|
||||
#define reg_HOTSW_MCCNT0 reg_MI_MCCNT0_B
|
||||
#define reg_HOTSW_MCCNT1 reg_MI_MCCNT1_B
|
||||
|
||||
#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
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// Enum ---------------------------------------------------------------------
|
||||
typedef enum CardTypeEx{
|
||||
DS_CARD_TYPE_1 = 0,
|
||||
DS_CARD_TYPE_2,
|
||||
TWL_CARD
|
||||
}CardTypeEx;
|
||||
|
||||
typedef enum NormalCommandType{
|
||||
RD_ID = 0,
|
||||
RD_BSEG,
|
||||
CHG_MODE
|
||||
}NormalCommandType;
|
||||
|
||||
typedef enum SecureCommandType{
|
||||
S_RD_ID = 0,
|
||||
S_RD_SEG,
|
||||
S_PNG_ON,
|
||||
S_PNG_OFF,
|
||||
S_CHG_MODE
|
||||
}SecureCommandType;
|
||||
|
||||
typedef enum GameCommandType{
|
||||
G_RD_ID = 0,
|
||||
G_RD_PAGE
|
||||
}GameCommandType;
|
||||
|
||||
typedef enum CardType{
|
||||
CARD_DS_TYPE1 = 0,
|
||||
CARD_DS_TYPE2,
|
||||
CARD_TWL
|
||||
}CardType;
|
||||
|
||||
// union ---------------------------------------------------------------------
|
||||
typedef union
|
||||
{
|
||||
u64 dw;
|
||||
u8 b[8];
|
||||
}
|
||||
GCDCmd64;
|
||||
|
||||
// ブートセグメントデータ
|
||||
typedef union BootSegmentData
|
||||
{
|
||||
ROM_Header rh;
|
||||
u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)];
|
||||
}
|
||||
BootSegmentData;
|
||||
|
||||
// struct -------------------------------------------------------------------
|
||||
typedef struct BLOWFISH_CTX{
|
||||
u32 P[16 + 2];
|
||||
u32 S[4][256];
|
||||
} BLOWFISH_CTX;
|
||||
|
||||
// カードブート時に必要な変数一式をまとめた構造体
|
||||
typedef struct CardBootData{
|
||||
u16 lockID;
|
||||
|
||||
u32 vae;
|
||||
u32 vbi;
|
||||
u32 vd;
|
||||
|
||||
u32 id_nml;
|
||||
u32 id_scr;
|
||||
u32 id_gam;
|
||||
|
||||
u32 arm9StaticSize;
|
||||
u32 arm7StaticSize;
|
||||
u32 arm9LtdSize;
|
||||
u32 arm7LtdSize;
|
||||
|
||||
BOOL twlFlg;
|
||||
|
||||
u32 keyBuf[KEY_BUF_SIZE];
|
||||
|
||||
u64 secureSegNum;
|
||||
|
||||
CardTypeEx cardType;
|
||||
|
||||
BootSegmentData *pBootSegBuf;
|
||||
u32 *pSecureSegBuf;
|
||||
|
||||
BLOWFISH_CTX keyTable;
|
||||
}
|
||||
CardBootData;
|
||||
|
||||
// カード起動用関数
|
||||
typedef struct CardBootFunction {
|
||||
void (*ReadBootSegment_N)(CardBootData *cbd);
|
||||
void (*ChangeMode_N)(CardBootData *cbd);
|
||||
|
||||
void (*ReadID_S)(CardBootData *cbd);
|
||||
void (*ReadSegment_S)(CardBootData *cbd);
|
||||
void (*SetPNG_S)(CardBootData *cbd);
|
||||
void (*ChangeMode_S)(CardBootData *cbd);
|
||||
|
||||
void (*ReadID_G)(CardBootData *cbd);
|
||||
void (*ReadPage_G)(u32 addr, void* buf, u32 size);
|
||||
}
|
||||
CardBootFunction;
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif // __HOTSW_TYPES_H__
|
||||
@ -41,20 +41,20 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
|
||||
u32 i = 0;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x00000000;
|
||||
reg_MCCMD1 = 0x00000000;
|
||||
reg_HOTSW_MCCMD0 = 0x00000000;
|
||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 20));
|
||||
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,4, 0,0, 0, 0,0,0, 20));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pBootSegBuf->word + i++) = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pBootSegBuf->word + i++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,16 +87,16 @@ void ChangeModeNormal_DSType1(CardBootData *cbd)
|
||||
cnd.b[7] = tempCnd.b[0];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32 *)cnd.b;
|
||||
reg_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
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,1,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,8 +154,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
||||
cndBE.b[0] = cndLE.b[7];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
}
|
||||
|
||||
|
||||
@ -171,13 +171,13 @@ void ReadIDSecure_DSType1(CardBootData *cbd)
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
// (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_scr = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_scr = reg_HOTSW_MCD1;
|
||||
}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
@ -218,18 +218,18 @@ void ReadSegSecure_DSType1(CardBootData *cbd)
|
||||
cndBE.b[0] = cndLE.b[7];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
// (START = 1 W/R = 0 TRM = 1 PC = 100(8ページリード) CS = 1 Latency2 = 24(0x18) SE = 1 DS = 1 Latency1 = 2296(0x8f8)に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pSecureSegBuf + j++) = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
|
||||
// 読み込みセグメント番号インクリメント
|
||||
@ -251,11 +251,11 @@ void SwitchONPNGSecure_DSType1(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_ON, cbd);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
@ -273,11 +273,11 @@ void SwitchOFFPNGSecure_DSType1(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_OFF, cbd);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
@ -295,11 +295,11 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
|
||||
SetSecureCommand(S_CHG_MODE, cbd);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
@ -318,17 +318,17 @@ void ChangeModeSecure_DSType1(CardBootData *cbd)
|
||||
void ReadIDGame_DSType1(CardBootData *cbd)
|
||||
{
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x000000B8;
|
||||
reg_MCCMD1 = 0x00000000;
|
||||
reg_HOTSW_MCCMD0 = 0x000000B8;
|
||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 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,7, 0,1, 0, 0,1,1, 1));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_gam = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_gam = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -369,17 +369,17 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
|
||||
cndBE.b[0] = cndLE.b[7];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) CS = 1 SE = 1 DS = 1 latency1 = 20 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
*((u32 *)buf + counter++) = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -65,17 +65,17 @@ void ReadBootSegNormal_DSType2(CardBootData *cbd)
|
||||
cnd.b[7] = tempCnd.b[0];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32 *)cnd.b;
|
||||
reg_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001 (1ページリード) に)
|
||||
reg_MCCNT1 = (u32)((reg_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));
|
||||
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_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pBootSegBuf->word + j++) = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pBootSegBuf->word + j++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
|
||||
page++;
|
||||
@ -143,8 +143,8 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
||||
cndBE.b[0] = cndLE.b[7];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
}
|
||||
|
||||
|
||||
@ -161,24 +161,24 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_RD_ID, cbd);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 0 PC = 0 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
// 25ms待ち
|
||||
start = OS_GetTick();
|
||||
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0;
|
||||
reg_MCCMD1 = 0x0;
|
||||
reg_HOTSW_MCCMD0 = 0x0;
|
||||
reg_HOTSW_MCCMD1 = 0x0;
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 1 PC = 111 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,7, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_scr = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
cbd->id_scr = reg_HOTSW_MCD1;
|
||||
}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
@ -224,16 +224,16 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
|
||||
cndBE.b[0] = cndLE.b[7];
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
// (START = 1 W/R = 0 TRM = 0 PC = 000(0ページ) CS = 1 Latency2 =0 SE = 1 DS = 1 Latency1 = 0に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,0, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
// 25ms待ち (latencyで設定できる以上のwaitが必要だから)
|
||||
start = OS_GetTick();
|
||||
@ -241,18 +241,18 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
|
||||
|
||||
for(k=0; k<ONE_SEGMENT_PAGE_NUM; k++){
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0;
|
||||
reg_MCCMD1 = 0x0;
|
||||
reg_HOTSW_MCCMD0 = 0x0;
|
||||
reg_HOTSW_MCCMD1 = 0x0;
|
||||
|
||||
// (START = 1 W/R = 0 TRM = 0 PC = 001(1ページリード) CS = 1 Latency2 = 0 SE = 1 DS = 1 Latency1 = 1540に)
|
||||
// latency1 : 1540 --> Output Latency = 230us 転送クロックタイプ = 0で周期が150ns だから 230000 / 150 = 1533.33
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 1,1, 0,0, 0, 0,1,1, 1540));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pSecureSegBuf + j++) = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -277,25 +277,25 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_ON, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
// 25ms待ち
|
||||
start = OS_GetTick();
|
||||
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0;
|
||||
reg_MCCMD1 = 0x0;
|
||||
reg_HOTSW_MCCMD0 = 0x0;
|
||||
reg_HOTSW_MCCMD1 = 0x0;
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
cbd->vbi++;
|
||||
@ -314,25 +314,25 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_OFF, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
// 25ms待ち
|
||||
start = OS_GetTick();
|
||||
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0;
|
||||
reg_MCCMD1 = 0x0;
|
||||
reg_HOTSW_MCCMD0 = 0x0;
|
||||
reg_HOTSW_MCCMD1 = 0x0;
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
cbd->vbi++;
|
||||
@ -351,25 +351,25 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_CHG_MODE, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,1,1, 0));
|
||||
|
||||
// 25ms待ち
|
||||
start = OS_GetTick();
|
||||
while(OS_TicksToMilliSeconds(OS_GetTick()-start) < COMMAND_DECRYPTION_WAIT){}
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0;
|
||||
reg_MCCMD1 = 0x0;
|
||||
reg_HOTSW_MCCMD0 = 0x0;
|
||||
reg_HOTSW_MCCMD1 = 0x0;
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 Latency1 = 0 に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,0, 0,0, 0, 0,0,0, 0));
|
||||
|
||||
while(reg_MCCNT1 & START_FLG_MASK){}
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){}
|
||||
|
||||
// コマンドカウンタインクリメント
|
||||
cbd->vbi++;
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
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.
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <sysmenu/hotsw.h>
|
||||
#include <hotswTypes.h>
|
||||
|
||||
|
||||
const BLOWFISH_CTX GCDi_BlowfishInitTableDS = {
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
|
||||
#include <nitro/card/types.h>
|
||||
#include <sysmenu.h>
|
||||
#include <hotswTypes.h>
|
||||
#include <blowfish.h>
|
||||
#include <dsCardType1.h>
|
||||
#include <dsCardType2.h>
|
||||
@ -70,13 +71,13 @@ static CardBootData s_cbData;
|
||||
|
||||
static CardBootFunction s_funcTable[] = {
|
||||
// DS Card Type 1
|
||||
{ ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1,
|
||||
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1,
|
||||
ReadIDGame_DSType1, ReadPageGame_DSType1},
|
||||
{ ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数
|
||||
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数
|
||||
ReadIDGame_DSType1, ReadPageGame_DSType1}, // Game モード関数
|
||||
// DS Card Type 2
|
||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType1,
|
||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2,
|
||||
ReadIDGame_DSType1, ReadPageGame_DSType1}
|
||||
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
||||
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
||||
ReadIDGame_DSType2, ReadPageGame_DSType2} // Game モード関数
|
||||
};
|
||||
|
||||
|
||||
@ -407,20 +408,20 @@ static void LoadTable(void)
|
||||
u32 temp;
|
||||
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x0000009f;
|
||||
reg_MCCMD1 = 0x00000000;
|
||||
reg_HOTSW_MCCMD0 = 0x0000009f;
|
||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
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,5, 0,0, 0, 0,0,0, 0));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
temp = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
temp = reg_HOTSW_MCD1;
|
||||
}
|
||||
|
||||
OS_TPrintf("Load Table...\n");
|
||||
@ -434,20 +435,20 @@ static void LoadTable(void)
|
||||
static void ReadIDNormal(void)
|
||||
{
|
||||
// MCCMD レジスタ設定
|
||||
reg_MCCMD0 = 0x00000090;
|
||||
reg_MCCMD1 = 0x00000000;
|
||||
reg_HOTSW_MCCMD0 = 0x00000090;
|
||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000);
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
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,7, 0,0, 0, 0,0,0, 2320));
|
||||
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_MCCNT1 & READY_FLG_MASK)){}
|
||||
s_cbData.id_nml = reg_MCD1;
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
s_cbData.id_nml = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -547,7 +548,7 @@ static void McPowerOn(void)
|
||||
|
||||
|
||||
// リセットをhighに (RESB = 1にする)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) |
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) |
|
||||
CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0));
|
||||
// 10ms待ち
|
||||
start = OS_GetTick();
|
||||
@ -570,17 +571,17 @@ static void SetMCSCR(void)
|
||||
u32 pna_h = (u32)(s_cbData.vd >> 17);
|
||||
|
||||
// SCR A
|
||||
reg_MCSCR0 = pna_l;
|
||||
reg_HOTSW_MCSCR0 = pna_l;
|
||||
|
||||
// SCR B
|
||||
reg_MCSCR1 = PNB_L_VALUE;
|
||||
reg_HOTSW_MCSCR1 = PNB_L_VALUE;
|
||||
|
||||
// [d0 -d6 ] -> SCR A
|
||||
// [d16-d22] -> SCR B
|
||||
reg_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
|
||||
reg_HOTSW_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16);
|
||||
|
||||
// MCCNT1 レジスタ設定 (SCR = 1に)
|
||||
reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) |
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) |
|
||||
CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0));
|
||||
}
|
||||
|
||||
@ -664,7 +665,7 @@ static void InterruptCallbackCard(void)
|
||||
MI_CpuClear8(s_pSecureSegBuffer, s_SecureSegBufSize);
|
||||
|
||||
// MC_CNT1を初期化
|
||||
reg_MCCNT1 = 0x0;
|
||||
reg_HOTSW_MCCNT1 = 0x0;
|
||||
|
||||
// カードロックIDの開放
|
||||
OS_ReleaseLockID( s_cbData.lockID );
|
||||
@ -781,7 +782,7 @@ static void ShowRegisterData(void)
|
||||
OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT);
|
||||
OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1);
|
||||
OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2);
|
||||
OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_MCCNT0);
|
||||
OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_MCCNT1);
|
||||
OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_HOTSW_MCCNT0);
|
||||
OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_HOTSW_MCCNT1);
|
||||
OS_TPrintf("----------------------------------------------------------\n");
|
||||
}
|
||||
|
||||
@ -5,256 +5,12 @@
|
||||
#ifndef __MY_CARD_H__
|
||||
#define __MY_CARD_H__
|
||||
|
||||
#include <twl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <twl.h>
|
||||
#include <twl/os/common/format_rom.h>
|
||||
|
||||
// Define -------------------------------------------------------------------
|
||||
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
|
||||
#define DMA_NO 2 //
|
||||
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
|
||||
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
|
||||
|
||||
#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値))
|
||||
#define VBI_VALUE 0x00000 // VBI (コマンドカウンタ 初期値)
|
||||
#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値)
|
||||
|
||||
#define PNA_BASE_VALUE 0x60e8 //
|
||||
#define PNB_L_VALUE 0x879b9b05 //
|
||||
#define PNB_H_VALUE 0x5c //
|
||||
|
||||
// コントロールレジスタ1 bit関連
|
||||
#define START_FLG_MASK 0x80000000
|
||||
#define READY_FLG_MASK 0x00800000
|
||||
|
||||
#define LATENCY1_SHIFT 0
|
||||
#define LATENCY1_MASK 0x00001fff
|
||||
|
||||
#define DS_SHIFT 13
|
||||
#define DS_MASK 0x00002000
|
||||
|
||||
#define SE_SHIFT 14
|
||||
#define SE_MASK 0x00004000
|
||||
|
||||
#define SCR_SHIFT 15
|
||||
#define SCR_MASK 0x00008000
|
||||
|
||||
#define LATENCY2_SHIFT 16
|
||||
#define LATENCY2_MASK 0x003f0000
|
||||
|
||||
#define CS_SHIFT 22
|
||||
#define CS_MASK 0x00400000
|
||||
|
||||
#define RDY_SHIFT 23
|
||||
#define RDY_MASK 0x00800000
|
||||
|
||||
#define PC_SHIFT 24
|
||||
#define PC_MASK 0x07000000
|
||||
|
||||
#define CT_SHIFT 27
|
||||
#define CT_MASK 0x08000000
|
||||
|
||||
#define TRM_SHIFT 28
|
||||
#define TRM_MASK 0x10000000
|
||||
|
||||
#define RESB_SHIFT 29
|
||||
#define RESB_MASK 0x20000000
|
||||
|
||||
#define WR_SHIFT 30
|
||||
#define WR_MASK 0x40000000
|
||||
|
||||
#define START_SHIFT 31
|
||||
#define START_MASK 0x80000000
|
||||
|
||||
#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \
|
||||
(u32)( \
|
||||
((u32)(start)<< START_SHIFT) | \
|
||||
((u32)(wr) << WR_SHIFT) | \
|
||||
((u32)(resb) << RESB_SHIFT) | \
|
||||
((u32)(rtm) << TRM_SHIFT) | \
|
||||
((u32)(ct) << CT_SHIFT) | \
|
||||
((u32)(pc) << PC_SHIFT) | \
|
||||
((u32)(rdy) << RDY_SHIFT) | \
|
||||
((u32)(cs) << CS_SHIFT) | \
|
||||
((u32)(l2) << LATENCY2_SHIFT) | \
|
||||
((u32)(scr) << SCR_SHIFT) | \
|
||||
((u32)(se) << SE_SHIFT) | \
|
||||
((u32)(ds) << DS_SHIFT) | \
|
||||
((u32)(l1) << LATENCY1_SHIFT) \
|
||||
)
|
||||
|
||||
#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \
|
||||
(u32)( ((start) ? START_MASK : 0) | \
|
||||
((wr) ? WR_MASK : 0) | \
|
||||
((resb) ? RESB_MASK : 0) | \
|
||||
((rtm) ? TRM_MASK : 0) | \
|
||||
((ct) ? CT_MASK : 0) | \
|
||||
((pc) ? PC_MASK : 0) | \
|
||||
((rdy) ? RDY_MASK : 0) | \
|
||||
((cs) ? CS_MASK : 0) | \
|
||||
((l2) ? LATENCY2_MASK : 0)| \
|
||||
((scr) ? SCR_MASK : 0) | \
|
||||
((se) ? SE_MASK : 0) | \
|
||||
((ds) ? DS_MASK : 0) | \
|
||||
((l1) ? LATENCY1_MASK : 0))
|
||||
|
||||
|
||||
|
||||
//#define USE_SLOT_A
|
||||
|
||||
#ifdef USE_SLOT_A
|
||||
// Slot A
|
||||
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
|
||||
#define SLOT_STATUS_MODE_00 0x00
|
||||
#define SLOT_STATUS_MODE_01 0x04
|
||||
#define SLOT_STATUS_MODE_10 0x08
|
||||
#define SLOT_STATUS_MODE_11 0x0c
|
||||
|
||||
#define reg_MCCNT1 reg_MI_MCCNT1_A
|
||||
|
||||
#define reg_MCCMD0 reg_MI_MCCMD0_A
|
||||
#define reg_MCCMD1 reg_MI_MCCMD1_A
|
||||
|
||||
#define reg_MCCNT0 reg_MI_MCCNT0_A
|
||||
#define reg_MCCNT1 reg_MI_MCCNT1_A
|
||||
|
||||
#define reg_MCD1 reg_MI_MCD1_A
|
||||
|
||||
#define reg_MCSCR0 reg_MI_MCSCR0_A
|
||||
#define reg_MCSCR1 reg_MI_MCSCR1_A
|
||||
#define reg_MCSCR2 reg_MI_MCSCR2_A
|
||||
|
||||
#else
|
||||
// Slot B
|
||||
#define SLOT_STATUS_MODE_SELECT_MSK 0xc0
|
||||
#define SLOT_STATUS_MODE_00 0x00
|
||||
#define SLOT_STATUS_MODE_01 0x40
|
||||
#define SLOT_STATUS_MODE_10 0x80
|
||||
#define SLOT_STATUS_MODE_11 0xc0
|
||||
|
||||
#define reg_MCCNT1 reg_MI_MCCNT1_B
|
||||
|
||||
#define reg_MCCMD0 reg_MI_MCCMD0_B
|
||||
#define reg_MCCMD1 reg_MI_MCCMD1_B
|
||||
|
||||
#define reg_MCCNT0 reg_MI_MCCNT0_B
|
||||
#define reg_MCCNT1 reg_MI_MCCNT1_B
|
||||
|
||||
#define reg_MCD1 reg_MI_MCD1_B
|
||||
|
||||
#define reg_MCSCR0 reg_MI_MCSCR0_B
|
||||
#define reg_MCSCR1 reg_MI_MCSCR1_B
|
||||
#define reg_MCSCR2 reg_MI_MCSCR2_B
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// Enum ---------------------------------------------------------------------
|
||||
typedef enum CardTypeEx{
|
||||
DS_CARD_TYPE_1 = 0,
|
||||
DS_CARD_TYPE_2,
|
||||
TWL_CARD
|
||||
}CardTypeEx;
|
||||
|
||||
typedef enum NormalCommandType{
|
||||
RD_ID = 0,
|
||||
RD_BSEG,
|
||||
CHG_MODE
|
||||
}NormalCommandType;
|
||||
|
||||
typedef enum SecureCommandType{
|
||||
S_RD_ID = 0,
|
||||
S_RD_SEG,
|
||||
S_PNG_ON,
|
||||
S_PNG_OFF,
|
||||
S_CHG_MODE
|
||||
}SecureCommandType;
|
||||
|
||||
typedef enum GameCommandType{
|
||||
G_RD_ID = 0,
|
||||
G_RD_PAGE
|
||||
}GameCommandType;
|
||||
|
||||
typedef enum CardType{
|
||||
CARD_DS_TYPE1 = 0,
|
||||
CARD_DS_TYPE2,
|
||||
CARD_TWL
|
||||
}CardType;
|
||||
|
||||
// union ---------------------------------------------------------------------
|
||||
typedef union
|
||||
{
|
||||
u64 dw;
|
||||
u8 b[8];
|
||||
}
|
||||
GCDCmd64;
|
||||
|
||||
// ブートセグメントデータ
|
||||
typedef union BootSegmentData
|
||||
{
|
||||
ROM_Header rh;
|
||||
u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)];
|
||||
}
|
||||
BootSegmentData;
|
||||
|
||||
// struct -------------------------------------------------------------------
|
||||
typedef struct BLOWFISH_CTX{
|
||||
u32 P[16 + 2];
|
||||
u32 S[4][256];
|
||||
} BLOWFISH_CTX;
|
||||
|
||||
// カードブート時に必要な変数一式をまとめた構造体
|
||||
typedef struct CardBootData{
|
||||
u16 lockID;
|
||||
|
||||
u32 vae;
|
||||
u32 vbi;
|
||||
u32 vd;
|
||||
|
||||
u32 id_nml;
|
||||
u32 id_scr;
|
||||
u32 id_gam;
|
||||
|
||||
u32 arm9StaticSize;
|
||||
u32 arm7StaticSize;
|
||||
u32 arm9LtdSize;
|
||||
u32 arm7LtdSize;
|
||||
|
||||
BOOL twlFlg;
|
||||
|
||||
u32 keyBuf[KEY_BUF_SIZE];
|
||||
|
||||
u64 secureSegNum;
|
||||
|
||||
CardTypeEx cardType;
|
||||
|
||||
BootSegmentData *pBootSegBuf;
|
||||
u32 *pSecureSegBuf;
|
||||
|
||||
BLOWFISH_CTX keyTable;
|
||||
}
|
||||
CardBootData;
|
||||
|
||||
// カード起動用関数
|
||||
typedef struct CardBootFunction {
|
||||
// void (*ReadID_N)(CardBootData *cbd); // ノーマルモードのID読みは全タイプで共通
|
||||
void (*ReadBootSegment_N)(CardBootData *cbd);
|
||||
void (*ChangeMode_N)(CardBootData *cbd);
|
||||
|
||||
void (*ReadID_S)(CardBootData *cbd);
|
||||
void (*ReadSegment_S)(CardBootData *cbd);
|
||||
void (*SetPNG_S)(CardBootData *cbd);
|
||||
void (*ChangeMode_S)(CardBootData *cbd);
|
||||
|
||||
void (*ReadID_G)(CardBootData *cbd);
|
||||
void (*ReadPage_G)(u32 addr, void* buf, u32 size);
|
||||
}
|
||||
CardBootFunction;
|
||||
|
||||
|
||||
// Function prototype -------------------------------------------------------
|
||||
// 活栓挿抜処理の初期化
|
||||
void HOTSW_Init(void);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user