summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-10-15 13:27:40 +0100
committerred031000 <rubenru09@aol.com>2020-10-15 13:27:40 +0100
commit311b367ce5f8e5a801474f4a472252b042950aa1 (patch)
tree01b1fe9b03a3af65c83bd1ce997507569b855176 /arm9/lib/src
parent84a69476f6d812eeb63164781d03944a9e1a68b8 (diff)
arm9 CARD_pullOut
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/CARD_pullOut.c107
1 files changed, 107 insertions, 0 deletions
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);
+ }
+}