diff options
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/CARD_common.h | 4 | ||||
-rw-r--r-- | arm9/lib/include/CARD_pullOut.h | 11 | ||||
-rw-r--r-- | arm9/lib/include/PAD_pad.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/PXI_fifo.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/SPI_pm.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/consts.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 2 | ||||
-rw-r--r-- | arm9/lib/src/CARD_pullOut.c | 107 |
8 files changed, 135 insertions, 4 deletions
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h index 292b9066..d3bc5fea 100644 --- a/arm9/lib/include/CARD_common.h +++ b/arm9/lib/include/CARD_common.h @@ -6,6 +6,10 @@ #include "OS_system.h" #include "MI_dma.h" +#define CARD_PXI_COMMAND_MASK 0x3f +#define CARD_PXI_COMMAND_PULLED_OUT 0x0011 +#define CARD_PXI_COMMAND_TERMINATE 0x0001 + #define CARD_THREAD_PRIORITY_DEFAULT 4 #define CARD_BACKUP_TYPE_DEVICE_SHIFT 0 diff --git a/arm9/lib/include/CARD_pullOut.h b/arm9/lib/include/CARD_pullOut.h index be49b95d..bfc0e6d2 100644 --- a/arm9/lib/include/CARD_pullOut.h +++ b/arm9/lib/include/CARD_pullOut.h @@ -1,8 +1,13 @@ -#ifndef NITRO_CARD_PULLOUT_H_ -#define NITRO_CARD_PULLOUT_H_ +#ifndef POKEDIAMOND_CARD_PULLOUT_H +#define POKEDIAMOND_CARD_PULLOUT_H #include "nitro/types.h" +typedef BOOL (*CARDPulledOutCallback) (void); + +void CARD_InitPulledOutCallback(void); BOOL CARD_IsPulledOut(void); +void CARD_TerminateForPulledOut(void); +void CARDi_CheckPulledOutCore(u32 id); -#endif //NITRO_CARD_PULLOUT_H_ +#endif //POKEDIAMOND_CARD_PULLOUT_H diff --git a/arm9/lib/include/PAD_pad.h b/arm9/lib/include/PAD_pad.h index 327d306d..a4b5d570 100644 --- a/arm9/lib/include/PAD_pad.h +++ b/arm9/lib/include/PAD_pad.h @@ -1,6 +1,7 @@ #ifndef NITRO_PAD_PAD_H_ #define NITRO_PAD_PAD_H_ +#include "consts.h" //================================================================================ // BUTTONS diff --git a/arm9/lib/include/PXI_fifo.h b/arm9/lib/include/PXI_fifo.h index 45caa906..becba32e 100644 --- a/arm9/lib/include/PXI_fifo.h +++ b/arm9/lib/include/PXI_fifo.h @@ -3,4 +3,14 @@ #include "nitro/PXI_fifo_shared.h" +typedef enum +{ + PXI_FIFO_SUCCESS = 0, + PXI_FIFO_FAIL_SEND_ERR = -1, + PXI_FIFO_FAIL_SEND_FULL = -2, + PXI_FIFO_FAIL_RECV_ERR = -3, + PXI_FIFO_FAIL_RECV_EMPTY = -4, + PXI_FIFO_NO_CALLBACK_ENTRY = -5 +} PXIFifoStatus; + #endif //POKEDIAMOND_ARM9_PXI_FIFO_H diff --git a/arm9/lib/include/SPI_pm.h b/arm9/lib/include/SPI_pm.h index a5957f74..95f94f24 100644 --- a/arm9/lib/include/SPI_pm.h +++ b/arm9/lib/include/SPI_pm.h @@ -31,7 +31,7 @@ PMLCDTarget; void PM_GetBackLight(PMBackLightSwitch * top, PMBackLightSwitch * bottom); void PM_GoSleepMode(PMWakeUpTrigger trigger, PMLogic logic, u16 keyPattern); u32 PM_SetBackLight(PMLCDTarget target, PMBackLightSwitch status); -void PM_ForceToPowerOff(void); +u32 PM_ForceToPowerOff(void); void PM_SetAmp(int gain); void PM_SetAmpGain(int gain); diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h index afe1b726..7c56a9a3 100644 --- a/arm9/lib/include/consts.h +++ b/arm9/lib/include/consts.h @@ -48,4 +48,6 @@ #define OS_IE_V_BLANK (1UL << 0) +#define HW_CPU_CLOCK_ARM9 67027964 + #endif //POKEDIAMOND_ARM9_CONSTS_H diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h index 027259ad..de5a8057 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -29,7 +29,9 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_CARD_ROM_HEADER_SIZE 0x00000160 #define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020 +#define HW_CHECK_DEBUGGER_SW 0x027ffc10 #define HW_CARD_ROM_HEADER (HW_MAIN_MEM + 0x007ffa80) +#define HW_BOOT_CHECK_INFO_BUF (HW_MAIN_MEM + 0x007ffc00) #define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM + 0x007ffc20) #define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c) #define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer diff --git a/arm9/lib/src/CARD_pullOut.c b/arm9/lib/src/CARD_pullOut.c new file mode 100644 index 00000000..1c2de33b --- /dev/null +++ b/arm9/lib/src/CARD_pullOut.c @@ -0,0 +1,107 @@ +#include "function_target.h" +#include "CARD_common.h" +#include "CARD_pullOut.h" +#include "PXI_init.h" +#include "PXI_fifo.h" +#include "OS_terminate_proc.h" +#include "OS_system.h" +#include "PAD_pad.h" +#include "SPI_pm.h" +#include "syscall.h" + +static CARDPulledOutCallback CARD_UserCallback; +static BOOL CARDi_IsPulledOutFlag = FALSE; + +extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); +extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); + +static void CARDi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err); +static void CARDi_SendtoPxi(u32 data, u32 wait); + +ARM_FUNC void CARD_InitPulledOutCallback(void) +{ + PXI_Init(); + + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CARD, CARDi_PulledOutCallback); + + CARD_UserCallback = NULL; +} + +ARM_FUNC static void CARDi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused(tag, err) + u32 command = data & CARD_PXI_COMMAND_MASK; + + if (command == CARD_PXI_COMMAND_PULLED_OUT) + { + if (!CARDi_IsPulledOutFlag) + { + BOOL isTerminateImm = TRUE; + CARDi_IsPulledOutFlag = TRUE; + + if (CARD_UserCallback) + { + isTerminateImm = CARD_UserCallback(); + } + + if (isTerminateImm) + { + CARD_TerminateForPulledOut(); + } + } + } + else + { + OS_Terminate(); + } +} + +ARM_FUNC BOOL CARD_IsPulledOut(void) +{ + return CARDi_IsPulledOutFlag; +} + +ARM_FUNC void CARD_TerminateForPulledOut(void) +{ + BOOL should_be_halt = TRUE; + + if (PAD_DetectFold()) + { + u32 res; + while ((res = PM_ForceToPowerOff()) == 0x04) + { + OS_SpinWait(HW_CPU_CLOCK_ARM9 / 100); + } + if (res == 0) + { + should_be_halt = FALSE; + } + } + + if (should_be_halt) + { + CARDi_SendtoPxi(CARD_PXI_COMMAND_TERMINATE, 1); + } + + OS_Terminate(); +} + +ARM_FUNC void CARDi_CheckPulledOutCore(u32 id) +{ + vu32 iplCardID = *(vu32 *)((*(u16 *)HW_CHECK_DEBUGGER_SW == 0) ? HW_RED_RESERVED : HW_BOOT_CHECK_INFO_BUF); + + if (id != (u32)iplCardID) + { + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + CARDi_PulledOutCallback(PXI_FIFO_TAG_CARD, CARD_PXI_COMMAND_PULLED_OUT, FALSE); + (void)OS_RestoreInterrupts(bak_cpsr); + } +} + +ARM_FUNC static void CARDi_SendtoPxi(u32 data, u32 wait) +{ + while (PXI_SendWordByFifo(PXI_FIFO_TAG_CARD, data, FALSE) != PXI_FIFO_SUCCESS) + { + SVC_WaitByLoop((s32)wait); + } +} |