summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib')
-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
13 files changed, 223 insertions, 28 deletions
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) {