mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・カードがGameモードに遷移したとき ・カードがさされたとき ・カードが抜かれたとき のイベントが発生したときに、指定した関数を呼び出せるように修正 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1374 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
3973cb225a
commit
b6fb3b10f7
@ -55,6 +55,13 @@
|
|||||||
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// enum ---------------------------------------------------------------------
|
||||||
|
typedef enum HotSwCallBackType{
|
||||||
|
HOTSW_CHANGE_GAMEMODE = 0,
|
||||||
|
HOTSW_CARD_INSERT,
|
||||||
|
HOTSW_CARD_PULLOUT
|
||||||
|
} HotSwCallBackType;
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
static BOOL IsSwap(void);
|
static BOOL IsSwap(void);
|
||||||
static u32 GetMcSlotShift(void);
|
static u32 GetMcSlotShift(void);
|
||||||
@ -114,10 +121,9 @@ static BOOL CheckExtArm7HashValue(void);
|
|||||||
static BOOL CheckExtArm9HashValue(void);
|
static BOOL CheckExtArm9HashValue(void);
|
||||||
#else
|
#else
|
||||||
static void ReadCardData(u32 src, u32 dest, u32 size);
|
static void ReadCardData(u32 src, u32 dest, u32 size);
|
||||||
|
static void SendPxiMessage(HotSwCallBackType type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void ShowRegisterData(void);
|
|
||||||
static void ShowRomHeaderData(void);
|
|
||||||
static void DebugPrintErrorMessage(HotSwState state);
|
static void DebugPrintErrorMessage(HotSwState state);
|
||||||
|
|
||||||
HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
|
HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
|
||||||
@ -216,6 +222,13 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
PXI_Init();
|
PXI_Init();
|
||||||
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
|
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
|
||||||
|
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
while(!PXI_IsCallbackReady(PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM9))
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// 割り込みマスクの設定
|
// 割り込みマスクの設定
|
||||||
SetInterrupt();
|
SetInterrupt();
|
||||||
|
|
||||||
@ -244,13 +257,13 @@ void HOTSW_Init(u32 threadPrio)
|
|||||||
s32 tempLockID;
|
s32 tempLockID;
|
||||||
// ARM9と排他制御用のロックIDの取得
|
// ARM9と排他制御用のロックIDの取得
|
||||||
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
|
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
|
||||||
OS_PutString("Error - Can't Get Lock ID\n");
|
// do nothing
|
||||||
}
|
}
|
||||||
s_RscLockID = (u16)tempLockID;
|
s_RscLockID = (u16)tempLockID;
|
||||||
|
|
||||||
// カードアクセス用のロックIDの取得
|
// カードアクセス用のロックIDの取得
|
||||||
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
|
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
|
||||||
OS_PutString("Error - Can't Get Lock ID\n");
|
// do nothing
|
||||||
}
|
}
|
||||||
s_CardLockID = (u16)tempLockID;
|
s_CardLockID = (u16)tempLockID;
|
||||||
}
|
}
|
||||||
@ -916,20 +929,17 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
while(size > 0 && state == HOTSW_SUCCESS){
|
while(size > 0 && state == HOTSW_SUCCESS){
|
||||||
// --- Boot Segment
|
// --- Boot Segment
|
||||||
if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
|
if(src >= HOTSW_BOOTSEGMENT_AREA_OFS && src < HOTSW_KEYTABLE_AREA_OFS){
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = ((src + size) > HOTSW_KEYTABLE_AREA_OFS) ? HOTSW_KEYTABLE_AREA_OFS - src : size;
|
sendSize = ((src + size) > HOTSW_KEYTABLE_AREA_OFS) ? HOTSW_KEYTABLE_AREA_OFS - src : size;
|
||||||
MI_CpuCopy8((u32 *)(SYSM_CARD_ROM_HEADER_BAK + (src - HOTSW_BOOTSEGMENT_AREA_OFS)), (u32 *)dest, sendSize);
|
MI_CpuCopy8((u32 *)(SYSM_CARD_ROM_HEADER_BAK + (src - HOTSW_BOOTSEGMENT_AREA_OFS)), (u32 *)dest, sendSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Key Table
|
// --- Key Table
|
||||||
else if(src >= HOTSW_KEYTABLE_AREA_OFS && src < HOTSW_SECURE_AREA_OFS){
|
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;
|
sendSize = ((src + size) > HOTSW_SECURE_AREA_OFS) ? HOTSW_SECURE_AREA_OFS - src : size;
|
||||||
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
// --- Secure Segment
|
// --- Secure Segment
|
||||||
else if(src >= HOTSW_SECURE_AREA_OFS && src < HOTSW_GAME_AREA_OFS){
|
else if(src >= HOTSW_SECURE_AREA_OFS && src < HOTSW_GAME_AREA_OFS){
|
||||||
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;
|
sendSize = ((src + size) > HOTSW_GAME_AREA_OFS) ? HOTSW_GAME_AREA_OFS - src : size;
|
||||||
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecureSegBuf + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
|
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecureSegBuf + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
|
||||||
}
|
}
|
||||||
@ -943,32 +953,27 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
|
|
||||||
// --- Game Segment
|
// --- Game Segment
|
||||||
if(src < keyTable2Adr){
|
if(src < keyTable2Adr){
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
|
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
|
||||||
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
// --- Key Table2
|
// --- Key Table2
|
||||||
else if(src >= keyTable2Adr && src < Secure2Adr){
|
else if(src >= keyTable2Adr && src < Secure2Adr){
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
|
sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
|
||||||
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
// --- Secure2 Segment
|
// --- Secure2 Segment
|
||||||
else if(src >= Secure2Adr && src < Game2Adr){
|
else if(src >= Secure2Adr && src < Game2Adr){
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
|
sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
|
||||||
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecure2SegBuf + (src - Secure2Adr)), (u32 *)dest, sendSize);
|
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecure2SegBuf + (src - Secure2Adr)), (u32 *)dest, sendSize);
|
||||||
}
|
}
|
||||||
// --- Game2 Segment
|
// --- Game2 Segment
|
||||||
else{
|
else{
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = size;
|
sendSize = size;
|
||||||
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// --- Game Segment
|
// --- Game Segment
|
||||||
else{
|
else{
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
sendSize = size;
|
sendSize = size;
|
||||||
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
@ -1014,8 +1019,6 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
retval = CARD_READ_UNEXPECTED_ERROR;
|
retval = CARD_READ_UNEXPECTED_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_TPrintf("%s %d Send Error Code[Arm7]:%x\n", __FUNCTION__, __LINE__, retval);
|
|
||||||
|
|
||||||
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
|
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
|
||||||
|
|
||||||
@ -1737,6 +1740,10 @@ static void HotSwThread(void *arg)
|
|||||||
SYSMi_GetWork()->cardReadParam.size);
|
SYSMi_GetWork()->cardReadParam.size);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( msg->type == HOTSW_INSERT ){
|
||||||
|
SendPxiMessage(HOTSW_CARD_INSERT);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
@ -1760,7 +1767,9 @@ static void HotSwThread(void *arg)
|
|||||||
SYSMi_GetWork()->flags.hotsw.isCardGameMode = TRUE;
|
SYSMi_GetWork()->flags.hotsw.isCardGameMode = TRUE;
|
||||||
#endif
|
#endif
|
||||||
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
SendPxiMessage(HOTSW_CHANGE_GAMEMODE);
|
||||||
|
#endif
|
||||||
OS_PutString("ok!\n");
|
OS_PutString("ok!\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1814,6 +1823,10 @@ static void HotSwThread(void *arg)
|
|||||||
|
|
||||||
// カードが抜けてたら
|
// カードが抜けてたら
|
||||||
else{
|
else{
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
SendPxiMessage(HOTSW_CARD_PULLOUT);
|
||||||
|
#endif
|
||||||
|
|
||||||
ClearCardFlgs();
|
ClearCardFlgs();
|
||||||
|
|
||||||
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
||||||
@ -2032,6 +2045,43 @@ static BOOL ChangeGameMode(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SendPxiMessage
|
||||||
|
|
||||||
|
Description: ARM9‚Ƀ<EFBFBD>ƒbƒZ<EFBFBD>[ƒW‚ð‘—‚é
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
static void SendPxiMessage(HotSwCallBackType type)
|
||||||
|
{
|
||||||
|
HotSwPxiMessageForArm9 msg;
|
||||||
|
|
||||||
|
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
|
||||||
|
|
||||||
|
switch(type){
|
||||||
|
case HOTSW_CHANGE_GAMEMODE:
|
||||||
|
msg.msg.mode = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_CARD_INSERT:
|
||||||
|
msg.msg.insert = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_CARD_PULLOUT:
|
||||||
|
msg.msg.pullout = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ClearUnnecessaryCardRegister
|
Name: ClearUnnecessaryCardRegister
|
||||||
|
|
||||||
@ -2525,70 +2575,6 @@ static BOOL CheckExtArm9HashValue(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
//
|
|
||||||
// Debug用表示関数
|
|
||||||
//
|
|
||||||
// **************************************************************************
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ShowRomHeaderData
|
|
||||||
|
|
||||||
Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static void ShowRomHeaderData(void)
|
|
||||||
{
|
|
||||||
OS_TPrintf("\nDebug Data -------------------------------\n");
|
|
||||||
OS_TPrintf("1. Normal Mode ID : 0x%08x\n" , s_cbData.id_nml);
|
|
||||||
OS_TPrintf("2. Secure Mode ID : 0x%08x\n" , s_cbData.id_scr);
|
|
||||||
OS_TPrintf("3. Game Mode ID : 0x%08x\n" , s_cbData.id_gam);
|
|
||||||
|
|
||||||
OS_TPrintf("title Name : %s\n", s_pBootSegBuffer->rh.s.title_name);
|
|
||||||
OS_TPrintf("initial Code : %x\n\n", *(u32 *)s_pBootSegBuffer->rh.s.game_code);
|
|
||||||
|
|
||||||
OS_TPrintf("platform Code : 0x%02x\n\n", s_cbData.pBootSegBuf->rh.s.platform_code);
|
|
||||||
|
|
||||||
OS_TPrintf("main rom offset : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_rom_offset);
|
|
||||||
OS_TPrintf("main entry addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_entry_address);
|
|
||||||
OS_TPrintf("main ram addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ram_address);
|
|
||||||
OS_TPrintf("main size : 0x%08x\n\n", s_cbData.pBootSegBuf->rh.s.main_size);
|
|
||||||
|
|
||||||
OS_TPrintf("sub rom offset : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_rom_offset);
|
|
||||||
OS_TPrintf("sub entry addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_entry_address);
|
|
||||||
OS_TPrintf("sub ram addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ram_address);
|
|
||||||
OS_TPrintf("sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_size);
|
|
||||||
|
|
||||||
if(s_cbData.twlFlg){
|
|
||||||
OS_TPrintf("\nLtd main rom offset: 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset);
|
|
||||||
OS_TPrintf("Ltd main ram addr: 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address);
|
|
||||||
OS_TPrintf("Ltd main size : 0x%08x\n\n", s_cbData.pBootSegBuf->rh.s.main_ltd_size);
|
|
||||||
|
|
||||||
OS_TPrintf("Ltd Sub rom offset : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset);
|
|
||||||
OS_TPrintf("Ltd Sub ram addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address);
|
|
||||||
OS_TPrintf("Ltd Sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
OS_TPrintf("------------------------------------------\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: ShowRegisterData
|
|
||||||
|
|
||||||
Description:
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static void ShowRegisterData(void)
|
|
||||||
{
|
|
||||||
OS_TPrintf("----------------------------------------------------------\n");
|
|
||||||
OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT);
|
|
||||||
OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1);
|
|
||||||
OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2);
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: DebugPrintErrorMessage
|
Name: DebugPrintErrorMessage
|
||||||
|
|
||||||
|
|||||||
@ -18,17 +18,23 @@
|
|||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
|
||||||
// define -------------------------------------------------------------------
|
// define -------------------------------------------------------------------
|
||||||
#define HOTSW_READ_MSG_NUM 1
|
#define HOTSW_READ_MSG_NUM 1
|
||||||
|
#define HOTSW_CARD_GAME_MODE_CALLBACK 1
|
||||||
|
#define HOTSW_CARD_INSERT_CALLBACK 2
|
||||||
|
#define HOTSW_CARD_PULLOUT_CALLBACK 3
|
||||||
|
#define HOTSW_CALLBACK_FUNCTION_NUM 3
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
|
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
|
||||||
|
|
||||||
// Static Values ------------------------------------------------------------
|
// Static Values ------------------------------------------------------------
|
||||||
HotSwMessageForArm9 s_HotswMsg;
|
static HotSwMessageForArm9 s_HotswMsg;
|
||||||
OSMessage s_HotswMsgBuffer[HOTSW_READ_MSG_NUM];
|
static OSMessage s_HotswMsgBuffer[HOTSW_READ_MSG_NUM];
|
||||||
OSMessageQueue s_HotswQueue;
|
static OSMessageQueue s_HotswQueue;
|
||||||
|
|
||||||
|
static BOOL s_ReadBusy;
|
||||||
|
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
|
||||||
|
|
||||||
BOOL s_ReadBusy;
|
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Function Describe
|
// Function Describe
|
||||||
@ -38,18 +44,25 @@ BOOL s_ReadBusy;
|
|||||||
|
|
||||||
Description: 活栓挿抜処理の初期化
|
Description: 活栓挿抜処理の初期化
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
void HOTSW_Init()
|
void HOTSW_Init()
|
||||||
{
|
{
|
||||||
// PXI<58>‰Šú‰»
|
|
||||||
PXI_Init();
|
|
||||||
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
|
|
||||||
|
|
||||||
// メッセージキューの初期化
|
// メッセージキューの初期化
|
||||||
OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM );
|
OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM );
|
||||||
|
|
||||||
// Busyフラグを落としておく
|
// Busyフラグを落としておく
|
||||||
s_ReadBusy = FALSE;
|
s_ReadBusy = FALSE;
|
||||||
|
|
||||||
|
// PXI初期化
|
||||||
|
PXI_Init();
|
||||||
|
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
|
||||||
|
|
||||||
|
while(!PXI_IsCallbackReady(PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7))
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -72,6 +85,8 @@ void HOTSW_EnableHotSWAsync( BOOL enable )
|
|||||||
msg.msg.value = enable;
|
msg.msg.value = enable;
|
||||||
msg.msg.ctrl = TRUE;
|
msg.msg.ctrl = TRUE;
|
||||||
|
|
||||||
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
|
|
||||||
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
||||||
{
|
{
|
||||||
// do nothing
|
// do nothing
|
||||||
@ -93,6 +108,8 @@ void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
|
|||||||
msg.msg.finalize = TRUE;
|
msg.msg.finalize = TRUE;
|
||||||
msg.msg.bootType = (u8)apliType;
|
msg.msg.bootType = (u8)apliType;
|
||||||
|
|
||||||
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
|
|
||||||
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
||||||
{
|
{
|
||||||
// do nothing
|
// do nothing
|
||||||
@ -214,14 +231,32 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
|
|||||||
#pragma unused(err)
|
#pragma unused(err)
|
||||||
HotSwPxiMessageForArm9 d;
|
HotSwPxiMessageForArm9 d;
|
||||||
|
|
||||||
|
MI_CpuClear8( &d, sizeof(HotSwPxiMessageForArm9) );
|
||||||
|
|
||||||
d.data = data;
|
d.data = data;
|
||||||
|
|
||||||
|
if(d.msg.mode){
|
||||||
|
if(s_HotswFuncTable[HOTSW_CARD_GAME_MODE_CALLBACK] != NULL){
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_GAME_MODE_CALLBACK]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(d.msg.insert){
|
||||||
|
if(s_HotswFuncTable[HOTSW_CARD_INSERT_CALLBACK] != NULL){
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_INSERT_CALLBACK]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(d.msg.pullout){
|
||||||
|
if(s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK] != NULL){
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(d.msg.read){
|
if(d.msg.read){
|
||||||
s_ReadBusy = FALSE;
|
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.isReadComplete = (d.msg.read) ? TRUE : FALSE;
|
||||||
s_HotswMsg.result = (CardDataReadState)d.msg.result;
|
s_HotswMsg.result = (CardDataReadState)d.msg.result;
|
||||||
|
|
||||||
@ -230,4 +265,49 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
|
|||||||
// メッセージ送信
|
// メッセージ送信
|
||||||
OS_SendMessage( &s_HotswQueue, (OSMessage *)&s_HotswMsg, OS_MESSAGE_NOBLOCK);
|
OS_SendMessage( &s_HotswQueue, (OSMessage *)&s_HotswMsg, OS_MESSAGE_NOBLOCK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SetGameModeCallBackFunction
|
||||||
|
|
||||||
|
Description: カードがGameモードになった時のコールバック関数を設定
|
||||||
|
|
||||||
|
※ HOTSW_Initが呼び出される前に設定してください
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
void HOTSW_SetGameModeCallBackFunction(OSIrqFunction function)
|
||||||
|
{
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_GAME_MODE_CALLBACK] = function;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SetCardInsertCallBackFunction
|
||||||
|
|
||||||
|
Description: カードが刺さった時のコールバック関数を設定
|
||||||
|
|
||||||
|
※ HOTSW_Initが呼び出される前に設定してください
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
void HOTSW_SetCardInsertCallBackFunction(OSIrqFunction function)
|
||||||
|
{
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_INSERT_CALLBACK] = function;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SetCardPullOutCallBackFunction
|
||||||
|
|
||||||
|
Description: カードが抜けた時のコールバック関数を設定
|
||||||
|
|
||||||
|
※ HOTSW_Initが呼び出される前に設定してください
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
|
void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function)
|
||||||
|
{
|
||||||
|
s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK] = function;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@ -110,7 +110,9 @@ void TwlMain( void )
|
|||||||
TP_Init();
|
TP_Init();
|
||||||
RTC_Init();
|
RTC_Init();
|
||||||
SND_Init();// sound init
|
SND_Init();// sound init
|
||||||
|
#ifdef USE_WRAM_LOAD
|
||||||
HOTSW_Init();
|
HOTSW_Init();
|
||||||
|
#endif
|
||||||
|
|
||||||
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
||||||
|
|
||||||
|
|||||||
@ -94,9 +94,6 @@ typedef struct HotSwMessageForArm9{
|
|||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
// --- ARM9
|
// --- ARM9
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
// 活栓挿抜処理の初期化
|
|
||||||
void HOTSW_Init();
|
|
||||||
|
|
||||||
// PXI通信でARM7に活線挿抜有効/無効を通知
|
// PXI通信でARM7に活線挿抜有効/無効を通知
|
||||||
void HOTSW_EnableHotSWAsync( BOOL enable );
|
void HOTSW_EnableHotSWAsync( BOOL enable );
|
||||||
|
|
||||||
@ -110,12 +107,24 @@ BOOL HOTSW_isEnableHotSW(void);
|
|||||||
BOOL HOTSW_isCardLoadCompleted(void);
|
BOOL HOTSW_isCardLoadCompleted(void);
|
||||||
|
|
||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
|
// 活栓挿抜処理の初期化
|
||||||
|
void HOTSW_Init();
|
||||||
|
|
||||||
// カードデータを読み出す関数(同期版)
|
// カードデータを読み出す関数(同期版)
|
||||||
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size);
|
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size);
|
||||||
|
|
||||||
// カードデータを読み出す関数(非同期版)
|
// カードデータを読み出す関数(非同期版)
|
||||||
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size);
|
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size);
|
||||||
|
|
||||||
|
// カードがGameモードになった時のコールバック関数を設定
|
||||||
|
void HOTSW_SetGameModeCallBackFunction(OSIrqFunction function);
|
||||||
|
|
||||||
|
// カードが刺さった時のコールバック関数を設定
|
||||||
|
void HOTSW_SetCardInsertCallBackFunction(OSIrqFunction function);
|
||||||
|
|
||||||
|
// カードが抜けた時のコールバック関数を設定
|
||||||
|
void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function);
|
||||||
|
|
||||||
// カードがゲームモードになったかどうか
|
// カードがゲームモードになったかどうか
|
||||||
BOOL HOTSW_isGameMode(void);
|
BOOL HOTSW_isGameMode(void);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user