summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/asm/CARD_pullOut.s179
-rw-r--r--arm9/lib/include/CARD_common.h4
-rw-r--r--arm9/lib/include/CARD_pullOut.h11
-rw-r--r--arm9/lib/include/PAD_pad.h1
-rw-r--r--arm9/lib/include/PXI_fifo.h10
-rw-r--r--arm9/lib/include/SPI_pm.h2
-rw-r--r--arm9/lib/include/consts.h2
-rw-r--r--arm9/lib/include/mmap.h2
-rw-r--r--arm9/lib/src/CARD_pullOut.c107
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);
+ }
+}