TwlIPL/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c
(no author) 78ef75f9cf (更新:Akabane Jumpei)
HOTSWライブラリのデバッグ出力制御を修正。


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1878 b08762b0-b915-fc4b-9d8c-17b2551a87ff
2008-07-14 10:36:20 +00:00

556 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
Project: TwlIPL
File: hotsw_ctrl.c
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include <firm/os/common/system.h>
#include <../ARM7/include/hotswTypes.h>
#include <../ARM7/include/customNDma.h>
// Extern -------------------------------------------------------------------
extern CardThreadData HotSwThreadData;
// define -------------------------------------------------------------------
#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 CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size);
// Static Values ------------------------------------------------------------
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];
static u16 s_CardLockID;
// ===========================================================================
// Function Describe
// ===========================================================================
/*---------------------------------------------------------------------------*
Name: HOTSW_Init
Description: <20><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD>
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
void HOTSW_Init()
{
s32 tempLockID;
// <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD>p<EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>NID<49>̎擾
while((tempLockID = OS_GetLockID()) == OS_LOCK_ID_ERROR){
// do nothing
}
s_CardLockID = (u16)tempLockID;
// <20><><EFBFBD>b<EFBFBD>Z<EFBFBD>[<5B>W<EFBFBD>L<EFBFBD><4C><EFBFBD>[<5B>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD>
OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM );
// Busy<73>t<EFBFBD><74><EFBFBD>O<EFBFBD>𗎂Ƃ<F0978E82><C682>Ă<EFBFBD><C482><EFBFBD>
s_ReadBusy = FALSE;
// PXI<58><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PXI_Init();
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
while(!PXI_IsCallbackReady(PXI_FIFO_TAG_HOTSW, PXI_PROC_ARM7))
{
// do nothing
}
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_EnableHotSWAsync
Description: PXI<58>ʐM<CA90><4D>ARM7<4D>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD>L<EFBFBD><4C><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʒm(<28>񓯊<EFBFBD><F193AF8A><EFBFBD>)
<20><> <20><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ɗ}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
*---------------------------------------------------------------------------*/
void HOTSW_EnableHotSWAsync( BOOL enable )
{
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
enable = enable ? 1 : 0;
// <20><><EFBFBD>݂̒l<CC92>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD>Ȃ牽<C882><E789BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>[<5B><>
if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == enable ) {
return;
}
msg.msg.finalize = FALSE;
msg.msg.ctrl = TRUE;
msg.msg.value = enable;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
}
}
/*---------------------------------------------------------------------------*
Name: HOTSW_EnableHotSWAsync
Description: PXI<58>ʐM<CA90><4D>ARM7<4D>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD>L<EFBFBD><4C><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʒm(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<20><> <20><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>ɗ}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
*---------------------------------------------------------------------------*/
void HOTSW_EnableHotSW( BOOL enable )
{
HOTSW_EnableHotSWAsync( enable );
while(HOTSW_isEnableHotSW() != enable){
// do nothing
}
}
/*---------------------------------------------------------------------------*
Name: HOTSW_InvalidHotSWAsync
Description: PXI<58>ʐM<CA90><4D>ARM7<4D>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʒm<CA92>B(<28>񓯊<EFBFBD><F193AF8A><EFBFBD>)
<20><> <20>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
*---------------------------------------------------------------------------*/
void HOTSW_InvalidHotSWAsync( void )
{
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
// <20><><EFBFBD>݂̒l<CC92>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD>Ȃ牽<C882><E789BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>[<5B><>
if( SYSMi_GetWork()->flags.hotsw.isEnableHotSW == FALSE ) {
return;
}
msg.msg.finalize = TRUE;
msg.msg.ctrl = TRUE;
msg.msg.value = FALSE;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
}
}
/*---------------------------------------------------------------------------*
Name: HOTSW_InvalidHotSW
Description: PXI<58>ʐM<CA90><4D>ARM7<4D>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʒm<CA92>B(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<20><> <20>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>g<EFBFBD><67><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
*---------------------------------------------------------------------------*/
void HOTSW_InvalidHotSW( void )
{
HOTSW_InvalidHotSWAsync();
while(HOTSW_isEnableHotSW() != FALSE){
// do nothing
}
}
/*---------------------------------------------------------------------------*
Name: HOTSW_FinalizeHotSW
Description: PXI<58>ʐM<CA90><4D>ARM7<4D>Ɋ<EFBFBD><C98A><EFBFBD><EFBFBD>}<7D><>Finalize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʒm
*---------------------------------------------------------------------------*/
void HOTSW_FinalizeHotSWAsync( HotSwCardState cardState )
{
HotSwPxiMessageForArm7 msg;
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
msg.msg.finalize = TRUE;
msg.msg.ctrl = FALSE;
msg.msg.cardState= (u8)cardState;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
}
}
/*---------------------------------------------------------------------------*
Name: HOTSW_isFinalized
Description: <20>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD>
*---------------------------------------------------------------------------*/
BOOL HOTSW_isFinalized(void)
{
return SYSMi_GetWork()->flags.hotsw.isFinalized;
}
/*---------------------------------------------------------------------------*
Name: HOTSW_isEnableHotSW
Description: <20><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD>̋<EFBFBD><CC8B><EFBFBD>/<2F>}<7D><><EFBFBD>̏<EFBFBD><CC8F>Ԃ<EFBFBD><D482>Ԃ<EFBFBD>
*---------------------------------------------------------------------------*/
BOOL HOTSW_isEnableHotSW(void)
{
return SYSMi_GetWork()->flags.hotsw.isEnableHotSW;
}
/*---------------------------------------------------------------------------*
Name: HOTSW_isCardLoadCompleted
Description: <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>̃<EFBFBD><CC83>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><E982A9><EFBFBD>Ԃ<EFBFBD>
*---------------------------------------------------------------------------*/
BOOL HOTSW_isCardLoadCompleted(void)
{
return SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted;
}
/*---------------------------------------------------------------------------*
Name: HOTSW_isBusyHotSW
Description: <20><><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD>
*---------------------------------------------------------------------------*/
BOOL HOTSW_isBusyHotSW(void)
{
return SYSMi_GetWork()->flags.hotsw.isBusyHotSW;
}
/*---------------------------------------------------------------------------*
Name: HOTSW_ReadCardDataAsync
Description: <20>J<EFBFBD>[<5B>h<EFBFBD>f<EFBFBD>[<5B>^<5E><><EFBFBD>ǂݏo<DD8F><6F><EFBFBD>֐<EFBFBD><D690>B(<28>񓯊<EFBFBD><F193AF8A><EFBFBD>)
<09><><EFBFBD><EFBFBD><EFBFBD>ۂɓǂ<C993><C782>ł<EFBFBD><C582>̂<EFBFBD>ARM7<4D><37>
<20><> <20>{<7B>֐<EFBFBD><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD>āACARD_READ_SUCCESS<53><53><EFBFBD>Ԃ<EFBFBD><D482>Ă<EFBFBD><C482>Ă<EFBFBD><C482>A<EFBFBD>f<EFBFBD>[<5B>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD>[<5B>h<EFBFBD>ł<EFBFBD><C582>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ƃ͂<C682><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size)
{
HotSwPxiMessageForArm7 msg;
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;
SYSMi_GetWork()->cardReadParam.size = size;
DC_FlushRange( &SYSMi_GetWork()->cardReadParam, sizeof(CardReadParam) );
DC_FlushRange( dest, size );
msg.msg.read = TRUE;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
{
// do nothing
}
return CARD_READ_SUCCESS;
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_ReadCardData
Description: <20>J<EFBFBD>[<5B>h<EFBFBD>f<EFBFBD>[<5B>^<5E><><EFBFBD>ǂݏo<DD8F><6F><EFBFBD>֐<EFBFBD><D690>B(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<09><><EFBFBD><EFBFBD><EFBFBD>ۂɓǂ<C993><C782>ł<EFBFBD><C582>̂<EFBFBD>ARM7<4D><37>
*---------------------------------------------------------------------------*/
#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
/*---------------------------------------------------------------------------*
Name: HOTSW_isGameMode
Description: <20>J<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>Q<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>ɂȂ<C982><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԃ<EFBFBD>
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
BOOL HOTSW_isGameMode(void)
{
return SYSMi_GetWork()->flags.hotsw.isCardGameMode ? TRUE : FALSE;
}
#endif
/*---------------------------------------------------------------------------*
Name: InterruptCallbackPxi
Description: PXI<58><49><EFBFBD><EFBFBD>݃n<DD83><6E><EFBFBD>h<EFBFBD><68>
*---------------------------------------------------------------------------*/
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused(tag)
#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.isReadComplete = (d.msg.read) ? TRUE : FALSE;
s_HotswMsg.result = (CardDataReadState)d.msg.result;
HOTSW_TPrintf("%s %d Rcev Error Code[Arm9]:%x\n", __FUNCTION__, __LINE__, s_HotswMsg.result);
// <20><><EFBFBD>b<EFBFBD>Z<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD>M
OS_SendMessage( &s_HotswQueue, (OSMessage *)&s_HotswMsg, OS_MESSAGE_NOBLOCK);
}
}
/*---------------------------------------------------------------------------*
Name: SetGameModeCallBackFunction
Description: <20>J<EFBFBD>[<5B>h<EFBFBD><68>Game<6D><65><EFBFBD>[<5B>h<EFBFBD>ɂȂ<C982><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃R<CC83>[<5B><><EFBFBD>o<EFBFBD>b<EFBFBD>N<EFBFBD>֐<EFBFBD><D690><EFBFBD><EFBFBD>ݒ<EFBFBD>
<20><> HOTSW_Init<69><74><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɐݒ肵<DD92>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
void HOTSW_SetGameModeCallBackFunction(OSIrqFunction function)
{
s_HotswFuncTable[HOTSW_CARD_GAME_MODE_CALLBACK] = function;
}
#endif
/*---------------------------------------------------------------------------*
Name: SetCardInsertCallBackFunction
Description: <20>J<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃R<CC83>[<5B><><EFBFBD>o<EFBFBD>b<EFBFBD>N<EFBFBD>֐<EFBFBD><D690><EFBFBD><EFBFBD>ݒ<EFBFBD>
<20><> HOTSW_Init<69><74><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɐݒ肵<DD92>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
void HOTSW_SetCardInsertCallBackFunction(OSIrqFunction function)
{
s_HotswFuncTable[HOTSW_CARD_INSERT_CALLBACK] = function;
}
#endif
/*---------------------------------------------------------------------------*
Name: SetCardPullOutCallBackFunction
Description: <20>J<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃R<CC83>[<5B><><EFBFBD>o<EFBFBD>b<EFBFBD>N<EFBFBD>֐<EFBFBD><D690><EFBFBD><EFBFBD>ݒ<EFBFBD>
<20><> HOTSW_Init<69><74><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ɐݒ肵<DD92>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*---------------------------------------------------------------------------*/
#ifdef USE_WRAM_LOAD
void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function)
{
s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK] = function;
}
#endif
/*---------------------------------------------------------------------------*
Name: HOTSW_ReadCardDataOnGameMode
Description: Game<6D><65><EFBFBD>[<5B>h<EFBFBD>̃f<CC83>[<5B>^<5E>ǂ݊֐<DD8A>
*---------------------------------------------------------------------------*/
CardDataReadState HOTSW_ReadCardDataOnGameMode(const void* src, void* dest, u32 size)
{
CardDataReadState retval = CARD_READ_SUCCESS;
static u8 page_buffer[512];
u32 offset = (u32)src;
u32 page_offset = (u32)(offset & -512);
u32 buffer_offset = (u32)(offset % 512);
u32 valid_length = 512 - buffer_offset;
u32 remain_length;
// <20>J<EFBFBD>n<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD>y<EFBFBD>[<5B>W<EFBFBD>̓r<CC93><72>
if ( offset % 512 )
{
retval = ReadPageGame(page_offset, page_buffer, 512);
if (retval != HOTSW_SUCCESS)
{
return retval;
}
MI_CpuCopy8(page_buffer + buffer_offset, dest, (size < valid_length ? size : valid_length));
dest = (u8*)dest + valid_length;
offset += valid_length;
size -= valid_length;
if ( size < 0)
{
return retval;
}
}
remain_length = (u32)(size % 512);
retval = ReadPageGame(offset, dest, (u32)(size - remain_length));
// <20>P<EFBFBD>c<EFBFBD><63><EFBFBD>y<EFBFBD>[<5B>W<EFBFBD>r<EFBFBD><72>
if( remain_length ){
dest = (u8*)dest + (size - remain_length);
offset += size - remain_length;
retval = ReadPageGame(offset, page_buffer, 512);
if (retval != HOTSW_SUCCESS)
{
return retval;
}
MI_CpuCopy8(page_buffer, dest, remain_length);
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: ReadPageGame
Description: Game<6D><65><EFBFBD>[<5B>h<EFBFBD><68>Page<67>ǂ݊֐<DD8A>
*---------------------------------------------------------------------------*/
static CardDataReadState ReadPageGame(u32 start_addr, void* buf, u32 size)
{
u32 loop, counter=0;
u64 i, page;
GCDCmd64 cndLE, cndBE;
#ifdef USE_NEW_DMA
OSMessage msg;
#endif
page = (u32)(start_addr / PAGE_SIZE);
loop = (u32)(size / PAGE_SIZE);
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
// <20>J<EFBFBD>[<5B>h<EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>N
CARD_LockRom(s_CardLockID);
for(i=0; i<loop; i++){
if(!HOTSW_isGameMode()){
return CARD_READ_MODE_ERROR;
}
#ifdef USE_NEW_DMA
// NewDMA<4D>]<5D><><EFBFBD>̏<EFBFBD><CC8F><EFBFBD>
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
#endif
// <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>
cndLE.dw = HSWOP_G_OP_RD_PAGE;
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
// <20>r<EFBFBD>b<EFBFBD>O<EFBFBD>G<EFBFBD><47><EFBFBD>f<EFBFBD>B<EFBFBD>A<EFBFBD><41><EFBFBD>ɒ<EFBFBD><C992><EFBFBD>
cndBE.b[7] = cndLE.b[0];
cndBE.b[6] = cndLE.b[1];
cndBE.b[5] = cndLE.b[2];
cndBE.b[4] = cndLE.b[3];
cndBE.b[3] = cndLE.b[4];
cndBE.b[2] = cndLE.b[5];
cndBE.b[1] = cndLE.b[6];
cndBE.b[0] = cndLE.b[7];
//---- confirm CARD free
while( reg_HOTSW_MCCNT1 & REG_MI_MCCNT1_START_MASK ){}
// MCCMD <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>ݒ<EFBFBD>
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
// MCCNT0 <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>ݒ<EFBFBD>
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
// MCCNT1 <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>ݒ<EFBFBD>
reg_HOTSW_MCCNT1 = SYSMi_GetWork()->gameCommondParam | START_MASK | HOTSW_PAGE_1;
#ifdef USE_NEW_DMA
// <20><><EFBFBD>b<EFBFBD>Z<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD>M
OS_ReceiveMessage(&HotSwThreadData.hotswDmaQueue, (OSMessage *)&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) );
// <20>J<EFBFBD>[<5B>h<EFBFBD>̃<EFBFBD><CC83>b<EFBFBD>N<EFBFBD>J<EFBFBD><4A>(<28><><EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>NID<49>͊J<CD8A><4A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɏ<EFBFBD><C98E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
CARD_UnlockRom(s_CardLockID);
return CARD_READ_SUCCESS;
}