diff options
author | Revo <projectrevotpp@hotmail.com> | 2020-05-08 10:44:07 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-08 10:44:07 -0400 |
commit | f76cec09f8a2995244256d4b097d9eed2bebd34a (patch) | |
tree | d3a3270ca2c2f3895378d1681350bc7636ed0c10 /arm9/lib | |
parent | df51b3c4ff11fc6302600298d3f18681101196b1 (diff) | |
parent | 4d444cabe0a241afd7d12e565c6a32f866b260bd (diff) |
Merge pull request #70 from red031000/master
OS_terminate_proc and partial OS_interrupt
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/OS_init.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/OS_interrupt.h | 29 | ||||
-rw-r--r-- | arm9/lib/include/OS_terminate_proc.h | 11 | ||||
-rw-r--r-- | arm9/lib/include/OS_thread.h | 13 | ||||
-rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_interrupt.c | 79 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 4 | ||||
-rw-r--r-- | arm9/lib/src/OS_terminate_proc.c | 21 |
8 files changed, 157 insertions, 3 deletions
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index 0c74035d..dd2b20c7 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -16,6 +16,8 @@ #include "OS_arena.h" #include "OS_alloc.h" #include "OS_system.h" +#include "OS_terminate_proc.h" +#include "OS_interrupt.h" #include "OS_reset.h" void OS_Init(); diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h new file mode 100644 index 00000000..b8425b4e --- /dev/null +++ b/arm9/lib/include/OS_interrupt.h @@ -0,0 +1,29 @@ +// +// Created by red031000 on 2020-05-07. +// + +#ifndef POKEDIAMOND_OS_INTERRUPT_H +#define POKEDIAMOND_OS_INTERRUPT_H + +#include "types.h" + +typedef void (*OSIrqFunction) (void); + +typedef struct +{ + void (*func) (void *); + u32 enable; + void* arg; +} OSIrqCallbackInfo; + +typedef u32 OSIrqMask; + +extern OSIrqFunction OS_IRQTable[]; +extern OSIrqCallbackInfo OSi_IrqCallbackInfo[7+1]; + +void OS_InitIrqTable(); +void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function); +OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit); +void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg); + +#endif //POKEDIAMOND_OS_INTERRUPT_H diff --git a/arm9/lib/include/OS_terminate_proc.h b/arm9/lib/include/OS_terminate_proc.h new file mode 100644 index 00000000..26741e5d --- /dev/null +++ b/arm9/lib/include/OS_terminate_proc.h @@ -0,0 +1,11 @@ +// +// Created by red031000 on 2020-05-07. +// + +#ifndef POKEDIAMOND_OS_TERMINATE_PROC_H +#define POKEDIAMOND_OS_TERMINATE_PROC_H + +void OS_Terminate(); +void OS_Halt(); + +#endif //POKEDIAMOND_OS_TERMINATE_PROC_H diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h index 4fb70bf7..49ae9f15 100644 --- a/arm9/lib/include/OS_thread.h +++ b/arm9/lib/include/OS_thread.h @@ -7,6 +7,14 @@ typedef struct _OSThread OSThread; +struct _OSThreadQueue +{ + OSThread *head; + OSThread *tail; +}; + +typedef struct _OSThreadQueue OSThreadQueue; + typedef struct OSThreadInfo { u16 isNeedRescheduling; u16 irqDepth; @@ -20,4 +28,9 @@ struct _OSThread u8 padding[0x80]; //todo: not the correct size but idfk }; +static inline void OS_InitThreadQueue(OSThreadQueue * queue) +{ + queue->head = queue->tail = NULL; +} + #endif //POKEDIAMOND_OS_THREAD_H diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c index e2658421..7467c672 100644 --- a/arm9/lib/src/OS_init.c +++ b/arm9/lib/src/OS_init.c @@ -7,7 +7,6 @@ extern void PXI_Init(); extern void OS_InitLock(); -extern void OS_InitIrqTable(); extern void OS_SetIrqStackChecker(); extern void OS_InitException(); extern void MI_Init(); diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c new file mode 100644 index 00000000..f7a6d005 --- /dev/null +++ b/arm9/lib/src/OS_interrupt.c @@ -0,0 +1,79 @@ +// +// Created by red031000 on 2020-05-07. +// + +#include "consts.h" +#include "function_target.h" +#include "OS_interrupt.h" +#include "OS_thread.h" + +#pragma optimize_for_size on + +extern OSThreadQueue OSi_IrqThreadQueue; +extern OSIrqMask OS_EnableIrqMask(OSIrqMask intr); + +ARM_FUNC void OS_InitIrqTable() { + OS_InitThreadQueue(&OSi_IrqThreadQueue); +} + +ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) { + s32 i; + OSIrqCallbackInfo *info; + + for (i = 0; i < 0x16; i++) { + if (intrBit & 1) { + info = NULL; + + if (8 <= i && i <= 11) { + info = &OSi_IrqCallbackInfo[i - 8]; + } + else if (3 <= i && i <= 6) { + info = &OSi_IrqCallbackInfo[i - 3 + 4]; + } + else { + OS_IRQTable[i] = function; + } + + if (info) { + info->func = (void (*)(void *))function; + info->arg = 0; + info->enable = TRUE; + } + } + intrBit >>= 1; + } +} + +ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { + s32 i = 0; + OSIrqFunction *funcPtr = &OS_IRQTable[0]; + + do { + if (intrBit & 1) + { + if (8 <= i && i <= 11) { + i = i - 8; + return (void (*)(void))OSi_IrqCallbackInfo[i].func; + } + else if (3 <= i && i <= 6) { + i++; + return (void (*)(void))OSi_IrqCallbackInfo[i].func; + } + + return *funcPtr; + } + intrBit >>= 1; + funcPtr++; + i++; + } while (i < 0x16); + return 0; +} + +ARM_FUNC void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg) +{ + OSIrqMask mask = 1UL << (dmaNo + 8); + OSi_IrqCallbackInfo[dmaNo].func = callback; + OSi_IrqCallbackInfo[dmaNo].arg = arg; + + OSi_IrqCallbackInfo[dmaNo].enable = OS_EnableIrqMask(mask) & mask; +} diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index b12703da..28d815a9 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -5,20 +5,20 @@ #include "function_target.h" #include "OS_reset.h" #include "MB_mb.h" +#include "OS_terminate_proc.h" extern u16 OSi_IsInitReset; extern vu16 OSi_IsResetOccurred; extern void PXI_Init(); extern u32 PXI_IsCallbackReady(u32 param1, u32 param2); extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); -extern void OS_Terminate(); extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); extern void CARD_LockRom(u16 lockId); extern u32 OS_GetLockID(); extern void MI_StopDma(u32 dma); extern void OS_SetIrqMask(u32 mask); extern void OS_ResetRequestIrqMask(u32 mask); -extern void OSi_DoResetSystem(); +extern void OSi_DoResetSystem(); //in itcm, should technically be in this file ARM_FUNC void OS_InitReset() { if (OSi_IsInitReset) { diff --git a/arm9/lib/src/OS_terminate_proc.c b/arm9/lib/src/OS_terminate_proc.c new file mode 100644 index 00000000..eb267c6b --- /dev/null +++ b/arm9/lib/src/OS_terminate_proc.c @@ -0,0 +1,21 @@ +// +// Created by red031000 on 2020-05-07. +// + +#include "types.h" +#include "OS_terminate_proc.h" +#include "function_target.h" +#include "OS_system.h" + +ARM_FUNC void OS_Terminate() { + while (TRUE) { + (void)OS_DisableInterrupts(); + OS_Halt(); + } +} + +ARM_FUNC asm void OS_Halt() { + mov r0, #0x0 + mcr p15, 0x0, r0, c7, c0, 0x4 + bx lr +} |