summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/CARD_backup.c2
-rw-r--r--arm9/lib/src/CARD_common.c3
-rw-r--r--arm9/lib/src/CARD_pullOut.c2
-rw-r--r--arm9/lib/src/CARD_request.c78
-rw-r--r--arm9/lib/src/OS_reset.c2
5 files changed, 82 insertions, 5 deletions
diff --git a/arm9/lib/src/CARD_backup.c b/arm9/lib/src/CARD_backup.c
index fa39fa0f..851f10f5 100644
--- a/arm9/lib/src/CARD_backup.c
+++ b/arm9/lib/src/CARD_backup.c
@@ -1,6 +1,7 @@
#include "CARD_backup.h"
#include "function_target.h"
#include "CARD_common.h"
+#include "CARD_request.h"
#include "OS_cache.h"
#include "MI_memory.h"
#include "OS_terminate_proc.h"
@@ -9,7 +10,6 @@
extern void OSi_ReferSymbol(void *symbol);
extern char _SDK_NintendoBackup[];
-extern BOOL CARDi_Request(CARDiCommon * p, int req_type, int retry_count);
extern void CARDi_IdentifyBackupCore(CARDBackupType type);
extern CARDiCommon cardi_common;
diff --git a/arm9/lib/src/CARD_common.c b/arm9/lib/src/CARD_common.c
index c6bae9a1..65d92377 100644
--- a/arm9/lib/src/CARD_common.c
+++ b/arm9/lib/src/CARD_common.c
@@ -1,4 +1,5 @@
#include "CARD_common.h"
+#include "CARD_request.h"
#include "consts.h"
#include "function_target.h"
#include "MI_memory.h"
@@ -13,9 +14,7 @@ static CARDiCommandArg cardi_arg ALIGN(32);
u8 cardi_thread_stack[0x400] ALIGN(4);
-extern void CARDi_TaskThread(void *arg);
extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-extern void CARDi_OnFifoRecv(PXIFifoTag tag, u32 data, BOOL err);
static void CARDi_LockResource(CARDiOwner owner, CARDTargetMode target);
static void CARDi_UnlockResource(CARDiOwner owner, CARDTargetMode target);
diff --git a/arm9/lib/src/CARD_pullOut.c b/arm9/lib/src/CARD_pullOut.c
index 40f58f2f..27293d60 100644
--- a/arm9/lib/src/CARD_pullOut.c
+++ b/arm9/lib/src/CARD_pullOut.c
@@ -13,7 +13,7 @@ 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);
+extern BOOL 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);
diff --git a/arm9/lib/src/CARD_request.c b/arm9/lib/src/CARD_request.c
new file mode 100644
index 00000000..2d728d14
--- /dev/null
+++ b/arm9/lib/src/CARD_request.c
@@ -0,0 +1,78 @@
+#include "function_target.h"
+#include "CARD_request.h"
+#include "OS_cache.h"
+#include "OS_system.h"
+#include "OS_thread.h"
+
+extern CARDiCommon cardi_common;
+
+extern u32 PXI_IsCallbackReady(u32 param1, u32 param2);
+
+ARM_FUNC void CARDi_OnFifoRecv(PXIFifoTag tag, u32 data, BOOL err)
+{
+#pragma unused (data)
+ if ((tag == PXI_FIFO_TAG_FS) && err)
+ {
+ CARDiCommon *const p = &cardi_common;
+ p->flag &= ~CARD_STAT_REQ;
+ OS_WakeupThreadDirect(p->cur_th);
+ }
+}
+
+ARM_FUNC void CARDi_TaskThread(void *arg)
+{
+#pragma unused (arg)
+ CARDiCommon *const p = &cardi_common;
+
+ while (TRUE)
+ {
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+ while ((p->flag & CARD_STAT_TASK) == 0)
+ {
+ p->cur_th = p->thread;
+ OS_SleepThread(NULL);
+ }
+ (void)OS_RestoreInterrupts(bak_psr);
+ (*p->task_func)(p);
+ }
+}
+
+ARM_FUNC BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count)
+{
+ if ((p->flag & CARD_STAT_INIT_CMD) == 0)
+ {
+ p->flag |= CARD_STAT_INIT_CMD;
+ while (!PXI_IsCallbackReady(PXI_FIFO_TAG_FS, PXI_PROC_ARM7))
+ {
+ OS_SpinWait(100);
+ }
+
+ (void)CARDi_Request(p, CARD_REQ_INIT, 1);
+ }
+ DC_FlushRange(p->cmd, sizeof(*p->cmd));
+ DC_WaitWriteBufferEmpty();
+
+ do
+ {
+ p->command = req_type;
+ p->flag |= CARD_STAT_REQ;
+ CARDi_SendPxi((u32)req_type);
+
+ switch (req_type)
+ {
+ case CARD_REQ_INIT:
+ CARDi_SendPxi((u32)p->cmd);
+ break;
+ }
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+ while ((p->flag & CARD_STAT_REQ) != 0)
+ {
+ OS_SleepThread(NULL);
+ }
+ (void)OS_RestoreInterrupts(bak_psr);
+ DC_InvalidateRange(p->cmd, sizeof(*p->cmd));
+ }
+ while ((p->cmd->result == CARD_RESULT_TIMEOUT) && (--retry_count > 0));
+
+ return (p->cmd->result == CARD_RESULT_SUCCESS);
+}
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index 7331a7b0..8be8fb33 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -16,7 +16,7 @@ vu16 OSi_IsResetOccurred = 0;
extern u32 PXI_IsCallbackReady(u32 param1, u32 param2);
extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
+extern BOOL PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
static void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err);
static void OSi_SendToPxi(u16 data);