diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-07-28 12:21:45 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-07-28 12:21:45 -0400 |
commit | 22c2ecce6e0f920b9bdc0b6e9ca40d0f426b84b8 (patch) | |
tree | abde28c36ffc10b95e36075d8ebd35dc501f9d8f /arm7/lib | |
parent | c58dec395fd3233bc329b4380841228370b1fb1c (diff) | |
parent | 3aeabb3efb6e7b40de1350550ddf0e347f51908b (diff) |
Merge branch 'master' of github.com:pret/pokediamond into pikalax_work
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/OS_thread.h | 11 | ||||
-rw-r--r-- | arm7/lib/include/mmap.h | 4 | ||||
-rw-r--r-- | arm7/lib/src/OS_irqTable.c | 125 | ||||
-rw-r--r-- | arm7/lib/src/OS_thread.c | 12 |
6 files changed, 164 insertions, 13 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/OS_thread.h b/arm7/lib/include/OS_thread.h index b1d3a01b..701acc94 100644 --- a/arm7/lib/include/OS_thread.h +++ b/arm7/lib/include/OS_thread.h @@ -4,20 +4,10 @@ #include "OS_context.h" #include "nitro/OS_thread_shared.h" -static s32 OSi_GetUnusedThreadId(void); -static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread); -static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue); -static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread); OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue); -static void OSi_InsertThreadToList(OSThread *thread); -static void OSi_RemoveThreadFromList(OSThread *thread); -static void OSi_RescheduleThread(void); void OS_InitThread(void); void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio); void OS_ExitThread(void); -static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg); -static void OSi_ExitThread(void *arg); -static void OSi_ExitThread_Destroy(void); void OS_JoinThread(OSThread *thread); BOOL OS_IsThreadTerminated(const OSThread *thread); void OS_SleepThread(OSThreadQueue *queue); @@ -27,7 +17,6 @@ OSThread *OS_SelectThread(void); void OS_RescheduleThread(void); BOOL OS_SetThreadPriority(OSThread *thread, u32 prio); void OS_Sleep(u32 msec); -static void OSi_SleepAlarmCallback(void *arg); OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback); u32 OS_DisableScheduler(void); u32 OS_EnableScheduler(void); 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); +} diff --git a/arm7/lib/src/OS_thread.c b/arm7/lib/src/OS_thread.c index be3f611d..6db0b4f7 100644 --- a/arm7/lib/src/OS_thread.c +++ b/arm7/lib/src/OS_thread.c @@ -29,6 +29,18 @@ static s32 OSi_ThreadIdCount = 0; OSThread OSi_LauncherThread; OSThread OSi_IdleThread; +static s32 OSi_GetUnusedThreadId(void); +static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread); +static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue); +static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread); +static void OSi_InsertThreadToList(OSThread *thread); +static void OSi_RemoveThreadFromList(OSThread *thread); +static void OSi_RescheduleThread(void); +static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg); +static void OSi_ExitThread(void *arg); +static void OSi_ExitThread_Destroy(void); +static void OSi_SleepAlarmCallback(void *arg); + ARM_FUNC static s32 OSi_GetUnusedThreadId(void) { return ++OSi_ThreadIdCount; |