diff options
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/asm/CARD_pullOut.s | 179 | ||||
-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 |
9 files changed, 135 insertions, 183 deletions
diff --git a/arm9/asm/CARD_pullOut.s b/arm9/asm/CARD_pullOut.s deleted file mode 100644 index a3237d3c..00000000 --- a/arm9/asm/CARD_pullOut.s +++ /dev/null @@ -1,179 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global UNK_021D5E20 -UNK_021D5E20: ; 0x021D5E20 - .space 0x4 - - .global UNK_021D5E24 -UNK_021D5E24: ; 0x021D5E24 - .space 0x4 - - .text - - arm_func_start CARDi_SendtoPxi -CARDi_SendtoPxi: ; 0x020D7BCC - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r7, r0 - mov r6, r1 - mov r1, r7 - mov r0, #0xe - mov r2, #0x0 - bl PXI_SendWordByFifo -_020D7BEC: ; 0x020D7BEC - cmp r0, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {r4-r7,lr} - bxeq lr - mov r5, #0xe - mov r4, #0x0 -_020D7C04: - mov r0, r6 - bl SVC_WaitByLoop - mov r0, r5 - mov r1, r7 - mov r2, r4 - bl PXI_SendWordByFifo -_020D7C1C: ; 0x020D7C1C - cmp r0, #0x0 - bne _020D7C04 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - - arm_func_start CARDi_CheckPulledOutCore -CARDi_CheckPulledOutCore: - stmdb sp!, {r4,lr} - sub sp, sp, #0x8 - ldr r1, _020D7C94 ; =0x027FFC10 - ldrh r1, [r1, #0x0] - cmp r1, #0x0 - ldreq r1, _020D7C98 ; =0x027FF800 - ldrne r1, _020D7C9C ; =0x027FFC00 - ldr r1, [r1, #0x0] - str r1, [sp, #0x0] - ldr r1, [sp, #0x0] - cmp r0, r1 - addeq sp, sp, #0x8 - ldmeqia sp!, {r4,lr} - bxeq lr - bl OS_DisableInterrupts - mov r4, r0 - mov r0, #0xe - mov r1, #0x11 - mov r2, #0x0 - bl CARDi_PulledOutCallback - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #0x8 - ldmia sp!, {r4,lr} - bx lr - .balign 4 -_020D7C94: .word 0x027FFC10 -_020D7C98: .word 0x027FF800 -_020D7C9C: .word 0x027FFC00 - - arm_func_start CARD_TerminateForPulledOut -CARD_TerminateForPulledOut: ; 0x020D7CA0 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x4 - ldr r0, _020D7D10 ; =0x027FFFA8 - mov r5, #0x1 - ldrh r0, [r0, #0x0] - and r0, r0, #0x8000 - movs r0, r0, asr #0xf - beq _020D7CEC - bl PM_ForceToPowerOff - cmp r0, #0x4 - bne _020D7CE4 - ldr r4, _020D7D14 ; =0x000A3A47 -_020D7CD0: - mov r0, r4 - bl OS_SpinWait - bl PM_ForceToPowerOff - cmp r0, #0x4 - beq _020D7CD0 -_020D7CE4: - cmp r0, #0x0 - moveq r5, #0x0 -_020D7CEC: - cmp r5, #0x0 - beq _020D7D00 - mov r0, #0x1 - mov r1, r0 - bl CARDi_SendtoPxi -_020D7D00: - bl OS_Terminate - add sp, sp, #0x4 - ldmia sp!, {r4-r5,lr} - bx lr - .balign 4 -_020D7D10: .word 0x027FFFA8 -_020D7D14: .word 0x000A3A47 - - arm_func_start CARD_IsPulledOut -CARD_IsPulledOut: ; 0x020D7D18 - ldr r0, _020D7D24 ; =UNK_021D5E20 - ldr r0, [r0, #0x0] - bx lr - .balign 4 -_020D7D24: .word UNK_021D5E20 - - arm_func_start CARDi_PulledOutCallback -CARDi_PulledOutCallback: ; 0x020D7D28 - stmdb sp!, {lr} - sub sp, sp, #0x4 - and r0, r1, #0x3f - cmp r0, #0x11 - bne _020D7D90 - ldr r2, _020D7DA0 ; =UNK_021D5E20 - ldr r0, [r2, #0x0] - cmp r0, #0x0 - addne sp, sp, #0x4 - ldmneia sp!, {lr} - bxne lr - ldr r1, _020D7DA4 ; =UNK_021D5E24 - mov r0, #0x1 - ldr r1, [r1, #0x0] - str r0, [r2, #0x0] - cmp r1, #0x0 - beq _020D7D70 - blx r1 -_020D7D70: - cmp r0, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {lr} - bxeq lr - bl CARD_TerminateForPulledOut - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr -_020D7D90: - bl OS_Terminate - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020D7DA0: .word UNK_021D5E20 -_020D7DA4: .word UNK_021D5E24 - - arm_func_start CARD_InitPulledOutCallback -CARD_InitPulledOutCallback: ; 0x020D7DA8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - bl PXI_Init - ldr r1, _020D7DD8 ; =CARDi_PulledOutCallback - mov r0, #0xe - bl PXI_SetFifoRecvCallback - ldr r0, _020D7DDC ; =UNK_021D5E24 - mov r1, #0x0 - str r1, [r0, #0x0] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020D7DD8: .word CARDi_PulledOutCallback -_020D7DDC: .word UNK_021D5E24 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); + } +} |