summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/PXI_fifo.s269
-rw-r--r--arm9/lib/include/CARD_common.h2
-rw-r--r--arm9/lib/include/OS_interrupt.h1
-rw-r--r--arm9/lib/include/PXI_fifo.h20
-rw-r--r--arm9/lib/include/consts.h9
-rw-r--r--arm9/lib/include/registers.h1
-rw-r--r--arm9/lib/src/CARD_common.c2
-rw-r--r--arm9/lib/src/CARD_pullOut.c3
-rw-r--r--arm9/lib/src/CARD_request.c2
-rw-r--r--arm9/lib/src/CARD_spi.c1
-rw-r--r--arm9/lib/src/OS_reset.c5
-rw-r--r--arm9/lib/src/PXI_fifo.c185
-rw-r--r--arm9/lib/src/PXI_init.c3
-rw-r--r--arm9/lib/src/SND_command.c17
-rw-r--r--include/nitro/PXI_fifo_shared.h6
15 files changed, 229 insertions, 297 deletions
diff --git a/arm9/asm/PXI_fifo.s b/arm9/asm/PXI_fifo.s
deleted file mode 100644
index c1980dea..00000000
--- a/arm9/asm/PXI_fifo.s
+++ /dev/null
@@ -1,269 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
- .section .bss
-
- .global UNK_021D5364
-UNK_021D5364: ; 0x021D5364
- .space 0x4
-
- .global UNK_021D5368
-UNK_021D5368: ; 0x021D5368
- .space 0x80
-
- .text
-
- arm_func_start PXIi_HandlerRecvFifoNotEmpty
-PXIi_HandlerRecvFifoNotEmpty: ; 0x020CFBBC
- stmdb sp!, {r4-r10,lr}
- sub sp, sp, #0x8
- ldr sl, _020CFCD4 ; =0x04000184
- ldr r5, _020CFCD8 ; =UNK_021D5368
- ldr r4, _020CFCDC ; =0x04000188
- mov r7, #0x4100000
- mov r6, #0x0
- mvn r8, #0x3
- mvn r9, #0x2
-_020CFBE0:
- ldrh r0, [r10, #0x0]
- ands r0, r0, #0x4000
- ldrneh r0, [r10, #0x0]
- movne r1, r9
- orrne r0, r0, #0xc000
- strneh r0, [r10, #0x0]
- bne _020CFC28
- bl OS_DisableInterrupts
- ldrh r1, [r10, #0x0]
- ands r1, r1, #0x100
- beq _020CFC18
- bl OS_RestoreInterrupts
- mov r1, r8
- b _020CFC28
-_020CFC18:
- ldr r1, [r7, #0x0]
- str r1, [sp, #0x0]
- bl OS_RestoreInterrupts
- mov r1, r6
-_020CFC28:
- cmp r1, r8
- addeq sp, sp, #0x8
- ldmeqia sp!, {r4-r10,lr}
- bxeq lr
- mvn r0, #0x2
- cmp r1, r0
- beq _020CFBE0
- ldr r1, [sp, #0x0]
- mov r0, r1, lsl #0x1b
- movs r0, r0, lsr #0x1b
- beq _020CFBE0
- ldr r3, [r5, r0, lsl #0x2]
- cmp r3, #0x0
- beq _020CFC74
- mov r2, r1, lsl #0x1a
- mov r1, r1, lsr #0x6
- mov r2, r2, lsr #0x1f
- blx r3
- b _020CFBE0
-_020CFC74:
- mov r0, r1, lsl #0x1a
- movs r0, r0, lsr #0x1f
- bne _020CFBE0
- orr r0, r1, #0x20
- str r0, [sp, #0x0]
- ldrh r0, [r10, #0x0]
- ands r0, r0, #0x4000
- ldrneh r0, [r10, #0x0]
- orrne r0, r0, #0xc000
- strneh r0, [r10, #0x0]
- bne _020CFBE0
- bl OS_DisableInterrupts
- ldrh r1, [r10, #0x0]
- ands r1, r1, #0x2
- beq _020CFCB8
- bl OS_RestoreInterrupts
- b _020CFBE0
-_020CFCB8:
- ldr r1, [sp, #0x0]
- str r1, [r4, #0x0]
- bl OS_RestoreInterrupts
- b _020CFBE0
-_020CFCC8:
- add sp, sp, #0x8
- ldmia sp!, {r4-r10, lr}
- bx lr
-_020CFCD4: .word 0x04000184
-_020CFCD8: .word UNK_021D5368
-_020CFCDC: .word 0x04000188
-
- arm_func_start PXI_SendWordByFifo
-PXI_SendWordByFifo:
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r3, [sp, #0x0]
- and r0, r0, #0x1f
- bic r3, r3, #0x1f
- orr r12, r3, r0
- bic r3, r12, #0x20
- and r0, r2, #0x1
- orr r3, r3, r0, lsl #0x5
- str r12, [sp, #0x0]
- and r2, r3, #0x3f
- bic r0, r1, #0xfc000000
- orr r0, r2, r0, lsl #0x6
- str r3, [sp, #0x0]
- ldr r2, _020CFD8C ; =0x04000184
- str r0, [sp, #0x0]
- ldrh r0, [r2, #0x0]
- ands r0, r0, #0x4000
- ldrneh r1, [r2, #0x0]
- addne sp, sp, #0x4
- mvnne r0, #0x0
- orrne r1, r1, #0xc000
- strneh r1, [r2, #0x0]
- ldmneia sp!, {lr}
- bxne lr
- bl OS_DisableInterrupts
- ldr r1, _020CFD8C ; =0x04000184
- ldrh r1, [r1, #0x0]
- ands r1, r1, #0x2
- beq _020CFD6C
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- mvn r0, #0x1
- ldmia sp!, {lr}
- bx lr
-_020CFD6C:
- ldr r2, [sp, #0x0]
- ldr r1, _020CFD90 ; =0x04000188
- str r2, [r1, #0x0]
- bl OS_RestoreInterrupts
-_020CFD7C:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmfd sp!, {lr}
- bx lr
-_020CFD8C: .word 0x04000184
-_020CFD90: .word 0x04000188
-
- arm_func_start PXI_IsCallbackReady
-PXI_IsCallbackReady:
- ldr r2, _020CFDB8 ; =0x027FFC00
- mov r3, #0x1
- add r1, r2, r1, lsl #0x2
- mov r2, r3, lsl r0
- ldr r0, [r1, #0x388]
- ands r0, r2, r0
- moveq r3, #0x0
- mov r0, r3
- bx lr
- .balign 4
-_020CFDB8: .word 0x027FFC00
-
- arm_func_start PXI_SetFifoRecvCallback
-PXI_SetFifoRecvCallback: ; 0x020CFDBC
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- mov r4, r0
- mov r5, r1
- bl OS_DisableInterrupts
- ldr r1, _020CFE20 ; =UNK_021D5368
- cmp r5, #0x0
- str r5, [r1, r4, lsl #0x2]
- beq _020CFDF8
- ldr r3, _020CFE24 ; =0x027FFC00
- mov r1, #0x1
- ldr r2, [r3, #0x388]
- orr r1, r2, r1, lsl r4
- str r1, [r3, #0x388]
- b _020CFE10
-_020CFDF8:
- ldr r3, _020CFE24 ; =0x027FFC00
- mov r1, #0x1
- mvn r1, r1, lsl r4
- ldr r2, [r3, #0x388]
- and r1, r2, r1
- str r1, [r3, #0x388]
-_020CFE10:
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020CFE20: .word UNK_021D5368
-_020CFE24: .word 0x027FFC00
-
- arm_func_start PXI_InitFifo
-PXI_InitFifo: ; 0x020CFE28
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- bl OS_DisableInterrupts
- ldr r1, _020CFF18 ; =UNK_021D5364
- mov r4, r0
- ldrh r0, [r1, #0x0]
- cmp r0, #0x0
- bne _020CFF04
- mov r2, #0x1
- ldr r0, _020CFF1C ; =0x027FFC00
- strh r2, [r1, #0x0]
- mov r2, #0x0
- str r2, [r0, #0x388]
- ldr r0, _020CFF20 ; =UNK_021D5368
- mov r1, r2
-_020CFE64:
- str r1, [r0, r2, lsl #0x2]
- add r2, r2, #0x1
- cmp r2, #0x20
- blt _020CFE64
- ldr r2, _020CFF24 ; =0x0000C408
- ldr r1, _020CFF28 ; =0x04000184
- mov r0, #0x40000
- strh r2, [r1, #0x0]
- bl OS_ResetRequestIrqMask
- ldr r1, _020CFF2C ; =PXIi_HandlerRecvFifoNotEmpty
- mov r0, #0x40000
- bl OS_SetIrqFunction
- mov r0, #0x40000
- bl OS_EnableIrqMask
- mov r12, #0x0
- ldr r3, _020CFF30 ; =0x04000180
- mov r1, r12
- mov r2, #0x3e8
-_020CFEAC:
- ldrh r0, [r3, #0x0]
- ands lr, r0, #0xf
- mov r0, lr, lsl #0x8
- strh r0, [r3, #0x0]
- bne _020CFEC8
- cmp r12, #0x4
- bgt _020CFF04
-_020CFEC8:
- ldrh r0, [r3, #0x0]
- mov r5, r2
- and r0, r0, #0xf
- cmp r0, lr
- bne _020CFEFC
-_020CFEDC:
- cmp r5, #0x0
- movle r12, r1
- ble _020CFEFC
- ldrh r0, [r3, #0x0]
- sub r5, r5, #0x1
- and r0, r0, #0xf
- cmp r0, lr
- beq _020CFEDC
-_020CFEFC:
- add r12, r12, #0x1
- b _020CFEAC
-_020CFF04:
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020CFF18: .word UNK_021D5364
-_020CFF1C: .word 0x027FFC00
-_020CFF20: .word UNK_021D5368
-_020CFF24: .word 0x0000C408
-_020CFF28: .word 0x04000184
-_020CFF2C: .word PXIi_HandlerRecvFifoNotEmpty
-_020CFF30: .word 0x04000180
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index c8a247ee..1ae31b7a 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -224,8 +224,6 @@ void CARD_UnlockBackup(u16 lock_id);
#define CARD_RETRY_COUNT_MAX 10
-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)
diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h
index 3d139079..c3812128 100644
--- a/arm9/lib/include/OS_interrupt.h
+++ b/arm9/lib/include/OS_interrupt.h
@@ -12,6 +12,7 @@
#define OS_IE_V_COUNT (1UL << REG_OS_IE_VE_SHIFT)
#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT)
+#define OS_IE_SPFIFO_RECV (1UL << REG_OS_IE_IFN_SHIFT)
#define OS_IE_CARD_DATA (1UL << REG_OS_IE_MC_SHIFT)
extern OSIrqFunction OS_IRQTable[];
diff --git a/arm9/lib/include/PXI_fifo.h b/arm9/lib/include/PXI_fifo.h
index becba32e..b1ca33f3 100644
--- a/arm9/lib/include/PXI_fifo.h
+++ b/arm9/lib/include/PXI_fifo.h
@@ -2,6 +2,7 @@
#define POKEDIAMOND_ARM9_PXI_FIFO_H
#include "nitro/PXI_fifo_shared.h"
+#include "nitro/types.h"
typedef enum
{
@@ -13,4 +14,23 @@ typedef enum
PXI_FIFO_NO_CALLBACK_ENTRY = -5
} PXIFifoStatus;
+typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err);
+
+typedef union
+{
+ struct
+ {
+ u32 tag:5;
+ u32 err:1;
+ u32 data:26;
+ } e;
+ u32 raw;
+} PXIFifoMessage;
+
+void PXI_InitFifo(void);
+void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback);
+BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc);
+s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err);
+void PXIi_HandlerRecvFifoNotEmpty(void);
+
#endif //POKEDIAMOND_ARM9_PXI_FIFO_H
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index 7c56a9a3..095a15df 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -35,8 +35,6 @@
#define HW_CACHE_LINE_SIZE 32
-#define PXI_PROC_ARM7 0x01
-
#define OSi_CONSOLE_NOT_DETECT 0xffffffff
#define OS_CONSOLE_NITRO 0x80000000
@@ -50,4 +48,11 @@
#define HW_CPU_CLOCK_ARM9 67027964
+#define REG_PXI_SUBP_FIFO_CNT_E_MASK 0x8000
+#define REG_PXI_SUBP_FIFO_CNT_ERR_MASK 0x4000
+#define REG_PXI_SUBP_FIFO_CNT_RECV_RI_MASK 0x0400
+#define REG_PXI_SUBP_FIFO_CNT_RECV_EMP_MASK 0x0100
+#define REG_PXI_SUBP_FIFO_CNT_SEND_CL_MASK 0x0008
+#define REG_PXI_SUBP_FIFO_CNT_SEND_FULL_MASK 0x0002
+
#endif //POKEDIAMOND_ARM9_CONSTS_H
diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h
index 44a21bf0..d55347d5 100644
--- a/arm9/lib/include/registers.h
+++ b/arm9/lib/include/registers.h
@@ -350,6 +350,7 @@
#define REG_OS_IE_VE_SHIFT 2
#define REG_OS_IE_T0_SHIFT 3
#define REG_OS_IE_T1_SHIFT 4
+#define REG_OS_IE_IFN_SHIFT 18
#define REG_OS_IE_MC_SHIFT 19
#define REG_OS_TM0CNT_H_I_MASK 0x0040
diff --git a/arm9/lib/src/CARD_common.c b/arm9/lib/src/CARD_common.c
index 65d92377..f820027e 100644
--- a/arm9/lib/src/CARD_common.c
+++ b/arm9/lib/src/CARD_common.c
@@ -14,8 +14,6 @@ static CARDiCommandArg cardi_arg ALIGN(32);
u8 cardi_thread_stack[0x400] ALIGN(4);
-extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-
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 27293d60..3456df48 100644
--- a/arm9/lib/src/CARD_pullOut.c
+++ b/arm9/lib/src/CARD_pullOut.c
@@ -12,9 +12,6 @@
static CARDPulledOutCallback CARD_UserCallback;
static BOOL CARDi_IsPulledOutFlag = FALSE;
-extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-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
index 2d728d14..098fe7a5 100644
--- a/arm9/lib/src/CARD_request.c
+++ b/arm9/lib/src/CARD_request.c
@@ -6,8 +6,6 @@
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)
diff --git a/arm9/lib/src/CARD_spi.c b/arm9/lib/src/CARD_spi.c
index 3a911333..5f02b276 100644
--- a/arm9/lib/src/CARD_spi.c
+++ b/arm9/lib/src/CARD_spi.c
@@ -1,6 +1,7 @@
#include "function_target.h"
#include "nitro/types.h"
#include "CARD_common.h"
+#include "CARD_spi.h"
#include "MI_memory.h"
extern CARDiCommon cardi_common;
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index 8be8fb33..45d2bb13 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -10,14 +10,11 @@
#include "MI_dma.h"
#include "CARD_common.h"
#include "PXI_init.h"
+#include "PXI_fifo.h"
static u16 OSi_IsInitReset = 0;
vu16 OSi_IsResetOccurred = 0;
-extern u32 PXI_IsCallbackReady(u32 param1, u32 param2);
-extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-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);
static void OSi_DoResetSystem(void);
diff --git a/arm9/lib/src/PXI_fifo.c b/arm9/lib/src/PXI_fifo.c
new file mode 100644
index 00000000..35db1c7f
--- /dev/null
+++ b/arm9/lib/src/PXI_fifo.c
@@ -0,0 +1,185 @@
+#include "function_target.h"
+#include "consts.h"
+#include "OS_interrupt.h"
+#include "OS_system.h"
+#include "PXI_fifo.h"
+#include "systemWork.h"
+
+static u16 FifoCtrlInit = 0;
+static PXIFifoCallback FifoRecvCallbackTable[PXI_MAX_FIFO_TAG];
+
+static inline PXIFifoStatus PXIi_SetToFifo(u32 data);
+
+ARM_FUNC void PXI_InitFifo(void)
+{
+ OSSystemWork *p = OS_GetSystemWork();
+ OSIntrMode enabled = OS_DisableInterrupts();
+ s32 i;
+
+ if (!FifoCtrlInit)
+ {
+ FifoCtrlInit = TRUE;
+
+ p->pxiHandleChecker[PXI_PROC_ARM9] = 0UL;
+
+ for (i = 0; i < PXI_MAX_FIFO_TAG; i++)
+ {
+ FifoRecvCallbackTable[i] = NULL;
+ }
+
+ reg_PXI_SUBP_FIFO_CNT = (REG_PXI_SUBP_FIFO_CNT_SEND_CL_MASK
+ | REG_PXI_SUBP_FIFO_CNT_RECV_RI_MASK | REG_PXI_SUBP_FIFO_CNT_E_MASK | REG_PXI_SUBP_FIFO_CNT_ERR_MASK);
+
+ (void)OS_ResetRequestIrqMask(OS_IE_SPFIFO_RECV);
+ (void)OS_SetIrqFunction(OS_IE_SPFIFO_RECV, PXIi_HandlerRecvFifoNotEmpty);
+ (void)OS_EnableIrqMask(OS_IE_SPFIFO_RECV);
+
+ {
+ s32 timeout;
+ s32 c;
+
+ for (i = 0; ; i++)
+ {
+ c = reg_PXI_SUBPINTF & 15;
+ reg_PXI_SUBPINTF = (u16)(c << 8);
+
+ if (c == 0 && i > 4)
+ {
+ break;
+ }
+
+ for (timeout = 1000; (reg_PXI_SUBPINTF & 15) == c; timeout--)
+ {
+ if (timeout == 0)
+ {
+ i = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback)
+{
+ OSSystemWork *p = OS_GetSystemWork();
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ FifoRecvCallbackTable[fifotag] = callback;
+ if (callback)
+ {
+ p->pxiHandleChecker[PXI_PROC_ARM9] |= (1UL << fifotag);
+ }
+ else
+ {
+ p->pxiHandleChecker[PXI_PROC_ARM9] &= ~(1UL << fifotag);
+ }
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc)
+{
+ OSSystemWork *p = OS_GetSystemWork();
+
+ return (p->pxiHandleChecker[proc] & (1UL << fifotag)) ? TRUE : FALSE;
+}
+
+ARM_FUNC s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err)
+{
+ PXIFifoMessage fifomsg;
+
+ fifomsg.e.tag = (PXIFifoTag)fifotag;
+ fifomsg.e.err = (u32)err;
+ fifomsg.e.data = data;
+
+ return PXIi_SetToFifo(fifomsg.raw);
+}
+
+static inline PXIFifoStatus PXIi_SetToFifo(u32 data)
+{
+ if (reg_PXI_SUBP_FIFO_CNT & REG_PXI_SUBP_FIFO_CNT_ERR_MASK)
+ {
+ reg_PXI_SUBP_FIFO_CNT |= (REG_PXI_SUBP_FIFO_CNT_E_MASK | REG_PXI_SUBP_FIFO_CNT_ERR_MASK);
+ return PXI_FIFO_FAIL_SEND_ERR;
+ }
+
+ OSIntrMode enabled = OS_DisableInterrupts();
+ if (reg_PXI_SUBP_FIFO_CNT & REG_PXI_SUBP_FIFO_CNT_SEND_FULL_MASK)
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return PXI_FIFO_FAIL_SEND_FULL;
+ }
+
+ reg_PXI_SEND_FIFO = data;
+ (void)OS_RestoreInterrupts(enabled);
+ return PXI_FIFO_SUCCESS;
+}
+
+static inline PXIFifoStatus PXIi_GetFromFifo(u32 *data_buf)
+{
+ if (reg_PXI_SUBP_FIFO_CNT & REG_PXI_SUBP_FIFO_CNT_ERR_MASK)
+ {
+ reg_PXI_SUBP_FIFO_CNT |= (REG_PXI_SUBP_FIFO_CNT_E_MASK | REG_PXI_SUBP_FIFO_CNT_ERR_MASK);
+ return PXI_FIFO_FAIL_RECV_ERR;
+ }
+
+ OSIntrMode enabled = OS_DisableInterrupts();
+ if (reg_PXI_SUBP_FIFO_CNT & REG_PXI_SUBP_FIFO_CNT_RECV_EMP_MASK)
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return PXI_FIFO_FAIL_RECV_EMPTY;
+ }
+
+
+ *data_buf = reg_PXI_RECV_FIFO;
+ (void)OS_RestoreInterrupts(enabled);
+
+ return PXI_FIFO_SUCCESS;
+}
+
+ARM_FUNC void PXIi_HandlerRecvFifoNotEmpty(void)
+{
+ PXIFifoMessage fifomsg;
+ PXIFifoStatus ret_code;
+ PXIFifoTag tag;
+
+ while (TRUE)
+ {
+ ret_code = PXIi_GetFromFifo(&fifomsg.raw);
+
+ if (ret_code == PXI_FIFO_FAIL_RECV_EMPTY)
+ {
+ break;
+ }
+ if (ret_code == PXI_FIFO_FAIL_RECV_ERR)
+ {
+ continue;
+ }
+
+ tag = (PXIFifoTag)fifomsg.e.tag;
+
+ if (tag)
+ {
+ if (FifoRecvCallbackTable[tag])
+ {
+ (FifoRecvCallbackTable[tag])(tag, fifomsg.e.data, (BOOL)fifomsg.e.err);
+ }
+ else
+ {
+ if (fifomsg.e.err)
+ {
+ }
+ else
+ {
+ fifomsg.e.err = TRUE;
+ (void)PXIi_SetToFifo(fifomsg.raw);
+ }
+ }
+ }
+ else
+ {
+ }
+ }
+}
diff --git a/arm9/lib/src/PXI_init.c b/arm9/lib/src/PXI_init.c
index f079ca3d..d70ca3b0 100644
--- a/arm9/lib/src/PXI_init.c
+++ b/arm9/lib/src/PXI_init.c
@@ -1,8 +1,7 @@
#include "PXI_init.h"
+#include "PXI_fifo.h"
#include "function_target.h"
-extern void PXI_InitFifo(void);
-
ARM_FUNC void PXI_Init(void)
{
PXI_InitFifo();
diff --git a/arm9/lib/src/SND_command.c b/arm9/lib/src/SND_command.c
index 130a4ebc..4ad80be5 100644
--- a/arm9/lib/src/SND_command.c
+++ b/arm9/lib/src/SND_command.c
@@ -18,11 +18,6 @@ static u32 sCurrentTag;
static u32 sFinishedTag;
static struct SNDCommand *sFreeList;
-// TODO remove these function declarations once they are in the headers
-extern s32 PXI_SendWordByFifo(u32, u32, u32);
-extern void PXI_SetFifoRecvCallback(u32, void (*)(s32, s32));
-extern BOOL PXI_IsCallbackReady(u32, u32);
-
static void InitPXI(void);
static void RequestCommandProc(void);
static struct SNDCommand *AllocCommand(void);
@@ -280,25 +275,25 @@ ARM_FUNC s32 SND_CountWaitingCommand(void) {
return SND_CMD_COUNT - SND_CountFreeCommand() - SND_CountReservedCommand();
}
-ARM_FUNC static void PxiFifoCallback(s32 a, s32 b) {
-#pragma unused (a)
+ARM_FUNC static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL) {
+#pragma unused (tag)
OSIntrMode oldirq = OS_DisableInterrupts();
- SNDi_CallAlarmHandler(b);
+ SNDi_CallAlarmHandler((s32)data);
(void)OS_RestoreInterrupts(oldirq);
}
ARM_FUNC static void InitPXI(void) {
- PXI_SetFifoRecvCallback(7, PxiFifoCallback);
+ PXI_SetFifoRecvCallback(PXI_FIFO_TAG_SOUND, PxiFifoCallback);
if (!IsCommandAvailable())
return;
- if (PXI_IsCallbackReady(7, 1))
+ if (PXI_IsCallbackReady(PXI_FIFO_TAG_SOUND, PXI_PROC_ARM7))
return;
do {
OS_SpinWait(100);
- } while (!PXI_IsCallbackReady(7, 1));
+ } while (!PXI_IsCallbackReady(PXI_FIFO_TAG_SOUND, PXI_PROC_ARM7));
}
ARM_FUNC static void RequestCommandProc(void) {
diff --git a/include/nitro/PXI_fifo_shared.h b/include/nitro/PXI_fifo_shared.h
index 2698e89d..297625a1 100644
--- a/include/nitro/PXI_fifo_shared.h
+++ b/include/nitro/PXI_fifo_shared.h
@@ -13,6 +13,12 @@
#ifndef POKEDIAMOND_PXI_FIFO_SHARED_H
#define POKEDIAMOND_PXI_FIFO_SHARED_H
+typedef enum
+{
+ PXI_PROC_ARM9 = 0,
+ PXI_PROC_ARM7 = 1
+} PXIProc;
+
typedef enum {
PXI_FIFO_TAG_EX = 0, // Extension format
PXI_FIFO_TAG_USER_0, // for application programmer, use it in free