mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・WRAM経由カードアプリロード関係の修正 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1344 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
502a4f40ce
commit
0cf9aaad4f
@ -243,6 +243,7 @@ typedef enum HotSwState{
|
|||||||
HOTSW_PULLED_OUT_ERROR,
|
HOTSW_PULLED_OUT_ERROR,
|
||||||
HOTSW_DATA_DECRYPT_ERROR,
|
HOTSW_DATA_DECRYPT_ERROR,
|
||||||
HOTSW_BUFFER_OVERRUN_ERROR,
|
HOTSW_BUFFER_OVERRUN_ERROR,
|
||||||
|
HOTSW_MODE_ERROR,
|
||||||
HOTSW_UNEXPECTED_ERROR
|
HOTSW_UNEXPECTED_ERROR
|
||||||
} HotSwState;
|
} HotSwState;
|
||||||
|
|
||||||
@ -321,9 +322,9 @@ typedef struct CardThreadData{
|
|||||||
|
|
||||||
OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM];
|
OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM];
|
||||||
OSMessage hotswPollingCtrlMsg[HOTSW_POLLING_CTRL_BUFFER_NUM];
|
OSMessage hotswPollingCtrlMsg[HOTSW_POLLING_CTRL_BUFFER_NUM];
|
||||||
HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
|
HotSwMessageForArm7 hotswInsertMsg[HOTSW_INSERT_MSG_NUM];
|
||||||
HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
|
HotSwMessageForArm7 hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM];
|
||||||
HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
|
HotSwMessageForArm7 hotswPxiMsg[HOTSW_CTRL_MSG_NUM];
|
||||||
|
|
||||||
OSMessageQueue hotswQueue;
|
OSMessageQueue hotswQueue;
|
||||||
OSMessageQueue hotswDmaQueue;
|
OSMessageQueue hotswDmaQueue;
|
||||||
|
|||||||
@ -94,6 +94,9 @@ static HotSwState LoadCardData(void);
|
|||||||
static void RegisterRomEmuInfo(void);
|
static void RegisterRomEmuInfo(void);
|
||||||
static void GenVA_VB_VD(void);
|
static void GenVA_VB_VD(void);
|
||||||
|
|
||||||
|
static HotSwState ReadImageReturnErrorCode(void* dest, s32 offset, s32 length, void* arg);
|
||||||
|
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg);
|
||||||
|
|
||||||
static s32 LockExCard(u16 lockID);
|
static s32 LockExCard(u16 lockID);
|
||||||
static s32 UnlockExCard(u16 lockID);
|
static s32 UnlockExCard(u16 lockID);
|
||||||
|
|
||||||
@ -110,7 +113,7 @@ static BOOL CheckArm9HashValue(void);
|
|||||||
static BOOL CheckExtArm7HashValue(void);
|
static BOOL CheckExtArm7HashValue(void);
|
||||||
static BOOL CheckExtArm9HashValue(void);
|
static BOOL CheckExtArm9HashValue(void);
|
||||||
#else
|
#else
|
||||||
static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size);
|
static void ReadCardData(u32 src, u32 dest, u32 size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void ShowRegisterData(void);
|
static void ShowRegisterData(void);
|
||||||
@ -176,64 +179,6 @@ static CardSecureModeFunction s_funcTable[] = {
|
|||||||
{ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU}
|
{ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg)
|
|
||||||
{
|
|
||||||
HotSwState retval;
|
|
||||||
|
|
||||||
static u8 page_buffer[512];
|
|
||||||
u32 page_offset = (u32)(offset & -512);
|
|
||||||
u32 buffer_offset = (u32)(offset % 512);
|
|
||||||
u32 valid_length = 512 - buffer_offset;
|
|
||||||
u32 remain_length;
|
|
||||||
|
|
||||||
// 開始アドレスがページの途中
|
|
||||||
if ( offset % 512 )
|
|
||||||
{
|
|
||||||
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
|
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
if (retval != HOTSW_SUCCESS)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
MI_CpuCopy8(page_buffer + buffer_offset, dest, (length < valid_length ? length : valid_length));
|
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
dest = (u8*)dest + valid_length;
|
|
||||||
offset += valid_length;
|
|
||||||
length -= valid_length;
|
|
||||||
if ( length < 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remain_length = (u32)(length % 512);
|
|
||||||
retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)(length - remain_length));
|
|
||||||
|
|
||||||
// ケツがページ途中
|
|
||||||
if( remain_length ){
|
|
||||||
dest = (u8*)dest + (length - remain_length);
|
|
||||||
offset += length - remain_length;
|
|
||||||
|
|
||||||
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
|
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
if (retval != HOTSW_SUCCESS)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
MI_CpuCopy8(page_buffer, dest, remain_length);
|
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
|
||||||
return (retval == HOTSW_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DHT_TEST
|
#ifdef DHT_TEST
|
||||||
#include <twl/os/ARM7/debugLED.h>
|
#include <twl/os/ARM7/debugLED.h>
|
||||||
#include <sysmenu/dht/dht.h>
|
#include <sysmenu/dht/dht.h>
|
||||||
@ -518,7 +463,7 @@ static HotSwState LoadCardData(void)
|
|||||||
romMode = HOTSW_ROM_MODE_SECURE;
|
romMode = HOTSW_ROM_MODE_SECURE;
|
||||||
|
|
||||||
// Secure Segment の バッファ設定
|
// Secure Segment の バッファ設定
|
||||||
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)s_cbData.pBootSegBuf->rh.s.main_rom_offset, SECURE_AREA_SIZE );
|
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE1, (void *)s_cbData.pBootSegBuf->rh.s.main_ram_address, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
// SecureモードのIDとSecureSegmentを読み込む
|
// SecureモードのIDとSecureSegmentを読み込む
|
||||||
state = ReadSecureModeCardData();
|
state = ReadSecureModeCardData();
|
||||||
@ -553,7 +498,7 @@ static HotSwState LoadCardData(void)
|
|||||||
|
|
||||||
// ---------------------- Secure2 Mode ----------------------
|
// ---------------------- Secure2 Mode ----------------------
|
||||||
// Secure Segment の バッファ設定
|
// Secure Segment の バッファ設定
|
||||||
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset, SECURE_AREA_SIZE );
|
HOTSW_SetSecureSegmentBuffer(HOTSW_MODE2, (void *)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
// Secure2モードのIDとSecureSegmentを読み込む
|
// Secure2モードのIDとSecureSegmentを読み込む
|
||||||
state = ReadSecureModeCardData();
|
state = ReadSecureModeCardData();
|
||||||
@ -840,7 +785,6 @@ static void RegisterRomEmuInfo(void)
|
|||||||
|
|
||||||
注:ゲームモードになってから呼び出してください
|
注:ゲームモードになってから呼び出してください
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static HotSwState LoadBannerData(void)
|
static HotSwState LoadBannerData(void)
|
||||||
{
|
{
|
||||||
BOOL state;
|
BOOL state;
|
||||||
@ -880,22 +824,90 @@ static HotSwState LoadBannerData(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadImageReturnErrorCode
|
||||||
|
|
||||||
|
Description: カードから中途半端なサイズ(page途中)のデータを読み出す関数
|
||||||
|
エラーコードを返す
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static HotSwState ReadImageReturnErrorCode(void* dest, s32 offset, s32 length, void* arg)
|
||||||
|
{
|
||||||
|
HotSwState retval = HOTSW_SUCCESS;
|
||||||
|
|
||||||
|
static u8 page_buffer[512];
|
||||||
|
u32 page_offset = (u32)(offset & -512);
|
||||||
|
u32 buffer_offset = (u32)(offset % 512);
|
||||||
|
u32 valid_length = 512 - buffer_offset;
|
||||||
|
u32 remain_length;
|
||||||
|
|
||||||
|
// 開始アドレスがページの途中
|
||||||
|
if ( offset % 512 )
|
||||||
|
{
|
||||||
|
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
|
||||||
|
|
||||||
|
if (retval != HOTSW_SUCCESS)
|
||||||
|
{
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
MI_CpuCopy8(page_buffer + buffer_offset, dest, (length < valid_length ? length : valid_length));
|
||||||
|
|
||||||
|
dest = (u8*)dest + valid_length;
|
||||||
|
offset += valid_length;
|
||||||
|
length -= valid_length;
|
||||||
|
if ( length < 0)
|
||||||
|
{
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remain_length = (u32)(length % 512);
|
||||||
|
retval = ReadPageGame((CardBootData*)arg, (u32)offset, dest, (u32)(length - remain_length));
|
||||||
|
|
||||||
|
// ケツがページ途中
|
||||||
|
if( remain_length ){
|
||||||
|
dest = (u8*)dest + (length - remain_length);
|
||||||
|
offset += length - remain_length;
|
||||||
|
|
||||||
|
retval = ReadPageGame((CardBootData*)arg, page_offset, page_buffer, 512);
|
||||||
|
|
||||||
|
if (retval != HOTSW_SUCCESS)
|
||||||
|
{
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
MI_CpuCopy8(page_buffer, dest, remain_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadImage
|
||||||
|
|
||||||
|
Description: カードから中途半端なサイズ(page途中)のデータを読み出す関数
|
||||||
|
成功するとTRUEを返す
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static BOOL ReadImage(void* dest, s32 offset, s32 length, void* arg)
|
||||||
|
{
|
||||||
|
return (ReadImageReturnErrorCode(dest, offset, length, arg) == HOTSW_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ReadCardData
|
Name: ReadCardData
|
||||||
|
|
||||||
Description: ARM9から通知された範囲のデータをカードから読み込み
|
Description: ARM9から通知された範囲のデータをカードから読み込み
|
||||||
|
|
||||||
twl_card_normal_area_rom_offset -> Normal領域オフセット
|
|
||||||
twl_card_keytable_area_rom_offset -> KeyTable2領域オフセット
|
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
|
static void ReadCardData(u32 src, u32 dest, u32 size)
|
||||||
{
|
{
|
||||||
u32 sendSize = 0;
|
u32 sendSize = 0;
|
||||||
BOOL result = TRUE;
|
HotSwState state = HOTSW_SUCCESS;
|
||||||
|
|
||||||
if(!SYSMi_GetWork()->flags.hotsw.isCardGameMode){
|
if(!SYSMi_GetWork()->flags.hotsw.isCardGameMode){
|
||||||
return CARD_READ_MODE_ERROR;
|
state = HOTSW_MODE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// カードのロック
|
// カードのロック
|
||||||
@ -905,7 +917,7 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
LockExCard(s_CardLockID);
|
LockExCard(s_CardLockID);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(size > 0){
|
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__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
@ -917,13 +929,13 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
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__);
|
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;
|
||||||
result = ReadImage((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\n", __FUNCTION__, __LINE__);
|
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 *)(SYSM_CARD_NTR_SECURE_BUF + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
|
MI_CpuCopy8((u32 *)((u32)s_cbData.pSecureSegBuf + (src - HOTSW_SECURE_AREA_OFS)), (u32 *)dest, sendSize);
|
||||||
}
|
}
|
||||||
// --- Game Segment
|
// --- Game Segment
|
||||||
else if(src >= HOTSW_GAME_AREA_OFS){
|
else if(src >= HOTSW_GAME_AREA_OFS){
|
||||||
@ -937,32 +949,32 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
if(src < keyTable2Adr){
|
if(src < keyTable2Adr){
|
||||||
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
|
sendSize = ((src + size) > keyTable2Adr) ? keyTable2Adr - src : size;
|
||||||
result = ReadImage((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__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
|
sendSize = ((src + size) > Secure2Adr) ? Secure2Adr - src : size;
|
||||||
result = ReadImage((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__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
|
sendSize = ((src + size) > Game2Adr) ? Game2Adr - src : size;
|
||||||
MI_CpuCopy8((u32 *)(SYSM_CARD_TWL_SECURE_BUF + (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__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
sendSize = size;
|
sendSize = size;
|
||||||
result = ReadImage((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__);
|
OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__);
|
||||||
sendSize = size;
|
sendSize = size;
|
||||||
result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -977,11 +989,47 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size)
|
|||||||
UnlockExCard(s_CardLockID);
|
UnlockExCard(s_CardLockID);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(result){
|
{
|
||||||
return CARD_READ_SUCCESS;
|
HotSwPxiMessageForArm9 msg;
|
||||||
}
|
CardDataReadState retval;
|
||||||
else{
|
|
||||||
return CARD_READ_UNKNOWN_ERROR;
|
switch(state){
|
||||||
|
case HOTSW_SUCCESS:
|
||||||
|
retval = CARD_READ_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_TIME_OUT:
|
||||||
|
retval = CARD_READ_TIME_OUT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_PULLED_OUT_ERROR:
|
||||||
|
retval = CARD_READ_PULLED_OUT_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_BUFFER_OVERRUN_ERROR:
|
||||||
|
retval = CARD_READ_BUFFER_OVERRUN_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HOTSW_MODE_ERROR:
|
||||||
|
retval = CARD_READ_MODE_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
retval = CARD_READ_UNEXPECTED_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
OS_TPrintf("%s %d Send Error Code[Arm7]:%x\n", __FUNCTION__, __LINE__, retval);
|
||||||
|
|
||||||
|
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm9));
|
||||||
|
|
||||||
|
msg.msg.read = TRUE;
|
||||||
|
msg.msg.result = (u8)retval;
|
||||||
|
|
||||||
|
while (PXI_SendWordByFifo(PXI_FIFO_TAG_HOTSW, msg.data, FALSE) != PXI_FIFO_SUCCESS)
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1183,7 +1231,6 @@ while(1){ OS_WaitVBlankIntr(); }
|
|||||||
|
|
||||||
Description: Rom Headerの認証コードアドレスを読んで、クローンブート対応か判定する
|
Description: Rom Headerの認証コードアドレスを読んで、クローンブート対応か判定する
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static HotSwState CheckCardAuthCode(void)
|
static HotSwState CheckCardAuthCode(void)
|
||||||
{
|
{
|
||||||
u32 authBuf[PAGE_SIZE/sizeof(u32)];
|
u32 authBuf[PAGE_SIZE/sizeof(u32)];
|
||||||
@ -1651,9 +1698,9 @@ static void HotSwThread(void *arg)
|
|||||||
{
|
{
|
||||||
#pragma unused( arg )
|
#pragma unused( arg )
|
||||||
|
|
||||||
HotSwState retval;
|
HotSwState retval;
|
||||||
HotSwMessage *msg;
|
HotSwMessageForArm7 *msg;
|
||||||
BOOL breakFlg;
|
BOOL breakFlg;
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
|
OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK);
|
||||||
@ -1678,11 +1725,9 @@ static void HotSwThread(void *arg)
|
|||||||
|
|
||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
if( msg->read == TRUE ){
|
if( msg->read == TRUE ){
|
||||||
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
|
ReadCardData(SYSMi_GetWork()->cardReadParam.src,
|
||||||
SYSMi_GetWork()->cardReadParam.result = ReadCardData(SYSMi_GetWork()->cardReadParam.src,
|
SYSMi_GetWork()->cardReadParam.dest,
|
||||||
SYSMi_GetWork()->cardReadParam.dest,
|
SYSMi_GetWork()->cardReadParam.size);
|
||||||
SYSMi_GetWork()->cardReadParam.size);
|
|
||||||
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = TRUE;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2165,7 +2210,7 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
|
|||||||
{
|
{
|
||||||
#pragma unused(tag)
|
#pragma unused(tag)
|
||||||
#pragma unused(err)
|
#pragma unused(err)
|
||||||
HotSwPxiMessage d;
|
HotSwPxiMessageForArm7 d;
|
||||||
|
|
||||||
d.data = data;
|
d.data = data;
|
||||||
|
|
||||||
|
|||||||
@ -17,10 +17,40 @@
|
|||||||
#include <twl.h>
|
#include <twl.h>
|
||||||
#include <sysmenu.h>
|
#include <sysmenu.h>
|
||||||
|
|
||||||
|
// define -------------------------------------------------------------------
|
||||||
|
#define HOTSW_READ_MSG_NUM 1
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
BOOL s_ReadBusy;
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Function Describe
|
// Function Describe
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: HOTSW_Init
|
||||||
|
|
||||||
|
Description: 活栓挿抜処理の初期化
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void HOTSW_Init()
|
||||||
|
{
|
||||||
|
// PXI初期化
|
||||||
|
PXI_Init();
|
||||||
|
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_HOTSW, InterruptCallbackPxi);
|
||||||
|
|
||||||
|
// メッセージキューの初期化
|
||||||
|
OS_InitMessageQueue( &s_HotswQueue, &s_HotswMsgBuffer[0], HOTSW_READ_MSG_NUM );
|
||||||
|
|
||||||
|
// Busyフラグを落としておく
|
||||||
|
s_ReadBusy = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: HOTSW_EnableHotSWAsync
|
Name: HOTSW_EnableHotSWAsync
|
||||||
@ -29,9 +59,9 @@
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void HOTSW_EnableHotSWAsync( BOOL enable )
|
void HOTSW_EnableHotSWAsync( BOOL enable )
|
||||||
{
|
{
|
||||||
HotSwPxiMessage msg;
|
HotSwPxiMessageForArm7 msg;
|
||||||
|
|
||||||
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
|
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
|
||||||
enable = enable ? 1 : 0;
|
enable = enable ? 1 : 0;
|
||||||
|
|
||||||
// 現在の値と同じなら何もせずリターン
|
// 現在の値と同じなら何もせずリターン
|
||||||
@ -56,9 +86,9 @@ void HOTSW_EnableHotSWAsync( BOOL enable )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
|
void HOTSW_FinalizeHotSWAsync( HotSwApliType apliType )
|
||||||
{
|
{
|
||||||
HotSwPxiMessage msg;
|
HotSwPxiMessageForArm7 msg;
|
||||||
|
|
||||||
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
|
MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7));
|
||||||
|
|
||||||
msg.msg.finalize = TRUE;
|
msg.msg.finalize = TRUE;
|
||||||
msg.msg.bootType = (u8)apliType;
|
msg.msg.bootType = (u8)apliType;
|
||||||
@ -93,17 +123,29 @@ BOOL HOTSW_isCardLoadCompleted(void)
|
|||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: HOTSW_ReadCardData
|
Name: HOTSW_ReadCardDataAsync
|
||||||
|
|
||||||
Description: カードデータを読み出す関数。
|
Description: カードデータを読み出す関数。(非同期版)
|
||||||
※実際に読んでるのはARM7側
|
※実際に読んでるのはARM7側
|
||||||
|
|
||||||
|
※ 本関数を呼び出して、CARD_READ_SUCCESSが返ってきても、データが正しく
|
||||||
|
リードできているとはかぎりません。
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
|
CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size)
|
||||||
{
|
{
|
||||||
HotSwPxiMessage msg;
|
HotSwPxiMessageForArm7 msg;
|
||||||
|
|
||||||
MI_CpuClear8( &msg, sizeof(HotSwPxiMessage));
|
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.src = (u32)src;
|
||||||
SYSMi_GetWork()->cardReadParam.dest = (u32)dest;
|
SYSMi_GetWork()->cardReadParam.dest = (u32)dest;
|
||||||
@ -119,14 +161,31 @@ CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
|
|||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
// [TODO] ARM7側でリードが終了してステートが返ってくるのを待つ?
|
return CARD_READ_SUCCESS;
|
||||||
while (!SYSMi_GetWork()->flags.hotsw.isCardReadCompleted)
|
}
|
||||||
{
|
#endif
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
|
|
||||||
|
|
||||||
return SYSMi_GetWork()->cardReadParam.result;
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: HOTSW_ReadCardData
|
||||||
|
|
||||||
|
Description: カードデータを読み出す関数。(同期版)
|
||||||
|
※実際に読んでるのはARM7側
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#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
|
#endif
|
||||||
|
|
||||||
@ -141,4 +200,34 @@ BOOL HOTSW_isGameMode(void)
|
|||||||
{
|
{
|
||||||
return SYSMi_GetWork()->flags.hotsw.isCardGameMode ? TRUE : FALSE;
|
return SYSMi_GetWork()->flags.hotsw.isCardGameMode ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: InterruptCallbackPxi
|
||||||
|
|
||||||
|
Description: PXI割り込みハンドラ
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err)
|
||||||
|
{
|
||||||
|
#pragma unused(tag)
|
||||||
|
#pragma unused(err)
|
||||||
|
HotSwPxiMessageForArm9 d;
|
||||||
|
|
||||||
|
d.data = data;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
OS_TPrintf("%s %d Rcev Error Code[Arm9]:%x\n", __FUNCTION__, __LINE__, s_HotswMsg.result);
|
||||||
|
|
||||||
|
// メッセージ送信
|
||||||
|
OS_SendMessage( &s_HotswQueue, (OSMessage *)&s_HotswMsg, OS_MESSAGE_NOBLOCK);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -110,7 +110,8 @@ void TwlMain( void )
|
|||||||
TP_Init();
|
TP_Init();
|
||||||
RTC_Init();
|
RTC_Init();
|
||||||
SND_Init();// sound init
|
SND_Init();// sound init
|
||||||
|
HOTSW_Init();
|
||||||
|
|
||||||
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
||||||
|
|
||||||
// 割り込み許可--------------------
|
// 割り込み許可--------------------
|
||||||
|
|||||||
@ -24,7 +24,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SYSM_HOTSW_ENABLE_ROMEMU
|
#define SYSM_HOTSW_ENABLE_ROMEMU
|
||||||
#define USE_WRAM_LOAD
|
//#define USE_WRAM_LOAD
|
||||||
|
|
||||||
// enum -------------------------------------------------------------------
|
// enum -------------------------------------------------------------------
|
||||||
// スレッドに送るメッセージのステート
|
// スレッドに送るメッセージのステート
|
||||||
@ -47,7 +47,7 @@ typedef enum HotSwApliType{
|
|||||||
|
|
||||||
// union -------------------------------------------------------------------
|
// union -------------------------------------------------------------------
|
||||||
// PXI用メッセージ
|
// PXI用メッセージ
|
||||||
typedef union HotSwPxiMessage{
|
typedef union HotSwPxiMessageForArm7{
|
||||||
struct {
|
struct {
|
||||||
u32 value :1;
|
u32 value :1;
|
||||||
u32 ctrl :1;
|
u32 ctrl :1;
|
||||||
@ -57,23 +57,46 @@ typedef union HotSwPxiMessage{
|
|||||||
u32 :20;
|
u32 :20;
|
||||||
} msg;
|
} msg;
|
||||||
u32 data;
|
u32 data;
|
||||||
} HotSwPxiMessage;
|
} HotSwPxiMessageForArm7;
|
||||||
|
|
||||||
|
typedef union HotSwPxiMessageForArm9{
|
||||||
|
struct {
|
||||||
|
u32 mode :1;
|
||||||
|
u32 insert :1;
|
||||||
|
u32 pullout :1;
|
||||||
|
u32 read :1;
|
||||||
|
u32 result :8;
|
||||||
|
u32 :20;
|
||||||
|
} msg;
|
||||||
|
u32 data;
|
||||||
|
} HotSwPxiMessageForArm9;
|
||||||
|
|
||||||
// struct -------------------------------------------------------------------
|
// struct -------------------------------------------------------------------
|
||||||
// スレッド用メッセージ
|
// スレッド用メッセージ
|
||||||
typedef struct HotSwMessage{
|
typedef struct HotSwMessageForArm7{
|
||||||
u32 value;
|
u32 value;
|
||||||
BOOL ctrl;
|
BOOL ctrl;
|
||||||
BOOL finalize;
|
BOOL finalize;
|
||||||
BOOL read;
|
BOOL read;
|
||||||
HotSwMessageType type;
|
HotSwMessageType type;
|
||||||
HotSwApliType apli;
|
HotSwApliType apli;
|
||||||
} HotSwMessage;
|
} HotSwMessageForArm7;
|
||||||
|
|
||||||
|
typedef struct HotSwMessageForArm9{
|
||||||
|
BOOL isGameMode;
|
||||||
|
BOOL isInsert;
|
||||||
|
BOOL isPulledOut;
|
||||||
|
BOOL isReadComplete;
|
||||||
|
CardDataReadState result;
|
||||||
|
} 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 );
|
||||||
|
|
||||||
@ -87,9 +110,12 @@ BOOL HOTSW_isEnableHotSW(void);
|
|||||||
BOOL HOTSW_isCardLoadCompleted(void);
|
BOOL HOTSW_isCardLoadCompleted(void);
|
||||||
|
|
||||||
#ifdef USE_WRAM_LOAD
|
#ifdef USE_WRAM_LOAD
|
||||||
// カードデータを読み出す関数
|
// カードデータを読み出す関数(同期版)
|
||||||
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);
|
||||||
|
|
||||||
// カードがゲームモードになったかどうか
|
// カードがゲームモードになったかどうか
|
||||||
BOOL HOTSW_isGameMode(void);
|
BOOL HOTSW_isGameMode(void);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -37,9 +37,12 @@ SYSMCloneBootMode;
|
|||||||
|
|
||||||
typedef enum CardDataReadState {
|
typedef enum CardDataReadState {
|
||||||
CARD_READ_SUCCESS = 0,
|
CARD_READ_SUCCESS = 0,
|
||||||
|
CARD_READ_TIME_OUT,
|
||||||
CARD_READ_PULLED_OUT_ERROR,
|
CARD_READ_PULLED_OUT_ERROR,
|
||||||
|
CARD_READ_BUFFER_OVERRUN_ERROR,
|
||||||
CARD_READ_MODE_ERROR,
|
CARD_READ_MODE_ERROR,
|
||||||
CARD_READ_UNKNOWN_ERROR
|
CARD_READ_BUSY,
|
||||||
|
CARD_READ_UNEXPECTED_ERROR
|
||||||
}
|
}
|
||||||
CardDataReadState;
|
CardDataReadState;
|
||||||
|
|
||||||
@ -124,7 +127,6 @@ typedef struct SYSM_work {
|
|||||||
vu16 isCardGameMode :1; // カードがゲームモードに遷移したか?
|
vu16 isCardGameMode :1; // カードがゲームモードに遷移したか?
|
||||||
vu16 :0;
|
vu16 :0;
|
||||||
vu8 isCardStateChanged; // カード状態更新フラグ
|
vu8 isCardStateChanged; // カード状態更新フラグ
|
||||||
vu8 isCardReadCompleted; // カードデータリード完了?
|
|
||||||
}hotsw;
|
}hotsw;
|
||||||
}flags; // 7B
|
}flags; // 7B
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user