diff options
Diffstat (limited to 'arm7/lib')
-rw-r--r-- | arm7/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm7/lib/include/OS_irqTable.h | 24 | ||||
-rw-r--r-- | arm7/lib/include/mmap.h | 4 | ||||
-rw-r--r-- | arm7/lib/src/OS_irqTable.c | 125 |
4 files changed, 152 insertions, 2 deletions
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h index 6b70d2d8..b4836234 100644 --- a/arm7/lib/include/OS_init.h +++ b/arm7/lib/include/OS_init.h @@ -11,6 +11,7 @@ #include "OS_spinLock.h" #include "OS_context.h" #include "OS_interrupt.h" +#include "OS_irqTable.h" #include "OS_timer.h" #include "OS_tick.h" diff --git a/arm7/lib/include/OS_irqTable.h b/arm7/lib/include/OS_irqTable.h new file mode 100644 index 00000000..523b96ae --- /dev/null +++ b/arm7/lib/include/OS_irqTable.h @@ -0,0 +1,24 @@ +#ifndef POKEDIAMOND_ARM7_OS_IRQTABLE_H +#define POKEDIAMOND_ARM7_OS_IRQTABLE_H + +#include "consts.h" +#include "OS_interrupt.h" + +void OS_IrqDummy(void); +void OSi_IrqCallback(s32 index); +void OSi_IrqDma0(void); +void OSi_IrqDma1(void); +void OSi_IrqDma2(void); +void OSi_IrqDma3(void); +void OSi_IrqTimer0(void); +void OSi_IrqTimer1(void); +void OSi_IrqTimer2(void); +void OSi_IrqTimer3(void); +void OSi_IrqVBlank(void); + +static inline void OS_SetIrqCheckFlag(OSIrqMask intr) +{ + *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr; +} + +#endif //POKEDIAMOND_ARM7_OS_IRQTABLE_H diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h index f43b4bc4..12558eeb 100644 --- a/arm7/lib/include/mmap.h +++ b/arm7/lib/include/mmap.h @@ -9,7 +9,6 @@ #define HW_PRV_WRAM_SIZE (HW_PRV_WRAM_END-HW_PRV_WRAM) -#define HW_SVC_STACK_SIZE 0x40 #define HW_PRV_WRAM_SYSRV_SIZE 0x40 #define HW_MAIN_MEM_SUB_SIZE (HW_MAIN_MEM_SIZE - HW_MAIN_MEM_MAIN_SIZE - HW_MAIN_MEM_SHARED_SIZE) @@ -23,8 +22,9 @@ #define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE) +#define HW_INTR_CHECK_BUF (HW_PRV_WRAM_SYSRV + 0x38) + #define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c) -#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007FFFA8) #define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8) #endif //POKEDIAMOND_ARM7_MMAP_H diff --git a/arm7/lib/src/OS_irqTable.c b/arm7/lib/src/OS_irqTable.c new file mode 100644 index 00000000..91c08b2e --- /dev/null +++ b/arm7/lib/src/OS_irqTable.c @@ -0,0 +1,125 @@ +#include "nitro/types.h" +#include "function_target.h" +#include "OS_irqTable.h" + +OSIrqFunction OS_IRQTable[25] = { + OSi_IrqVBlank, + OS_IrqDummy, + OS_IrqDummy, + OSi_IrqTimer0, + OSi_IrqTimer1, + OSi_IrqTimer2, + OSi_IrqTimer3, + OS_IrqDummy, + OSi_IrqDma0, + OSi_IrqDma1, + OSi_IrqDma2, + OSi_IrqDma3, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy, + OS_IrqDummy +}; + +OSIrqCallbackInfo OSi_IrqCallbackInfo[9] = { + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0} +}; + +static u16 OSi_IrqCallbackInfoIndex[9] = { + 8, 9, 10, 11, 3, 4, 5, 6, 0 +}; + +ARM_FUNC void OS_IrqDummy(void) +{ + //do nothing +} + +ARM_FUNC void OSi_IrqCallback(s32 index) +{ + OSIrqMask imask = (1UL << OSi_IrqCallbackInfoIndex[index]); + void (*callback) (void *) = OSi_IrqCallbackInfo[index].func; + + OSi_IrqCallbackInfo[index].func = NULL; + + if (callback) + { + (callback)(OSi_IrqCallbackInfo[index].arg); + } + + OS_SetIrqCheckFlag(imask); + + if (!OSi_IrqCallbackInfo[index].enable) + { + (void)OS_DisableIrqMask(imask); + } +} + +ARM_FUNC void OSi_IrqDma0(void) +{ + OSi_IrqCallback(0); +} + +ARM_FUNC void OSi_IrqDma1(void) +{ + OSi_IrqCallback(1); +} + +ARM_FUNC void OSi_IrqDma2(void) +{ + OSi_IrqCallback(2); +} +ARM_FUNC void OSi_IrqDma3(void) +{ + OSi_IrqCallback(3); +} + +ARM_FUNC void OSi_IrqTimer0(void) +{ + OSi_IrqCallback(4); +} + +ARM_FUNC void OSi_IrqTimer1(void) +{ + OSi_IrqCallback(5); +} + +ARM_FUNC void OSi_IrqTimer2(void) +{ + OSi_IrqCallback(6); +} + +ARM_FUNC void OSi_IrqTimer3(void) +{ + OSi_IrqCallback(7); +} + +ARM_FUNC void OSi_IrqVBlank(void) +{ + void (*callback) (void) = (void (*)(void))OSi_IrqCallbackInfo[8].func; + + (*(u32 *)HW_VBLANK_COUNT_BUF)++; + + if (callback) + { + (callback)(); + } + + OS_SetIrqCheckFlag(1UL << 0); +} |