(更新: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:
(no author) 2008-05-16 02:39:05 +00:00
parent 3973cb225a
commit b6fb3b10f7
4 changed files with 172 additions and 95 deletions

View File

@ -55,6 +55,13 @@
#define HOTSW_EXMEMCNT_SELB_SHIFT 10
#endif
// enum ---------------------------------------------------------------------
typedef enum HotSwCallBackType{
HOTSW_CHANGE_GAMEMODE = 0,
HOTSW_CARD_INSERT,
HOTSW_CARD_PULLOUT
} HotSwCallBackType;
// Function prototype -------------------------------------------------------
static BOOL IsSwap(void);
static u32 GetMcSlotShift(void);
@ -114,10 +121,9 @@ static BOOL CheckExtArm7HashValue(void);
static BOOL CheckExtArm9HashValue(void);
#else
static void ReadCardData(u32 src, u32 dest, u32 size);
static void SendPxiMessage(HotSwCallBackType type);
#endif
static void ShowRegisterData(void);
static void ShowRomHeaderData(void);
static void DebugPrintErrorMessage(HotSwState state);
HotSwState HOTSWi_RefreshBadBlock(u32 romMode);
@ -216,6 +222,13 @@ void HOTSW_Init(u32 threadPrio)
PXI_Init();
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();
@ -244,13 +257,13 @@ void HOTSW_Init(u32 threadPrio)
s32 tempLockID;
// ARM9と排他制御用のロックIDの取得
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
OS_PutString("Error - Can't Get Lock ID\n");
// do nothing
}
s_RscLockID = (u16)tempLockID;
// カードアクセス用のロックIDの取得
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
OS_PutString("Error - Can't Get Lock ID\n");
// do nothing
}
s_CardLockID = (u16)tempLockID;
}
@ -916,20 +929,17 @@ static void ReadCardData(u32 src, u32 dest, u32 size)
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__);
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);
}
// --- Key Table
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;
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 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 *)((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
if(src < keyTable2Adr){
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
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;
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 *)((u32)s_cbData.pSecure2SegBuf + (src - Secure2Adr)), (u32 *)dest, sendSize);
}
// --- Game2 Segment
else{
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = size;
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
}
}
// --- Game Segment
else{
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
sendSize = size;
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;
break;
}
OS_TPrintf("%s %d Send Error Code[Arm7]:%x\n", __FUNCTION__, __LINE__, retval);
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
@ -1737,6 +1740,10 @@ static void HotSwThread(void *arg)
SYSMi_GetWork()->cardReadParam.size);
continue;
}
if( msg->type == HOTSW_INSERT ){
SendPxiMessage(HOTSW_CARD_INSERT);
}
#endif
while(1){
@ -1760,7 +1767,9 @@ static void HotSwThread(void *arg)
SYSMi_GetWork()->flags.hotsw.isCardGameMode = TRUE;
#endif
UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc);
#ifdef USE_WRAM_LOAD
SendPxiMessage(HOTSW_CHANGE_GAMEMODE);
#endif
OS_PutString("ok!\n");
}
break;
@ -1814,6 +1823,10 @@ static void HotSwThread(void *arg)
// カードが抜けてたら
else{
#ifdef USE_WRAM_LOAD
SendPxiMessage(HOTSW_CARD_PULLOUT);
#endif
ClearCardFlgs();
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
@ -2525,70 +2575,6 @@ static BOOL CheckExtArm9HashValue(void)
#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制御レジスタ (slot status) : %08x\n", reg_MI_MC1);
OS_TPrintf("MC I/F制御レジスタ (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

View File

@ -18,17 +18,23 @@
#include <sysmenu.h>
// 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 -------------------------------------------------------
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err);
// Static Values ------------------------------------------------------------
HotSwMessageForArm9 s_HotswMsg;
OSMessage s_HotswMsgBuffer[HOTSW_READ_MSG_NUM];
OSMessageQueue s_HotswQueue;
static HotSwMessageForArm9 s_HotswMsg;
static OSMessage s_HotswMsgBuffer[HOTSW_READ_MSG_NUM];
static OSMessageQueue s_HotswQueue;
static BOOL s_ReadBusy;
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
BOOL s_ReadBusy;
// ===========================================================================
// Function Describe
@ -38,18 +44,25 @@ BOOL s_ReadBusy;
Description:
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
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 );
// Busyフラグを落としておく
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.ctrl = TRUE;
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
@ -93,6 +108,8 @@ void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
msg.msg.finalize = TRUE;
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)
{
// do nothing
@ -214,14 +231,32 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
#pragma unused(err)
HotSwPxiMessageForArm9 d;
MI_CpuClear8( &d, sizeof(HotSwPxiMessageForArm9) );
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){
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;
@ -230,4 +265,49 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
// メッセージ送信
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

View File

@ -110,7 +110,9 @@ void TwlMain( void )
TP_Init();
RTC_Init();
SND_Init();// sound init
#ifdef USE_WRAM_LOAD
HOTSW_Init();
#endif
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );

View File

@ -94,9 +94,6 @@ typedef struct HotSwMessageForArm9{
// Function prototype -------------------------------------------------------
// --- ARM9
#ifdef SDK_ARM9
// 活栓挿抜処理の初期化
void HOTSW_Init();
// PXI通信でARM7に活線挿抜有効無効を通知
void HOTSW_EnableHotSWAsync( BOOL enable );
@ -110,12 +107,24 @@ BOOL HOTSW_isEnableHotSW(void);
BOOL HOTSW_isCardLoadCompleted(void);
#ifdef USE_WRAM_LOAD
// 活栓挿抜処理の初期化
void HOTSW_Init();
// カードデータを読み出す関数(同期版)
CardDataReadState HOTSW_ReadCardData(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);
#endif