diff options
Diffstat (limited to 'arm9/lib/src')
-rw-r--r-- | arm9/lib/src/CARD_backup.c | 2 | ||||
-rw-r--r-- | arm9/lib/src/CARD_common.c | 3 | ||||
-rw-r--r-- | arm9/lib/src/CARD_pullOut.c | 2 | ||||
-rw-r--r-- | arm9/lib/src/CARD_request.c | 78 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 2 |
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); |