(更新:Akabane Jumpei)

・WRAM経由カードアプリロード関係の修正



git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1344 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2008-05-14 10:40:41 +00:00
parent 502a4f40ce
commit 0cf9aaad4f
6 changed files with 285 additions and 121 deletions

View File

@ -243,6 +243,7 @@ typedef enum HotSwState{
HOTSW_PULLED_OUT_ERROR,
HOTSW_DATA_DECRYPT_ERROR,
HOTSW_BUFFER_OVERRUN_ERROR,
HOTSW_MODE_ERROR,
HOTSW_UNEXPECTED_ERROR
} HotSwState;
@ -321,9 +322,9 @@ typedef struct CardThreadData{
OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM];
OSMessage hotswPollingCtrlMsg[HOTSW_POLLING_CTRL_BUFFER_NUM];
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
HotSwMessageForArm7 hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
HotSwMessageForArm7 hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
HotSwMessageForArm7 hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
OSMessageQueue hotswQueue;
OSMessageQueue hotswDmaQueue;

View File

@ -94,6 +94,9 @@ static HotSwState LoadCardData(void);
static void RegisterRomEmuInfo(void);
static void GenVA_VB_VD(void);
static HotSwState ReadImageReturnErrorCode(void* dest, s32 offset, s32 length, void* arg);
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg);
static s32 LockExCard(u16 lockID);
static s32 UnlockExCard(u16 lockID);
@ -110,7 +113,7 @@ static BOOL CheckArm9HashValue(void);
static BOOL CheckExtArm7HashValue(void);
static BOOL CheckExtArm9HashValue(void);
#else
static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size);
static void ReadCardData(u32 src, u32 dest, u32 size);
#endif
static void ShowRegisterData(void);
@ -176,64 +179,6 @@ static CardSecureModeFunction s_funcTable[] = {
{ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU}
};
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg)
{
HotSwState retval;
static u8 page_buffer[512];
u32 page_offset = (u32)(offset & -512);
u32 buffer_offset = (u32)(offset % 512);
u32 valid_length = 512 - buffer_offset;
u32 remain_length;
// 開始アドレスがページの途中
if ( offset % 512 )
{
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
if (retval != HOTSW_SUCCESS)
{
return FALSE;
}
MI_CpuCopy8(page_buffer + buffer_offset, dest, (length < valid_length ? length : valid_length));
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
dest = (u8*)dest + valid_length;
offset += valid_length;
length -= valid_length;
if ( length < 0)
{
return TRUE;
}
}
remain_length = (u32)(length % 512);
retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)(length - remain_length));
// ケツがページ途中
if( remain_length ){
dest = (u8*)dest + (length - remain_length);
offset += length - remain_length;
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
if (retval != HOTSW_SUCCESS)
{
return FALSE;
}
MI_CpuCopy8(page_buffer, dest, remain_length);
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
}
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
return (retval == HOTSW_SUCCESS);
}
#ifdef DHT_TEST
#include <twl/os/ARM7/debugLED.h>
#include <sysmenu/dht/dht.h>
@ -518,7 +463,7 @@ static HotSwState LoadCardData(void)
romMode = HOTSW_ROM_MODE_SECURE;
// Secure Segment の バッファ設定
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)s_cbData.pBootSegBuf->rh.s.main_rom_offset, SECURE_AREA_SIZE );
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)s_cbData.pBootSegBuf->rh.s.main_ram_address, SECURE_AREA_SIZE );
// SecureモードのIDとSecureSegmentを読み込む
state = ReadSecureModeCardData();
@ -553,7 +498,7 @@ static HotSwState LoadCardData(void)
// ---------------------- Secure2 Mode ----------------------
// Secure Segment の バッファ設定
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, SECURE_AREA_SIZE );
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address, SECURE_AREA_SIZE );
// Secure2モードのIDとSecureSegmentを読み込む
state = ReadSecureModeCardData();
@ -840,7 +785,6 @@ static void RegisterRomEmuInfo(void)
*---------------------------------------------------------------------------*/
static HotSwState LoadBannerData(void)
{
BOOL state;
@ -880,22 +824,90 @@ static HotSwState LoadBannerData(void)
}
/*---------------------------------------------------------------------------*
Name: ReadImageReturnErrorCode
Description: (page途中)
*---------------------------------------------------------------------------*/
static HotSwState ReadImageReturnErrorCode(void* dest, s32 offset, s32 length, void* arg)
{
HotSwState retval = HOTSW_SUCCESS;
static u8 page_buffer[512];
u32 page_offset = (u32)(offset & -512);
u32 buffer_offset = (u32)(offset % 512);
u32 valid_length = 512 - buffer_offset;
u32 remain_length;
// 開始アドレスがページの途中
if ( offset % 512 )
{
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
if (retval != HOTSW_SUCCESS)
{
return retval;
}
MI_CpuCopy8(page_buffer + buffer_offset, dest, (length < valid_length ? length : valid_length));
dest = (u8*)dest + valid_length;
offset += valid_length;
length -= valid_length;
if ( length < 0)
{
return retval;
}
}
remain_length = (u32)(length % 512);
retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)(length - remain_length));
// ケツがページ途中
if( remain_length ){
dest = (u8*)dest + (length - remain_length);
offset += length - remain_length;
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
if (retval != HOTSW_SUCCESS)
{
return retval;
}
MI_CpuCopy8(page_buffer, dest, remain_length);
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: ReadImage
Description: (page途中)
TRUEを返す
*---------------------------------------------------------------------------*/
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg)
{
return (ReadImageReturnErrorCode(dest, offset, length, arg) == HOTSW_SUCCESS);
}
/*---------------------------------------------------------------------------*
Name: ReadCardData
Description: ARM9から通知された範囲のデータをカードから読み込み
twl_card_normal_area_rom_offset -> Normal領域オフセット
twl_card_keytable_area_rom_offset -> KeyTable2領域オフセット
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
static void ReadCardData(u32 src, u32 dest, u32 size)
{
u32 sendSize = 0;
BOOL result = TRUE;
HotSwState state = HOTSW_SUCCESS;
if(!SYSMi_GetWork()->flags.hotsw.isCardGameMode){
return CARD_READ_MODE_ERROR;
state = HOTSW_MODE_ERROR;
}
// カードのロック
@ -905,7 +917,7 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
LockExCard(s_CardLockID);
#endif
while(size > 0){
while(size > 0 && state == HOTSW_SUCCESS){
// --- Boot Segment
if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
@ -917,13 +929,13 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
else if(src >= HOTSW_KEYTABLE_AREA_OFS && src < HOTSW_SECURE_AREA_OFS){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((src + size) > HOTSW_SECURE_AREA_OFS) ? HOTSW_SECURE_AREA_OFS - src : size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
// --- Secure Segment
else if(src >= HOTSW_SECURE_AREA_OFS && src < HOTSW_GAME_AREA_OFS){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
OS_TPrintf("%s %d Secure Seg Buf:0x%08x\n", __FUNCTION__, __LINE__, s_cbData.pSecureSegBuf);
sendSize = ((src + size) > HOTSW_GAME_AREA_OFS) ? HOTSW_GAME_AREA_OFS - src : size;
MI_CpuCopy8((u32 *)(SYSM_CARD_NTR_SECURE_BUF + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecureSegBuf + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
}
// --- Game Segment
else if(src >= HOTSW_GAME_AREA_OFS){
@ -937,32 +949,32 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
if(src < keyTable2Adr){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
// --- Key Table2
else if(src >= keyTable2Adr && src < Secure2Adr){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
// --- Secure2 Segment
else if(src >= Secure2Adr && src < Game2Adr){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
MI_CpuCopy8((u32 *)(SYSM_CARD_TWL_SECURE_BUF + (src - Secure2Adr)), (u32 *)dest, sendSize);
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecure2SegBuf + (src - Secure2Adr)), (u32 *)dest, sendSize);
}
// --- Game2 Segment
else{
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
}
// --- Game Segment
else{
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = size;
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
}
@ -977,11 +989,47 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
UnlockExCard(s_CardLockID);
#endif
if(result){
return CARD_READ_SUCCESS;
}
else{
return CARD_READ_UNKNOWN_ERROR;
{
HotSwPxiMessageForArm9 msg;
CardDataReadState retval;
switch(state){
case HOTSW_SUCCESS:
retval = CARD_READ_SUCCESS;
break;
case HOTSW_TIME_OUT:
retval = CARD_READ_TIME_OUT;
break;
case HOTSW_PULLED_OUT_ERROR:
retval = CARD_READ_PULLED_OUT_ERROR;
break;
case HOTSW_BUFFER_OVERRUN_ERROR:
retval = CARD_READ_BUFFER_OVERRUN_ERROR;
break;
case HOTSW_MODE_ERROR:
retval = CARD_READ_MODE_ERROR;
break;
default:
retval = CARD_READ_UNEXPECTED_ERROR;
break;
}
OS_TPrintf("%s %d Send Error Code[Arm7]:%x\n", __FUNCTION__, __LINE__, retval);
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
msg.msg.read = TRUE;
msg.msg.result = (u8)retval;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
}
}
}
#endif
@ -1183,7 +1231,6 @@ while(1){ OS_WaitVBlankIntr(); }
Description: Rom Headerの認証コードアドレスを読んで
*---------------------------------------------------------------------------*/
static HotSwState CheckCardAuthCode(void)
{
u32 authBuf[PAGE_SIZE/sizeof(u32)];
@ -1651,9 +1698,9 @@ static void HotSwThread(void *arg)
{
#pragma unused( arg )
HotSwState retval;
HotSwMessage *msg;
BOOL breakFlg;
HotSwState retval;
HotSwMessageForArm7 *msg;
BOOL breakFlg;
while(1){
OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
@ -1678,11 +1725,9 @@ static void HotSwThread(void *arg)
#ifdef USE_WRAM_LOAD
if( msg->read == TRUE ){
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
SYSMi_GetWork()->cardReadParam.result = ReadCardData(SYSMi_GetWork()->cardReadParam.src,
SYSMi_GetWork()->cardReadParam.dest,
SYSMi_GetWork()->cardReadParam.size);
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = TRUE;
ReadCardData(SYSMi_GetWork()->cardReadParam.src,
SYSMi_GetWork()->cardReadParam.dest,
SYSMi_GetWork()->cardReadParam.size);
continue;
}
#endif
@ -2165,7 +2210,7 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused(tag)
#pragma unused(err)
HotSwPxiMessage d;
HotSwPxiMessageForArm7 d;
d.data = data;

View File

@ -17,10 +17,40 @@
#include <twl.h>
#include <sysmenu.h>
// define -------------------------------------------------------------------
#define HOTSW_READ_MSG_NUM 1
// Function prototype -------------------------------------------------------
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
// Static Values ------------------------------------------------------------
HotSwMessageForArm9 s_HotswMsg;
OSMessage s_HotswMsgBuffer[HOTSW_READ_MSG_NUM];
OSMessageQueue s_HotswQueue;
BOOL s_ReadBusy;
// ===========================================================================
// Function Describe
// ===========================================================================
/*---------------------------------------------------------------------------*
Name: HOTSW_Init
Description:
*---------------------------------------------------------------------------*/
void HOTSW_Init()
{
// PXI初期化
PXI_Init();
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
// メッセージキューの初期化
OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM );
// Busyフラグを落としておく
s_ReadBusy = FALSE;
}
/*---------------------------------------------------------------------------*
Name: HOTSW_EnableHotSWAsync
@ -29,9 +59,9 @@
*---------------------------------------------------------------------------*/
void HOTSW_EnableHotSWAsync( BOOL enable )
{
HotSwPxiMessage msg;
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
enable = enable ? 1 : 0;
// 現在の値と同じなら何もせずリターン
@ -56,9 +86,9 @@ void HOTSW_EnableHotSWAsync( BOOL enable )
*---------------------------------------------------------------------------*/
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
{
HotSwPxiMessage msg;
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
msg.msg.finalize = TRUE;
msg.msg.bootType = (u8)apliType;
@ -93,17 +123,29 @@ BOOL HOTSW_isCardLoadCompleted(void)
/*---------------------------------------------------------------------------*
Name: HOTSW_ReadCardData
Name: HOTSW_ReadCardDataAsync
Description:
Description: ()
ARM7側
CARD_READ_SUCCESSが返ってきても
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size)
{
HotSwPxiMessage msg;
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
if( !HOTSW_isGameMode() ){
return CARD_READ_MODE_ERROR;
}
if( s_ReadBusy ){
return CARD_READ_BUSY;
}
s_ReadBusy = TRUE;
SYSMi_GetWork()->cardReadParam.src = (u32)src;
SYSMi_GetWork()->cardReadParam.dest = (u32)dest;
@ -119,14 +161,31 @@ CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
// do nothing
}
// [TODO] ARM7側でリードが終了してステートが返ってくるのを待つ
while (!SYSMi_GetWork()->flags.hotsw.isCardReadCompleted)
{
// do nothing
}
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
return CARD_READ_SUCCESS;
}
#endif
return SYSMi_GetWork()->cardReadParam.result;
/*---------------------------------------------------------------------------*
Name: HOTSW_ReadCardData
Description: ()
ARM7側
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
{
HotSwMessageForArm9 *msg;
CardDataReadState retval;
retval = HOTSW_ReadCardDataAsync( src, dest, size);
if(retval != CARD_READ_SUCCESS){
return retval;
}
OS_ReceiveMessage( &s_HotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK );
return (CardDataReadState)msg->result;
}
#endif
@ -141,4 +200,34 @@ BOOL HOTSW_isGameMode(void)
{
return SYSMi_GetWork()->flags.hotsw.isCardGameMode ? TRUE : FALSE;
}
#endif
#endif
/*---------------------------------------------------------------------------*
Name: InterruptCallbackPxi
Description: PXI割り込みハンドラ
*---------------------------------------------------------------------------*/
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused(tag)
#pragma unused(err)
HotSwPxiMessageForArm9 d;
d.data = data;
if(d.msg.read){
s_ReadBusy = FALSE;
s_HotswMsg.isGameMode = (d.msg.mode) ? TRUE : FALSE;
s_HotswMsg.isInsert = (d.msg.insert) ? TRUE : FALSE;
s_HotswMsg.isPulledOut = (d.msg.pullout) ? TRUE : FALSE;
s_HotswMsg.isReadComplete = (d.msg.read) ? TRUE : FALSE;
s_HotswMsg.result = (CardDataReadState)d.msg.result;
OS_TPrintf("%s %d Rcev Error Code[Arm9]:%x\n", __FUNCTION__, __LINE__, s_HotswMsg.result);
// メッセージ送信
OS_SendMessage( &s_HotswQueue, (OSMessage *)&s_HotswMsg, OS_MESSAGE_NOBLOCK);
}
}

View File

@ -110,7 +110,8 @@ void TwlMain( void )
TP_Init();
RTC_Init();
SND_Init();// sound init
HOTSW_Init();
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
// 割り込み許可--------------------

View File

@ -24,7 +24,7 @@ extern "C" {
#endif
#define SYSM_HOTSW_ENABLE_ROMEMU
#define USE_WRAM_LOAD
//#define USE_WRAM_LOAD
// enum -------------------------------------------------------------------
// スレッドに送るメッセージのステート
@ -47,7 +47,7 @@ typedef enum HotSwApliType{
// union -------------------------------------------------------------------
// PXI用メッセージ
typedef union HotSwPxiMessage{
typedef union HotSwPxiMessageForArm7{
struct {
u32 value :1;
u32 ctrl :1;
@ -57,23 +57,46 @@ typedef union HotSwPxiMessage{
u32 :20;
} msg;
u32 data;
} HotSwPxiMessage;
} HotSwPxiMessageForArm7;
typedef union HotSwPxiMessageForArm9{
struct {
u32 mode :1;
u32 insert :1;
u32 pullout :1;
u32 read :1;
u32 result :8;
u32 :20;
} msg;
u32 data;
} HotSwPxiMessageForArm9;
// struct -------------------------------------------------------------------
// スレッド用メッセージ
typedef struct HotSwMessage{
typedef struct HotSwMessageForArm7{
u32 value;
BOOL ctrl;
BOOL finalize;
BOOL read;
HotSwMessageType type;
HotSwApliType apli;
} HotSwMessage;
} HotSwMessageForArm7;
typedef struct HotSwMessageForArm9{
BOOL isGameMode;
BOOL isInsert;
BOOL isPulledOut;
BOOL isReadComplete;
CardDataReadState result;
} HotSwMessageForArm9;
// Function prototype -------------------------------------------------------
// --- ARM9
#ifdef SDK_ARM9
// 活栓挿抜処理の初期化
void HOTSW_Init();
// PXI通信でARM7に活線挿抜有効無効を通知
void HOTSW_EnableHotSWAsync( BOOL enable );
@ -87,9 +110,12 @@ BOOL HOTSW_isEnableHotSW(void);
BOOL HOTSW_isCardLoadCompleted(void);
#ifdef USE_WRAM_LOAD
// カードデータを読み出す関数
// カードデータを読み出す関数(同期版)
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size);
// カードデータを読み出す関数(非同期版)
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size);
// カードがゲームモードになったかどうか
BOOL HOTSW_isGameMode(void);
#endif

View File

@ -37,9 +37,12 @@ SYSMCloneBootMode;
typedef enum CardDataReadState {
CARD_READ_SUCCESS = 0,
CARD_READ_TIME_OUT,
CARD_READ_PULLED_OUT_ERROR,
CARD_READ_BUFFER_OVERRUN_ERROR,
CARD_READ_MODE_ERROR,
CARD_READ_UNKNOWN_ERROR
CARD_READ_BUSY,
CARD_READ_UNEXPECTED_ERROR
}
CardDataReadState;
@ -124,7 +127,6 @@ typedef struct SYSM_work {
vu16 isCardGameMode :1; // カードがゲームモードに遷移したか?
vu16 :0;
vu8 isCardStateChanged; // カード状態更新フラグ
vu8 isCardReadCompleted; // カードデータリード完了?
}hotsw;
}flags; // 7B