diff options
author | red031000 <rubenru09@aol.com> | 2020-06-12 16:10:14 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-06-12 16:11:17 +0100 |
commit | 9d8999e6ddb6e930419de6aca71983dea7fc8f75 (patch) | |
tree | c89b2718080dcc86486a9b042030a0ca2d9f7c5f /arm9/lib | |
parent | e2d7f9f796889087a3da50f7eeb2383731ca3262 (diff) |
arm9 OS_irqTable
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_irqTable.h | 23 | ||||
-rw-r--r-- | arm9/lib/src/OS_irqTable.c | 110 |
3 files changed, 134 insertions, 0 deletions
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index baa2f442..3c8aea24 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -19,6 +19,7 @@ #include "OS_system.h" #include "OS_terminate_proc.h" #include "OS_irqHandler.h" +#include "OS_irqTable.h" #include "OS_interrupt.h" #include "OS_reset.h" #include "OS_spinLock.h" diff --git a/arm9/lib/include/OS_irqTable.h b/arm9/lib/include/OS_irqTable.h new file mode 100644 index 00000000..8cd7b7b3 --- /dev/null +++ b/arm9/lib/include/OS_irqTable.h @@ -0,0 +1,23 @@ +#ifndef POKEDIAMOND_OS_IRQTABLE_H +#define POKEDIAMOND_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); + +static inline void OS_SetIrqCheckFlag(OSIrqMask intr) +{ + *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr; +} + +#endif //POKEDIAMOND_OS_IRQTABLE_H diff --git a/arm9/lib/src/OS_irqTable.c b/arm9/lib/src/OS_irqTable.c new file mode 100644 index 00000000..cc2a3a55 --- /dev/null +++ b/arm9/lib/src/OS_irqTable.c @@ -0,0 +1,110 @@ +#include "function_target.h" +#include "sections.h" +#include "OS_irqTable.h" + +#pragma section DTCM begin +OSIrqFunction OS_IRQTable[22] = { + OS_IrqDummy, + 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 +}; +#pragma section DTCM end + +OSIrqCallbackInfo OSi_IrqCallbackInfo[8] = { + {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[8] = { + 8, 9, 10, 11, 3, 4, 5, 6 +}; + +ARM_FUNC void OS_IrqDummy(void) +{ + //noop +} + +ARM_FUNC void OSi_IrqCallback(s32 index) +{ + OSIrqMask mask = (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(mask); + + if (!OSi_IrqCallbackInfo[index].enable) + { + (void)OS_DisableIrqMask(mask); + } +} + +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); +} |