mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新: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:
parent
28a0a22b9a
commit
5cac7ab7b1
@ -34,32 +34,43 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// --- NewDMA Ch
|
||||||
|
#define HOTSW_NDMA_NO 2
|
||||||
|
|
||||||
#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ
|
// --- Blowfish
|
||||||
#define HOTSW_NDMA_NO 2 // 使用するNDmaのチャンネル
|
#define KEY_BUF_SIZE 3
|
||||||
#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ
|
|
||||||
|
|
||||||
#define PAGE_SIZE 0x200 // 1ページのサイズ(バイト単位)
|
// --- Boot Segment
|
||||||
#define PAGE_WORD_SIZE 0x80 // 1ページのサイズ(ワード単位)
|
#define BOOT_SEGMENT_SIZE 0x1000
|
||||||
|
|
||||||
#define ONE_SEGMENT_SIZE 0x1000 // 1Segmentのサイズ(バイト単位)
|
// --- Secure Segment
|
||||||
#define ONE_SEGMENT_WORD_SIZE 0x400 // 1Segmentのサイズ(ワード単位)
|
#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) // スタックサイズ
|
// --- Rom Emulation
|
||||||
#define HOTSW_DMA_MSG_NUM 8 // DMA転送終了割り込み
|
#define ROM_EMULATION_DATA_SIZE 0x20
|
||||||
#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) // 受信バッファの数
|
|
||||||
|
|
||||||
// コントロールレジスタ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
|
#define HOTSW_E2PROM_CTRL_MASK 0x00ff
|
||||||
|
|
||||||
// コントロールレジスタ1 bit関連
|
// --- Card Control Reg 1
|
||||||
#define START_FLG_MASK 0x80000000
|
#define START_FLG_MASK 0x80000000
|
||||||
#define READY_FLG_MASK 0x00800000
|
#define READY_FLG_MASK 0x00800000
|
||||||
|
|
||||||
@ -102,10 +113,10 @@ extern "C" {
|
|||||||
#define START_SHIFT 31
|
#define START_SHIFT 31
|
||||||
#define START_MASK 0x80000000
|
#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
|
#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_0 0x0UL << PC_SHIFT
|
||||||
#define HOTSW_PAGE_1 0x1UL << PC_SHIFT
|
#define HOTSW_PAGE_1 0x1UL << PC_SHIFT
|
||||||
#define HOTSW_PAGE_2 0x2UL << 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_32 0x6UL << PC_SHIFT
|
||||||
#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT
|
#define HOTSW_PAGE_STAT 0x7UL << PC_SHIFT
|
||||||
|
|
||||||
|
// --- Latency
|
||||||
#define AddLatency2ToLatency1(param)\
|
#define AddLatency2ToLatency1(param)\
|
||||||
( (((param) & LATENCY2_MASK) \
|
( (((param) & LATENCY2_MASK) \
|
||||||
>> LATENCY2_SHIFT) \
|
>> LATENCY2_SHIFT) \
|
||||||
+ ((param) & LATENCY1_MASK) \
|
+ ((param) & LATENCY1_MASK) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// --- Register Define
|
||||||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||||||
// Slot A
|
// Slot A
|
||||||
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
|
#define SLOT_STATUS_MODE_SELECT_MSK 0x0c
|
||||||
@ -175,6 +187,11 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Enum ---------------------------------------------------------------------
|
// Enum ---------------------------------------------------------------------
|
||||||
|
typedef enum ModeType{
|
||||||
|
HOTSW_MODE1,
|
||||||
|
HOTSW_MODE2
|
||||||
|
} ModeType;
|
||||||
|
|
||||||
typedef enum CardTypeEx{
|
typedef enum CardTypeEx{
|
||||||
DS_CARD_TYPE_1 = 0,
|
DS_CARD_TYPE_1 = 0,
|
||||||
DS_CARD_TYPE_2,
|
DS_CARD_TYPE_2,
|
||||||
@ -225,6 +242,7 @@ typedef enum HotSwState{
|
|||||||
HOTSW_ID_CHECK_ERROR,
|
HOTSW_ID_CHECK_ERROR,
|
||||||
HOTSW_PULLED_OUT_ERROR,
|
HOTSW_PULLED_OUT_ERROR,
|
||||||
HOTSW_DATA_DECRYPT_ERROR,
|
HOTSW_DATA_DECRYPT_ERROR,
|
||||||
|
HOTSW_BUFFER_OVERRUN_ERROR,
|
||||||
HOTSW_UNEXPECTED_ERROR
|
HOTSW_UNEXPECTED_ERROR
|
||||||
} HotSwState;
|
} HotSwState;
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,8 @@
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <blowfish.h>
|
#include <blowfish.h>
|
||||||
|
#include <firm/format/from_firm.h>
|
||||||
|
#include <firm/hw/ARM7/mmap_firm.h>
|
||||||
|
|
||||||
#define MAXKEYBYTES 56 /* 448 bits */
|
#define MAXKEYBYTES 56 /* 448 bits */
|
||||||
#define N 16
|
#define N 16
|
||||||
@ -35,7 +37,14 @@ void GCDm_MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen)
|
|||||||
u32 *keyBuf = cbd->keyBuf;
|
u32 *keyBuf = cbd->keyBuf;
|
||||||
BLOWFISH_CTX *ctx = &cbd->keyTable;
|
BLOWFISH_CTX *ctx = &cbd->keyTable;
|
||||||
|
|
||||||
|
if(cbd->modeType == HOTSW_MODE1){
|
||||||
MI_CpuCopyFast((void *)initTable, (void *)ctx, sizeof(BLOWFISH_CTX));
|
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[0] = *RomHeaderGameCode;
|
||||||
keyBuf[1] = *RomHeaderGameCode >> 1;
|
keyBuf[1] = *RomHeaderGameCode >> 1;
|
||||||
|
|||||||
@ -51,6 +51,9 @@ static u32 GetMcSlotMask(void);
|
|||||||
static void SetMcSlotMode(u32 mode);
|
static void SetMcSlotMode(u32 mode);
|
||||||
static BOOL CmpMcSlotMode(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 SetInterruptCallback( OSIrqMask intr_bit, OSIrqFunction func );
|
||||||
static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func );
|
static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func );
|
||||||
static void SetInterrupt(void);
|
static void SetInterrupt(void);
|
||||||
@ -235,13 +238,13 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
OS_WakeupThreadDirect(&HotSwThreadData.thread);
|
OS_WakeupThreadDirect(&HotSwThreadData.thread);
|
||||||
|
|
||||||
// Boot Segment バッファの設定
|
// 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 バッファの設定
|
// 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 バッファの設定
|
// 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()){
|
if(HOTSW_IsCardExist()){
|
||||||
@ -410,6 +413,50 @@ static HotSwState LoadCardData(void)
|
|||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
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();
|
||||||
|
|
||||||
|
// セキュア2カードID読み込み
|
||||||
|
state = s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
||||||
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
|
// Secure2領域の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);
|
state = s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
@ -601,35 +648,43 @@ static HotSwState LoadStaticModule(void)
|
|||||||
{
|
{
|
||||||
HotSwState retval = HOTSW_SUCCESS;
|
HotSwState retval = HOTSW_SUCCESS;
|
||||||
HotSwState state = HOTSW_SUCCESS;
|
HotSwState state = HOTSW_SUCCESS;
|
||||||
|
u32 arm9StcEnd = s_cbData.pBootSegBuf->rh.s.main_rom_offset + s_cbData.pBootSegBuf->rh.s.main_size;
|
||||||
|
|
||||||
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
|
|
||||||
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
|
// 配置先と再配置情報を取得 & Arm9の常駐モジュール残りを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
|
||||||
retval = ReadPageGame(&s_cbData, s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
if(SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg)){
|
||||||
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
|
if(arm9StcEnd > SECURE_SEGMENT_END){
|
||||||
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
|
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){
|
if(retval != HOTSW_SUCCESS){
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
|
||||||
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
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);
|
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;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
retval = HOTSW_BUFFER_OVERRUN_ERROR;
|
||||||
|
}
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TWLでのみロード
|
|
||||||
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
// [TODO] TWLカード対応 (※ 拡張領域の境界はRomHeaderの値で計算する)
|
||||||
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
|
if( s_cbData.twlFlg ) {
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
|
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;
|
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
|
||||||
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
// 配置先と再配置情報を取得 & Arm9の常駐モジュールを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
|
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);
|
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;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
|
||||||
@ -639,17 +694,24 @@ static HotSwState LoadStaticModule(void)
|
|||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
|
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
|
||||||
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
retval = HOTSW_BUFFER_OVERRUN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
|
||||||
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
// 配置先と再配置情報を取得 & Arm7の常駐モジュールを指定先に転送
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
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);
|
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;
|
retval = (retval == HOTSW_SUCCESS) ? state : retval;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
retval = HOTSW_BUFFER_OVERRUN_ERROR;
|
||||||
|
}
|
||||||
if(retval != HOTSW_SUCCESS){
|
if(retval != HOTSW_SUCCESS){
|
||||||
return retval;
|
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);
|
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);
|
SDK_ASSERT(size > SECURE_SEGMENT_SIZE);
|
||||||
|
|
||||||
@ -1144,7 +1206,6 @@ static void McThread(void *arg)
|
|||||||
while(1){
|
while(1){
|
||||||
// 活線挿抜抑制フラグが立っていたら処理しない
|
// 活線挿抜抑制フラグが立っていたら処理しない
|
||||||
if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) {
|
if( !SYSMi_GetWork()->flags.hotsw.isEnableHotSW ) {
|
||||||
SYSMi_GetWork()->flags.hotsw.is1stCardChecked = TRUE;
|
|
||||||
OS_PutString("### HotSw is restrained...\n");
|
OS_PutString("### HotSw is restrained...\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1187,6 +1248,7 @@ static void McThread(void *arg)
|
|||||||
SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE;
|
SYSMi_GetWork()->flags.hotsw.isExistCard = FALSE;
|
||||||
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
|
SYSMi_GetWork()->flags.hotsw.isValidCardBanner = FALSE;
|
||||||
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
|
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE;
|
||||||
|
SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = FALSE;
|
||||||
UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
|
UnlockHotSwRsc(&SYSMi_GetWork()->lockHotSW);
|
||||||
|
|
||||||
// カードブート用構造体の初期化
|
// カードブート用構造体の初期化
|
||||||
@ -1622,8 +1684,12 @@ static void DebugPrintErrorMessage(HotSwState state)
|
|||||||
OS_PutString(" - Error 7 : Data Decrypt\n");
|
OS_PutString(" - Error 7 : Data Decrypt\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HOTSW_BUFFER_OVERRUN_ERROR:
|
||||||
|
OS_PutString(" - Error 8 : Buffer OverRun\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case HOTSW_UNEXPECTED_ERROR:
|
case HOTSW_UNEXPECTED_ERROR:
|
||||||
OS_PutString(" - Error 8 : Unexpected\n");
|
OS_PutString(" - Error 9 : Unexpected\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
|
|||||||
@ -69,8 +69,8 @@ HotSwState ReadIDSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
||||||
@ -108,8 +108,8 @@ HotSwState ReadSegSecure_ROMEMU(CardBootData *cbd)
|
|||||||
// MCCMD レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
// MCCNT0 レジスタ設定
|
||||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
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)
|
// 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);
|
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 レジスタ設定
|
// MCCMD レジスタ設定
|
||||||
HOTSWi_SetCommand(&cndLE);
|
HOTSWi_SetCommand(&cndLE);
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK;
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
|
|
||||||
|
|||||||
@ -33,11 +33,6 @@ typedef enum HotSwMessageType{
|
|||||||
HOTSW_CONTROL
|
HOTSW_CONTROL
|
||||||
} HotSwMessageType;
|
} HotSwMessageType;
|
||||||
|
|
||||||
typedef enum ModeType{
|
|
||||||
HOTSW_MODE1,
|
|
||||||
HOTSW_MODE2
|
|
||||||
} ModeType;
|
|
||||||
|
|
||||||
// union -------------------------------------------------------------------
|
// union -------------------------------------------------------------------
|
||||||
// PXI用メッセージ
|
// PXI用メッセージ
|
||||||
typedef union HotSwPxiMessage{
|
typedef union HotSwPxiMessage{
|
||||||
@ -68,12 +63,6 @@ BOOL HOTSW_IsCardExist(void);
|
|||||||
// カードにアクセスできる状態か判定
|
// カードにアクセスできる状態か判定
|
||||||
BOOL HOTSW_IsCardAccessible(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エミュレーション情報を格納しているバッファのポインタを返す
|
// Romエミュレーション情報を格納しているバッファのポインタを返す
|
||||||
#ifdef SDK_ARM7
|
#ifdef SDK_ARM7
|
||||||
void* HOTSW_GetRomEmulationBuffer(void);
|
void* HOTSW_GetRomEmulationBuffer(void);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user