From ded6f75f143efbef4d8424cc4024aa355615e429 Mon Sep 17 00:00:00 2001 From: red031000 Date: Mon, 19 Oct 2020 20:49:27 +0100 Subject: arm9 CARD_request --- arm9/lib/src/CARD_backup.c | 2 +- arm9/lib/src/CARD_common.c | 3 +- arm9/lib/src/CARD_pullOut.c | 2 +- arm9/lib/src/CARD_request.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ arm9/lib/src/OS_reset.c | 2 +- 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 arm9/lib/src/CARD_request.c (limited to 'arm9/lib/src') 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); -- cgit v1.2.3 From ed32ce3f29632a87e2194af6e6921534dec215b6 Mon Sep 17 00:00:00 2001 From: red031000 Date: Mon, 19 Oct 2020 21:33:07 +0100 Subject: try and re-trigger travis --- arm9/lib/src/CARD_request.c | 1 + 1 file changed, 1 insertion(+) (limited to 'arm9/lib/src') diff --git a/arm9/lib/src/CARD_request.c b/arm9/lib/src/CARD_request.c index 2d728d14..234acd88 100644 --- a/arm9/lib/src/CARD_request.c +++ b/arm9/lib/src/CARD_request.c @@ -49,6 +49,7 @@ ARM_FUNC BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count) (void)CARDi_Request(p, CARD_REQ_INIT, 1); } + DC_FlushRange(p->cmd, sizeof(*p->cmd)); DC_WaitWriteBufferEmpty(); -- cgit v1.2.3 From 451f2a9629fea5a2927eb3de0a87725f0a96b8da Mon Sep 17 00:00:00 2001 From: red031000 Date: Mon, 19 Oct 2020 23:07:54 +0100 Subject: travis test #2 --- arm9/lib/src/CARD_request.c | 1 - 1 file changed, 1 deletion(-) (limited to 'arm9/lib/src') diff --git a/arm9/lib/src/CARD_request.c b/arm9/lib/src/CARD_request.c index 234acd88..2d728d14 100644 --- a/arm9/lib/src/CARD_request.c +++ b/arm9/lib/src/CARD_request.c @@ -49,7 +49,6 @@ ARM_FUNC BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count) (void)CARDi_Request(p, CARD_REQ_INIT, 1); } - DC_FlushRange(p->cmd, sizeof(*p->cmd)); DC_WaitWriteBufferEmpty(); -- cgit v1.2.3 From 181a5e1c655e2acdff3dc3d53249ecc6290d76c8 Mon Sep 17 00:00:00 2001 From: red031000 Date: Mon, 19 Oct 2020 23:12:17 +0100 Subject: #3 --- arm9/lib/src/CARD_request.c | 1 + 1 file changed, 1 insertion(+) (limited to 'arm9/lib/src') diff --git a/arm9/lib/src/CARD_request.c b/arm9/lib/src/CARD_request.c index 2d728d14..234acd88 100644 --- a/arm9/lib/src/CARD_request.c +++ b/arm9/lib/src/CARD_request.c @@ -49,6 +49,7 @@ ARM_FUNC BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count) (void)CARDi_Request(p, CARD_REQ_INIT, 1); } + DC_FlushRange(p->cmd, sizeof(*p->cmd)); DC_WaitWriteBufferEmpty(); -- cgit v1.2.3 From 5b76f6966c503210945b89e6e2662ca5e2c60dc1 Mon Sep 17 00:00:00 2001 From: red031000 Date: Tue, 20 Oct 2020 01:48:12 +0100 Subject: small test --- arm9/lib/src/CARD_request.c | 1 - 1 file changed, 1 deletion(-) (limited to 'arm9/lib/src') diff --git a/arm9/lib/src/CARD_request.c b/arm9/lib/src/CARD_request.c index 234acd88..2d728d14 100644 --- a/arm9/lib/src/CARD_request.c +++ b/arm9/lib/src/CARD_request.c @@ -49,7 +49,6 @@ ARM_FUNC BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count) (void)CARDi_Request(p, CARD_REQ_INIT, 1); } - DC_FlushRange(p->cmd, sizeof(*p->cmd)); DC_WaitWriteBufferEmpty(); -- cgit v1.2.3