summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRevo <projectrevotpp@hotmail.com>2020-10-19 21:12:42 -0400
committerGitHub <noreply@github.com>2020-10-19 21:12:42 -0400
commitaf8cfa1d2d306916d89a92b089d1bfd4819601c8 (patch)
tree72b2aa868b6694c63e7e04f9f13e2fd689f48c8e
parente7fa21a56d7a8e12b31afdf7f1247700c56226c9 (diff)
parent5b76f6966c503210945b89e6e2662ca5e2c60dc1 (diff)
Merge pull request #293 from red031000/master
arm9 CARD_request
-rw-r--r--arm9/asm/CARD_request.s164
-rw-r--r--arm9/lib/include/CARD_common.h9
-rw-r--r--arm9/lib/include/CARD_request.h12
-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
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);