diff options
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); +} | 
