summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
authorRevo <projectrevotpp@hotmail.com>2020-10-15 10:44:30 -0400
committerGitHub <noreply@github.com>2020-10-15 10:44:30 -0400
commite7fa21a56d7a8e12b31afdf7f1247700c56226c9 (patch)
treebb3f189674fa45677a591d5d706bd263b9b07c6c /arm9/lib
parent5d7b49bfda5d50c9f80bf2780a8614fe210fbc38 (diff)
parent8845a46444d29d5c4ac491fa040c35af61a3428d (diff)
Merge pull request #291 from red031000/master
split a lot more of module 5 and arm9 CARD_pullOut
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/CARD_backup.h2
-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, 136 insertions, 5 deletions
diff --git a/arm9/lib/include/CARD_backup.h b/arm9/lib/include/CARD_backup.h
index 465d6d2e..e5c0c0cd 100644
--- a/arm9/lib/include/CARD_backup.h
+++ b/arm9/lib/include/CARD_backup.h
@@ -7,7 +7,7 @@
BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async,
CARDRequest req_type, int req_retry, CARDRequestMode req_mode);
-u32 CARD_GetBackupSectorSize(void);;
+u32 CARD_GetBackupSectorSize(void);
BOOL CARD_IdentifyBackup(CARDBackupType type);
BOOL CARD_WaitBackupAsync(void);
BOOL CARD_TryWaitBackupAsync(void);
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..40f58f2f
--- /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((u32)wait);
+ }
+}