diff options
author | Revo <projectrevotpp@hotmail.com> | 2020-10-19 21:12:42 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-19 21:12:42 -0400 |
commit | af8cfa1d2d306916d89a92b089d1bfd4819601c8 (patch) | |
tree | 72b2aa868b6694c63e7e04f9f13e2fd689f48c8e | |
parent | e7fa21a56d7a8e12b31afdf7f1247700c56226c9 (diff) | |
parent | 5b76f6966c503210945b89e6e2662ca5e2c60dc1 (diff) |
Merge pull request #293 from red031000/master
arm9 CARD_request
-rw-r--r-- | arm9/asm/CARD_request.s | 164 | ||||
-rw-r--r-- | arm9/lib/include/CARD_common.h | 9 | ||||
-rw-r--r-- | arm9/lib/include/CARD_request.h | 12 | ||||
-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 |
8 files changed, 103 insertions, 169 deletions
diff --git a/arm9/asm/CARD_request.s b/arm9/asm/CARD_request.s deleted file mode 100644 index a6793d89..00000000 --- a/arm9/asm/CARD_request.s +++ /dev/null @@ -1,164 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .extern cardi_common - - .text - - arm_func_start CARDi_Request -CARDi_Request: - stmdb sp!, {r4-r11,lr} - sub sp, sp, #0x4 - mov r6, r0 - ldr r0, [r6, #0x114] - mov r5, r1 - mov r4, r2 - ands r0, r0, #0x2 - bne _020D7A44 - ldr r1, [r6, #0x114] - mov r0, #0xb - orr r2, r1, #0x2 - mov r1, #0x1 - str r2, [r6, #0x114] - bl PXI_IsCallbackReady -_020D7A04: ; 0x020D7A04 - cmp r0, #0x0 - bne _020D7A34 - mov r9, #0x64 - mov r8, #0xb - mov r7, #0x1 -_020D7A18: - mov r0, r9 - bl OS_SpinWait - mov r0, r8 - mov r1, r7 - bl PXI_IsCallbackReady -_020D7A2C: ; 0x020D7A2C - cmp r0, #0x0 - beq _020D7A18 -_020D7A34: - mov r0, r6 - mov r1, #0x0 - mov r2, #0x1 - bl CARDi_Request -_020D7A44: - ldr r0, [r6, #0x0] - mov r1, #0x60 - bl DC_FlushRange - bl DC_WaitWriteBufferEmpty - mov r9, #0xb - mov r8, #0x1 - mov r7, #0x0 - mov r11, #0x60 -_020D7A64: - str r5, [r6, #0x4] - ldr r0, [r6, #0x114] - orr r0, r0, #0x20 - str r0, [r6, #0x114] -_020D7A74: - mov r0, r9 - mov r1, r5 - mov r2, r8 - bl PXI_SendWordByFifo -_020D7A84: ; 0x020D7A84 - cmp r0, #0x0 - blt _020D7A74 - cmp r5, #0x0 - bne _020D7AB0 - ldr r10, [r6, #0x0] -_020D7A98: - mov r0, r9 - mov r1, r10 - mov r2, r8 - bl PXI_SendWordByFifo -_020D7AA8: ; 0x020D7AA8 - cmp r0, #0x0 - blt _020D7A98 -_020D7AB0: - bl OS_DisableInterrupts - ldr r1, [r6, #0x114] - mov r10, r0 - ands r0, r1, #0x20 - beq _020D7AD8 -_020D7AC4: - mov r0, r7 - bl OS_SleepThread - ldr r0, [r6, #0x114] - ands r0, r0, #0x20 - bne _020D7AC4 -_020D7AD8: - mov r0, r10 - bl OS_RestoreInterrupts -_020D7AE0: ; 0x020D7AE0 - ldr r0, [r6, #0x0] - mov r1, r11 - bl DC_InvalidateRange -_020D7AEC: ; 0x020D7AEC - ldr r0, [r6, #0x0] - ldr r0, [r0, #0x0] - cmp r0, #0x4 - bne _020D7B08 - sub r4, r4, #0x1 - cmp r4, #0x0 - bgt _020D7A64 -_020D7B08: - cmp r0, #0x0 - moveq r0, #0x1 - movne r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {r4-r11,lr} - bx lr - - arm_func_start CARDi_TaskThread -CARDi_TaskThread: ; 0x020D7B20 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - ldr r5, _020D7B78 ; =cardi_common - mov r6, #0x0 - add r7, r5, #0x44 -_020D7B34: - bl OS_DisableInterrupts - ldr r1, [r5, #0x114] - mov r4, r0 - ands r0, r1, #0x8 - bne _020D7B60 -_020D7B48: - mov r0, r6 - str r7, [r5, #0x104] - bl OS_SleepThread - ldr r0, [r5, #0x114] - ands r0, r0, #0x8 - beq _020D7B48 -_020D7B60: - mov r0, r4 - bl OS_RestoreInterrupts - ldr r1, [r5, #0x40] - mov r0, r5 - blx r1 - b _020D7B34 - .balign 4 -_020D7B78: .word cardi_common - - arm_func_start CARDi_OnFifoRecv -CARDi_OnFifoRecv: ; 0x020D7B7C - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r0, #0xb - addne sp, sp, #0x4 - ldmneia sp!, {lr} - bxne lr - cmp r2, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {lr} - bxeq lr - ldr r1, _020D7BC8 ; =cardi_common - ldr r0, [r1, #0x114] - bic r0, r0, #0x20 - str r0, [r1, #0x114] - ldr r0, [r1, #0x104] - bl OS_WakeupThreadDirect - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020D7BC8: .word cardi_common diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h index d3bc5fea..7730ffa4 100644 --- a/arm9/lib/include/CARD_common.h +++ b/arm9/lib/include/CARD_common.h @@ -5,6 +5,7 @@ #include "OS_thread.h" #include "OS_system.h" #include "MI_dma.h" +#include "PXI_fifo.h" #define CARD_PXI_COMMAND_MASK 0x3f #define CARD_PXI_COMMAND_PULLED_OUT 0x0011 @@ -210,4 +211,12 @@ void CARD_UnlockBackup(u16 lock_id); void CARD_Init(void); +extern BOOL PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); + +static inline void CARDi_SendPxi(u32 data) +{ + while (PXI_SendWordByFifo(PXI_FIFO_TAG_FS, data, TRUE) < 0) + ; +} + #endif //POKEDIAMOND_CARD_COMMON_H diff --git a/arm9/lib/include/CARD_request.h b/arm9/lib/include/CARD_request.h new file mode 100644 index 00000000..1bae75d0 --- /dev/null +++ b/arm9/lib/include/CARD_request.h @@ -0,0 +1,12 @@ +#ifndef POKEDIAMOND_CARD_REQUEST_H +#define POKEDIAMOND_CARD_REQUEST_H + +#include "nitro/types.h" +#include "PXI_fifo.h" +#include "CARD_common.h" + +void CARDi_OnFifoRecv(PXIFifoTag tag, u32 data, BOOL err); +void CARDi_TaskThread(void *arg); +BOOL CARDi_Request(CARDiCommon *p, s32 req_type, s32 retry_count); + +#endif //POKEDIAMOND_CARD_REQUEST_H 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); |