From 0cf9aaad4f280bcf291e3c9de2254aea98088e5e Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 14 May 2008 10:40:41 +0000 Subject: [PATCH] =?UTF-8?q?(=E6=9B=B4=E6=96=B0:Akabane=20Jumpei)=20?= =?UTF-8?q?=E3=83=BBWRAM=E7=B5=8C=E7=94=B1=E3=82=AB=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E3=83=AD=E3=83=BC=E3=83=89=E9=96=A2?= =?UTF-8?q?=E4=BF=82=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1344 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/hotswTypes.h | 7 +- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 229 +++++++++++------- .../hotsw/ARM9/src/hotsw_ctrl.c | 123 ++++++++-- build/systemMenu_RED/Launcher/ARM9/src/main.c | 3 +- include/sysmenu/hotsw/common/hotsw.h | 38 ++- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 6 +- 6 files changed, 285 insertions(+), 121 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 8791f6fd..67f7cb0c 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -243,6 +243,7 @@ typedef enum HotSwState{ HOTSW_PULLED_OUT_ERROR, HOTSW_DATA_DECRYPT_ERROR, HOTSW_BUFFER_OVERRUN_ERROR, + HOTSW_MODE_ERROR, HOTSW_UNEXPECTED_ERROR } HotSwState; @@ -321,9 +322,9 @@ typedef struct CardThreadData{ OSMessage hotswDmaMsg[HOTSW_DMA_MSG_NUM]; OSMessage hotswPollingCtrlMsg[HOTSW_POLLING_CTRL_BUFFER_NUM]; - HotSwMessage hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; - HotSwMessage hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; - HotSwMessage hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; + HotSwMessageForArm7 hotswInsertMsg[HOTSW_INSERT_MSG_NUM]; + HotSwMessageForArm7 hotswPulledOutMsg[HOTSW_PULLED_MSG_NUM]; + HotSwMessageForArm7 hotswPxiMsg[HOTSW_CTRL_MSG_NUM]; OSMessageQueue hotswQueue; OSMessageQueue hotswDmaQueue; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 6b744ccb..d02dc081 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -94,6 +94,9 @@ static HotSwState LoadCardData(void); static void RegisterRomEmuInfo(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 UnlockExCard(u16 lockID); @@ -110,7 +113,7 @@ static BOOL CheckArm9HashValue(void); static BOOL CheckExtArm7HashValue(void); static BOOL CheckExtArm9HashValue(void); #else -static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size); +static void ReadCardData(u32 src, u32 dest, u32 size); #endif static void ShowRegisterData(void); @@ -176,64 +179,6 @@ static CardSecureModeFunction s_funcTable[] = { {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 #include #include @@ -518,7 +463,7 @@ static HotSwState LoadCardData(void) romMode = HOTSW_ROM_MODE_SECURE; // 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を読み込む state = ReadSecureModeCardData(); @@ -553,7 +498,7 @@ static HotSwState LoadCardData(void) // ---------------------- Secure2 Mode ---------------------- // 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を読み込む state = ReadSecureModeCardData(); @@ -840,7 +785,6 @@ static void RegisterRomEmuInfo(void) 注:ゲームモードになってから呼び出してください *---------------------------------------------------------------------------*/ - static HotSwState LoadBannerData(void) { 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 Description: ARM9から通知された範囲のデータをカードから読み込み - - twl_card_normal_area_rom_offset -> Normal領域オフセット - twl_card_keytable_area_rom_offset -> KeyTable2領域オフセット *---------------------------------------------------------------------------*/ #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; - BOOL result = TRUE; + HotSwState state = HOTSW_SUCCESS; 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); #endif - while(size > 0){ + 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__); @@ -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){ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); 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 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; - 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 else if(src >= HOTSW_GAME_AREA_OFS){ @@ -937,32 +949,32 @@ static CardDataReadState ReadCardData(u32 src, u32 dest, u32 size) if(src < keyTable2Adr){ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); 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 else if(src >= keyTable2Adr && src < Secure2Adr){ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); 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 else if(src >= Secure2Adr && src < Game2Adr){ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); 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 else{ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); sendSize = size; - result = ReadImage((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData); + state = ReadImageReturnErrorCode((u32 *)dest, (s32)src, (s32)sendSize, &s_cbData); } } // --- Game Segment else{ OS_TPrintf("%s %d\n", __FUNCTION__, __LINE__); 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); #endif - if(result){ - return CARD_READ_SUCCESS; - } - else{ - return CARD_READ_UNKNOWN_ERROR; + { + HotSwPxiMessageForArm9 msg; + CardDataReadState retval; + + 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 @@ -1183,7 +1231,6 @@ while(1){ OS_WaitVBlankIntr(); } Description: Rom Headerの認証コードアドレスを読んで、クローンブート対応か判定する *---------------------------------------------------------------------------*/ - static HotSwState CheckCardAuthCode(void) { u32 authBuf[PAGE_SIZE/sizeof(u32)]; @@ -1651,9 +1698,9 @@ static void HotSwThread(void *arg) { #pragma unused( arg ) - HotSwState retval; - HotSwMessage *msg; - BOOL breakFlg; + HotSwState retval; + HotSwMessageForArm7 *msg; + BOOL breakFlg; while(1){ OS_ReceiveMessage(&HotSwThreadData.hotswQueue, (OSMessage *)&msg, OS_MESSAGE_BLOCK); @@ -1678,11 +1725,9 @@ static void HotSwThread(void *arg) #ifdef USE_WRAM_LOAD if( msg->read == TRUE ){ - SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE; - SYSMi_GetWork()->cardReadParam.result = ReadCardData(SYSMi_GetWork()->cardReadParam.src, - SYSMi_GetWork()->cardReadParam.dest, - SYSMi_GetWork()->cardReadParam.size); - SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = TRUE; + ReadCardData(SYSMi_GetWork()->cardReadParam.src, + SYSMi_GetWork()->cardReadParam.dest, + SYSMi_GetWork()->cardReadParam.size); continue; } #endif @@ -2165,7 +2210,7 @@ static void InterruptCallbackPxi(PXIFifoTag tag, u32 data, BOOL err) { #pragma unused(tag) #pragma unused(err) - HotSwPxiMessage d; + HotSwPxiMessageForArm7 d; d.data = data; diff --git a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c index 4a58c54b..5f2666db 100644 --- a/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c +++ b/build/libraries_sysmenu/hotsw/ARM9/src/hotsw_ctrl.c @@ -17,10 +17,40 @@ #include #include +// 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 // =========================================================================== +/*---------------------------------------------------------------------------* + 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 @@ -29,9 +59,9 @@ *---------------------------------------------------------------------------*/ void HOTSW_EnableHotSWAsync( BOOL enable ) { - HotSwPxiMessage msg; + HotSwPxiMessageForArm7 msg; - MI_CpuClear8( &msg, sizeof(HotSwPxiMessage)); + MI_CpuClear8( &msg, sizeof(HotSwPxiMessageForArm7)); enable = enable ? 1 : 0; // 現在の値と同じなら何もせずリターン @@ -56,9 +86,9 @@ void HOTSW_EnableHotSWAsync( BOOL enable ) *---------------------------------------------------------------------------*/ 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.bootType = (u8)apliType; @@ -93,17 +123,29 @@ BOOL HOTSW_isCardLoadCompleted(void) /*---------------------------------------------------------------------------* - Name: HOTSW_ReadCardData + Name: HOTSW_ReadCardDataAsync - Description: カードデータを読み出す関数。 + Description: カードデータを読み出す関数。(非同期版) ※実際に読んでるのはARM7側 + + ※ 本関数を呼び出して、CARD_READ_SUCCESSが返ってきても、データが正しく + リードできているとはかぎりません。 *---------------------------------------------------------------------------*/ #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.dest = (u32)dest; @@ -119,14 +161,31 @@ CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size) // do nothing } - // [TODO] ARM7側でリードが終了してステートが返ってくるのを待つ? - while (!SYSMi_GetWork()->flags.hotsw.isCardReadCompleted) - { - // do nothing - } - SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE; + return CARD_READ_SUCCESS; +} +#endif - 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 @@ -141,4 +200,34 @@ BOOL HOTSW_isGameMode(void) { return SYSMi_GetWork()->flags.hotsw.isCardGameMode ? TRUE : FALSE; } -#endif \ No newline at end of file +#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); + } +} \ No newline at end of file diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 33e10020..98ae3389 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -110,7 +110,8 @@ void TwlMain( void ) TP_Init(); RTC_Init(); SND_Init();// sound init - + HOTSW_Init(); + OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) ); // 割り込み許可-------------------- diff --git a/include/sysmenu/hotsw/common/hotsw.h b/include/sysmenu/hotsw/common/hotsw.h index 10de0995..ea0075f7 100644 --- a/include/sysmenu/hotsw/common/hotsw.h +++ b/include/sysmenu/hotsw/common/hotsw.h @@ -24,7 +24,7 @@ extern "C" { #endif #define SYSM_HOTSW_ENABLE_ROMEMU -#define USE_WRAM_LOAD +//#define USE_WRAM_LOAD // enum ------------------------------------------------------------------- // スレッドに送るメッセージのステート @@ -47,7 +47,7 @@ typedef enum HotSwApliType{ // union ------------------------------------------------------------------- // PXI用メッセージ -typedef union HotSwPxiMessage{ +typedef union HotSwPxiMessageForArm7{ struct { u32 value :1; u32 ctrl :1; @@ -57,23 +57,46 @@ typedef union HotSwPxiMessage{ u32 :20; } msg; 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 ------------------------------------------------------------------- // スレッド用メッセージ -typedef struct HotSwMessage{ +typedef struct HotSwMessageForArm7{ u32 value; BOOL ctrl; BOOL finalize; BOOL read; HotSwMessageType type; HotSwApliType apli; -} HotSwMessage; +} HotSwMessageForArm7; + +typedef struct HotSwMessageForArm9{ + BOOL isGameMode; + BOOL isInsert; + BOOL isPulledOut; + BOOL isReadComplete; + CardDataReadState result; +} HotSwMessageForArm9; // Function prototype ------------------------------------------------------- // --- ARM9 #ifdef SDK_ARM9 +// 活栓挿抜処理の初期化 +void HOTSW_Init(); + // PXI通信でARM7に活線挿抜有効/無効を通知 void HOTSW_EnableHotSWAsync( BOOL enable ); @@ -87,9 +110,12 @@ BOOL HOTSW_isEnableHotSW(void); BOOL HOTSW_isCardLoadCompleted(void); #ifdef USE_WRAM_LOAD -// カードデータを読み出す関数 +// カードデータを読み出す関数(同期版) CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size); +// カードデータを読み出す関数(非同期版) +CardDataReadState HOTSW_ReadCardDataAsync(void* src, void* dest, u32 size); + // カードがゲームモードになったかどうか BOOL HOTSW_isGameMode(void); #endif diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index f22ee5f6..8546079f 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -37,9 +37,12 @@ SYSMCloneBootMode; typedef enum CardDataReadState { CARD_READ_SUCCESS = 0, + CARD_READ_TIME_OUT, CARD_READ_PULLED_OUT_ERROR, + CARD_READ_BUFFER_OVERRUN_ERROR, CARD_READ_MODE_ERROR, - CARD_READ_UNKNOWN_ERROR + CARD_READ_BUSY, + CARD_READ_UNEXPECTED_ERROR } CardDataReadState; @@ -124,7 +127,6 @@ typedef struct SYSM_work { vu16 isCardGameMode :1; // カードがゲームモードに遷移したか? vu16 :0; vu8 isCardStateChanged; // カード状態更新フラグ - vu8 isCardReadCompleted; // カードデータリード完了? }hotsw; }flags; // 7B