diff --git a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c index 5cb98dc4..93de0eb6 100644 --- a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c +++ b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c @@ -17,6 +17,9 @@ #include #include +#include +#include <../ARM7/include/hotswTypes.h> + // define ------------------------------------------------------------------- #define HOTSW_READ_MSG_NUM 1 #define HOTSW_CARD_GAME_MODE_CALLBACK 1 @@ -35,6 +38,8 @@ static OSMessageQueue s_HotswQueue; static BOOL s_ReadBusy; static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM]; +static u16 s_CardLockID; + // =========================================================================== // Function Describe @@ -47,6 +52,14 @@ static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM]; #ifdef USE_WRAM_LOAD void HOTSW_Init() { + s32 tempLockID; + + // カードアクセス用のロックIDの取得 + while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){ + // do nothing + } + s_CardLockID = (u16)tempLockID; + // メッセージキューの初期化 OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM ); @@ -322,3 +335,87 @@ void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function) s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK] = function; } #endif + + +/*---------------------------------------------------------------------------* + Name: HOTSW_ReadPageGame + + Description: GameモードのPage読み関数 + *---------------------------------------------------------------------------*/ +CardDataReadState HOTSW_ReadPageGame(u32 start_addr, void* buf, u32 size) +{ + u32 loop, counter=0; + u64 i, page; + GCDCmd64 cndLE, cndBE; + + page = (u32)(start_addr / PAGE_SIZE); + loop = (u32)(size / PAGE_SIZE); + loop = (size % PAGE_SIZE) ? loop + 1 : loop; + + // カードのロック +#ifndef DEBUG_USED_CARD_SLOT_B_ + CARD_LockRom(s_CardLockID); +#else + LockExCard(s_CardLockID); +#endif + + for(i=0; igameCommondParam | START_MASK | HOTSW_PAGE_1; + +#ifndef USE_CPU_COPY + // メッセージ受信 + OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&s_Msg, OS_MESSAGE_BLOCK); +#else + while(reg_HOTSW_MCCNT1 & START_FLG_MASK){ + while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){} + *((u32 *)buf + counter++) = reg_HOTSW_MCD1; + } +#endif + } + + // 100ns Wait + OS_SpinWait( OS_NSEC_TO_CPUCYC(100) ); + + // カードのロック開放(※ロックIDは開放せずに持ち続ける) +#ifndef DEBUG_USED_CARD_SLOT_B_ + CARD_UnlockRom(s_CardLockID); +#else + UnlockExCard(s_CardLockID); +#endif + + return CARD_READ_SUCCESS; +} diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index ab6cca51..c39a8cb9 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -131,6 +131,9 @@ void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function); // カードがゲームモードになったかどうか BOOL HOTSW_isGameMode(void); + +// GameモードのPage読み関数 +CardDataReadState HOTSW_ReadPageGame(u32 start_addr, void* buf, u32 size); #endif // --- ARM7