(更新:Akabane Jumpei)

・TWLカード対応(未完成)
・Game領域の常駐モジュール展開時の条件を修正
・ソース整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080312_hotsw@877 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-03-13 01:08:09 +00:00
parent 28a0a22b9a
commit 5cac7ab7b1
5 changed files with 171 additions and 86 deletions

View File

@ -34,32 +34,43 @@ extern "C" {
#endif
#endif
// --- NewDMA Ch
#define HOTSW_NDMA_NO 2
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
// --- Blowfish
#define KEY_BUF_SIZE 3
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位)
// --- Boot Segment
#define BOOT_SEGMENT_SIZE 0x1000
#define ONE_SEGMENT_SIZE 0x1000 // 1Segmentのサイズ(バイト単位)
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1Segmentのサイズ(ワード単位)
// --- Secure Segment
#define SECURE_SEGMENT_START 0x4000
#define SECURE_SEGMENT_SIZE 0x4000
#define SECURE_SEGMENT_END (SECURE_SEGMENT_START + SECURE_SEGMENT_SIZE)
#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ
// --- Page / Segment (Byte)
#define PAGE_SIZE 0x200
#define ONE_SEGMENT_SIZE 0x1000
#define ROM_EMULATION_DATA_SIZE 0x20 // ROMエミュレーションデータサイズ
// --- Page / Segment (Word)
#define PAGE_WORD_SIZE 0x80
#define ONE_SEGMENT_WORD_SIZE 0x400
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
#define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
#define HOTSW_PULLED_MSG_NUM 16 // 抜け割り込み送信メッセージの数
#define HOTSW_CTRL_MSG_NUM 8 // PXI割り込み送信メッセージの数
#define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM) // 受信バッファの数
// --- Rom Emulation
#define ROM_EMULATION_DATA_SIZE 0x20
// コントロールレジスタ0
// --- Thread
#define HOTSW_THREAD_STACK_SIZE (1024 * 2)
#define HOTSW_DMA_MSG_NUM 8
#define HOTSW_INSERT_MSG_NUM 16
#define HOTSW_PULLED_MSG_NUM 16
#define HOTSW_CTRL_MSG_NUM 8
#define HOTSW_MSG_BUFFER_NUM (HOTSW_INSERT_MSG_NUM + HOTSW_PULLED_MSG_NUM + HOTSW_CTRL_MSG_NUM)
// --- Card Control Reg 0
#define HOTSW_E2PROM_CTRL_MASK 0x00ff
// コントロールレジスタ1 bit関連
// --- Card Control Reg 1
#define START_FLG_MASK 0x80000000
#define READY_FLG_MASK 0x00800000
@ -102,10 +113,10 @@ extern "C" {
#define START_SHIFT 31
#define START_MASK 0x80000000
#define SCRAMBLE_MASK 0x1840e000
#define SCRAMBLE_MASK 0x1840e000 // スクランブル関係のフラグマスク
#define SECURE_COMMAND_SCRAMBLE_MASK 0x00406000 // CS SE DSĚ<E2809A>}<7D>X<EFBFBD>N
// Page Count
// --- Page Count
#define HOTSW_PAGE_0 0x0UL << PC_SHIFT
#define HOTSW_PAGE_1 0x1UL << PC_SHIFT
#define HOTSW_PAGE_2 0x2UL << PC_SHIFT
@ -115,13 +126,14 @@ extern "C" {
#define HOTSW_PAGE_32 0x6UL << PC_SHIFT
#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT
// --- Latency
#define AddLatency2ToLatency1(param)\
( (((param) & LATENCY2_MASK) \
>> LATENCY2_SHIFT) \
+ ((param) & LATENCY1_MASK) \
)
// --- Register Define
#ifndef DEBUG_USED_CARD_SLOT_B_
// Slot A
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
@ -175,6 +187,11 @@ extern "C" {
#endif
// Enum ---------------------------------------------------------------------
typedef enum ModeType{
HOTSW_MODE1,
HOTSW_MODE2
} ModeType;
typedef enum CardTypeEx{
DS_CARD_TYPE_1 = 0,
DS_CARD_TYPE_2,
@ -225,6 +242,7 @@ typedef enum HotSwState{
HOTSW_ID_CHECK_ERROR,
HOTSW_PULLED_OUT_ERROR,
HOTSW_DATA_DECRYPT_ERROR,
HOTSW_BUFFER_OVERRUN_ERROR,
HOTSW_UNEXPECTED_ERROR
} HotSwState;

View File

@ -12,6 +12,8 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <blowfish.h>
#include <firm/format/from_firm.h>
#include <firm/hw/ARM7/mmap_firm.h>
#define MAXKEYBYTES 56 /* 448 bits */
#define N 16
@ -35,7 +37,14 @@ void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen)
u32 *keyBuf = cbd->keyBuf;
BLOWFISH_CTX *ctx = &cbd->keyTable;
MI_CpuCopyFast((void *)initTable, (void *)ctx, sizeof(BLOWFISH_CTX));
if(cbd->modeType == HOTSW_MODE1){
MI_CpuCopyFast((void *)initTable, (void *)ctx, sizeof(BLOWFISH_CTX));
}
else{
keyBuf = cbd->keyBuf2;
MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX));
}
keyBuf[0] = *RomHeaderGameCode;
keyBuf[1] = *RomHeaderGameCode >> 1;

View File

@ -51,6 +51,9 @@ static u32 GetMcSlotMask(void);
static void SetMcSlotMode(u32 mode);
static BOOL CmpMcSlotMode(u32 mode);
static void SetBootSegmentBuffer(void* buf, u32 size);
static void SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size);
static void SetInterruptCallback( OSIrqMask intr_bit, OSIrqFunction func );
static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func );
static void SetInterrupt(void);
@ -235,13 +238,13 @@ void HOTSW_Init(u32 threadPrio)
OS_WakeupThreadDirect(&HotSwThreadData.thread);
// Boot Segment バッファの設定
HOTSW_SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE );
SetBootSegmentBuffer((void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_CARD_ROM_HEADER_SIZE );
// Secure1 Segment バッファの設定
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
SetSecureSegmentBuffer(HOTSW_MODE1, (void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
// Secure2 Segment バッファの設定
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE );
SetSecureSegmentBuffer(HOTSW_MODE2, (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE );
// カードが挿さってあったらスレッドを起動する
if(HOTSW_IsCardExist()){
@ -410,10 +413,54 @@ static HotSwState LoadCardData(void)
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
// ★TWLカード対応 一旦リセット後Secure2モードに移行
if(s_cbData.twlFlg == TRUE){
// Mode2に移行する準備
s_cbData.modeType = HOTSW_MODE2;
// Secure2領域・Game2領域開始アドレス算出
// ---------------------- Reset ----------------------
McPowerOff();
McPowerOn();
// ---------------------- Normal Mode ----------------------
// 先頭1Page分だけでOK。データは読み捨てバッファに
state = ReadBootSegNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// Key Table初期化
GCDm_MakeBlowfishTableDS(&s_cbData, 8);
// コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成
GenVA_VB_VD();
// セキュア2モードに移行
state = ChangeModeNormal2(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Secure2 Mode ----------------------
// PNG設定
state = s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// DS側符号生成回路初期値設定 (レジスタ設定)
SetMCSCR();
// セキュアカードID読み込み
state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// Secure領域のSegment読み込み
state = s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
// ゲームモードに移行
state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// ---------------------- Game Mode ----------------------
romMode = HOTSW_ROM_MODE_GAME;
@ -601,55 +648,70 @@ static HotSwState LoadStaticModule(void)
{
HotSwState retval = HOTSW_SUCCESS;
HotSwState state = HOTSW_SUCCESS;
u32 arm9StcEnd = s_cbData.pBootSegBuf->rh.s.main_rom_offset + s_cbData.pBootSegBuf->rh.s.main_size;
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
if(retval != HOTSW_SUCCESS){
return retval;
}
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
if(retval != HOTSW_SUCCESS){
return retval;
}
// TWLでのみロード
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送※TWLカード対応していないので、注意
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg)){
if(arm9StcEnd > SECURE_SEGMENT_END){
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), arm9StcEnd - SECURE_SEGMENT_END);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
}
}
else{
retval = HOTSW_BUFFER_OVERRUN_ERROR;
}
if(retval != HOTSW_SUCCESS){
return retval;
}
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC], s_cbData.twlFlg)){
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_rom_offset, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
else{
retval = HOTSW_BUFFER_OVERRUN_ERROR;
}
if(retval != HOTSW_SUCCESS){
return retval;
}
// [TODO] TWLカード対応 (※ 拡張領域の境界はRomHeaderの値で計算する)
if( s_cbData.twlFlg ) {
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ? s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送
if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE)){
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, (u32 *)SYSM_CARD_TWL_SECURE_BUF, size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
if( s_cbData.pBootSegBuf->rh.s.main_ltd_size > SECURE_SEGMENT_SIZE ) {
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset + SECURE_SEGMENT_SIZE,
(u32 *)(s_cbData.arm9Ltd + SECURE_SEGMENT_SIZE),
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
}
else{
retval = HOTSW_BUFFER_OVERRUN_ERROR;
}
if(retval != HOTSW_SUCCESS){
return retval;
}
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE)){
state = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset, (u32 *)s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
retval = (retval == HOTSW_SUCCESS) ? state : retval;
}
else{
retval = HOTSW_BUFFER_OVERRUN_ERROR;
}
if(retval != HOTSW_SUCCESS){
return retval;
}
@ -747,7 +809,7 @@ static HotSwState CheckCardAuthCode(void)
*
*
* ----------------------------------------------------------------- */
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
static void SetBootSegmentBuffer(void* buf, u32 size)
{
SDK_ASSERT(size > BOOT_SEGMENT_SIZE);
@ -767,7 +829,7 @@ void HOTSW_SetBootSegmentBuffer(void* buf, u32 size)
*
*
* ----------------------------------------------------------------- */
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size)
static void SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size)
{
SDK_ASSERT(size > SECURE_SEGMENT_SIZE);
@ -1144,7 +1206,6 @@ static void McThread(void *arg)
while(1){
// 活線挿抜抑制フラグが立っていたら処理しない
if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) {
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
OS_PutString("### HotSw is restrained...\n");
break;
}
@ -1187,6 +1248,7 @@ static void McThread(void *arg)
SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE;
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE;
UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
// カードブート用構造体の初期化
@ -1621,9 +1683,13 @@ static void DebugPrintErrorMessage(HotSwState state)
case HOTSW_DATA_DECRYPT_ERROR:
OS_PutString(" - Error 7 : Data Decrypt\n");
break;
case HOTSW_BUFFER_OVERRUN_ERROR:
OS_PutString(" - Error 8 : Buffer OverRun\n");
break;
case HOTSW_UNEXPECTED_ERROR:
OS_PutString(" - Error 8 : Unexpected\n");
OS_PutString(" - Error 9 : Unexpected\n");
break;
default :

View File

@ -69,8 +69,8 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
@ -108,8 +108,8 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd)
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
@ -168,6 +168,9 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
// MCCMD レジスタ設定
HOTSWi_SetCommand(&cndLE);
// MCCNT0 レジスタ設定
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 レジスタ設定 (START = 1 に)
reg_HOTSW_MCCNT1 = START_MASK;

View File

@ -33,11 +33,6 @@ typedef enum HotSwMessageType{
HOTSW_CONTROL
} HotSwMessageType;
typedef enum ModeType{
HOTSW_MODE1,
HOTSW_MODE2
} ModeType;
// union -------------------------------------------------------------------
// PXI用メッセージ
typedef union HotSwPxiMessage{
@ -68,12 +63,6 @@ BOOL HOTSW_IsCardExist(void);
// カードにアクセスできる状態か判定
BOOL HOTSW_IsCardAccessible(void);
// Boot Segment バッファの指定
void HOTSW_SetBootSegmentBuffer(void* buf, u32 size);
// Secure Segment バッファの指定
void HOTSW_SetSecureSegmentBuffer(ModeType type ,void* buf, u32 size);
// Romエミュレーション情報を格納しているバッファのポインタを返す
#ifdef SDK_ARM7
void* HOTSW_GetRomEmulationBuffer(void);