mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
ARM9からも、コマンドを送ってGameモードのカードデータ読みが出来るように変更 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1399 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
c99728ad74
commit
a012d15550
@ -17,6 +17,9 @@
|
|||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
|
||||||
|
#include <firm/os/common/system.h>
|
||||||
|
#include <../ARM7/include/hotswTypes.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_GAME_MODE_CALLBACK 1
|
||||||
@ -35,6 +38,8 @@ static OSMessageQueue s_HotswQueue;
|
|||||||
static BOOL s_ReadBusy;
|
static BOOL s_ReadBusy;
|
||||||
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
|
static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
|
||||||
|
|
||||||
|
static u16 s_CardLockID;
|
||||||
|
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Function Describe
|
// Function Describe
|
||||||
@ -47,6 +52,14 @@ static OSIrqFunction s_HotswFuncTable[HOTSW_CALLBACK_FUNCTION_NUM];
|
|||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
void HOTSW_Init()
|
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 );
|
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;
|
s_HotswFuncTable[HOTSW_CARD_PULLOUT_CALLBACK] = function;
|
||||||
}
|
}
|
||||||
#endif
|
#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; i<loop; i++){
|
||||||
|
if(!HOTSW_isGameMode()){
|
||||||
|
return CARD_READ_MODE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef USE_CPU_COPY
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_NDMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// コマンド作成
|
||||||
|
cndLE.dw = HSWOP_G_OP_RD_PAGE;
|
||||||
|
cndLE.dw |= (page + i) << HSWOP_G_RD_PAGE_ADDR_SHIFT;
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す
|
||||||
|
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 レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & HOTSW_E2PROM_CTRL_MASK) | REG_MI_MCCNT0_E_MASK );
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定
|
||||||
|
reg_HOTSW_MCCNT1 = SYSMi_GetWork()->gameCommondParam | 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;
|
||||||
|
}
|
||||||
|
|||||||
@ -131,6 +131,9 @@ void HOTSW_SetCardPullOutCallBackFunction(OSIrqFunction function);
|
|||||||
|
|
||||||
// カードがゲームモードになったかどうか
|
// カードがゲームモードになったかどうか
|
||||||
BOOL HOTSW_isGameMode(void);
|
BOOL HOTSW_isGameMode(void);
|
||||||
|
|
||||||
|
// GameモードのPage読み関数
|
||||||
|
CardDataReadState HOTSW_ReadPageGame(u32 start_addr, void* buf, u32 size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// --- ARM7
|
// --- ARM7
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user