(更新者:akabane_jumpei)活線挿抜ライブラリの整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@277 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2007-11-28 00:33:31 +00:00
parent ba33ee2fbf
commit 143a61fbd7
9 changed files with 424 additions and 396 deletions

View File

@ -15,7 +15,7 @@
#include <twl/types.h>
#include <sysmenu/hotsw.h>
#include <hotswTypes.h>
#ifdef __cplusplus
extern "C" {

View File

@ -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);

View File

@ -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" */

View 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__

View File

@ -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;
}
}
}

View File

@ -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++;

View File

@ -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 = {

View File

@ -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制御レジスタ (slot status) : %08x\n", reg_MI_MC1);
OS_TPrintf("MC I/F制御レジスタ (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");
}

View File

@ -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);