TwlIPL/build/libraries_sysmenu/card/common/include/Card.h
akabane_jumpei 3fb9f3bed2 活栓挿抜用ソースを追加。未完成。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@160 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2007-11-13 08:12:26 +00:00

265 lines
6.7 KiB
C

/*---------------------------------------------------------------------------*
Project: TwlSDK
File: Card.h
*---------------------------------------------------------------------------*/
#ifndef __MY_CARD_H__
#define __MY_CARD_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 0xbbbbb // 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_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_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 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{
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;
BootSegmentData *pBootSegBuf;
u32 *pSecureSegBuf;
BLOWFISH_CTX keyTable;
}
CardBootData;
// カード起動用関数
typedef struct CardBootFunction {
void (*ReadID_N)(CardBootData *cbd);
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);
}
CardBootFunction;
// Function prototype -------------------------------------------------------
// 活栓挿抜処理の初期化
void Card_Init(void);
// カード起動。Normalモード→Secureモード→Gameモードを行う。
void Card_Boot(void);
// Boot Segment バッファの指定
void Card_SetBootSegmentBuffer(void* buf, u32 size);
// Secure Segment バッファの指定
void Card_SetSecureSegmentBuffer(void* buf, u32 size);
// Boot Segment を読み込む関数
BOOL Card_GetRomHeaderData(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif // __MY_CARD_H__