From be09adbcb7e47bbc0ccc3994fe405b72cf2a59c6 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 7 May 2020 19:16:27 +0100 Subject: partial OS_interrupt --- arm9/lib/src/OS_interrupt.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 arm9/lib/src/OS_interrupt.c (limited to 'arm9/lib/src/OS_interrupt.c') diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c new file mode 100644 index 00000000..ff27a3ad --- /dev/null +++ b/arm9/lib/src/OS_interrupt.c @@ -0,0 +1,69 @@ +// +// 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; + +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; +} \ No newline at end of file -- cgit v1.2.3 From dc5e4e927b1f87f69246af218e462bc09c87dda6 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 7 May 2020 19:20:31 +0100 Subject: newline --- arm9/lib/src/OS_interrupt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arm9/lib/src/OS_interrupt.c') diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c index ff27a3ad..d45f46cf 100644 --- a/arm9/lib/src/OS_interrupt.c +++ b/arm9/lib/src/OS_interrupt.c @@ -66,4 +66,4 @@ ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { i++; } while (i < 0x16); return 0; -} \ No newline at end of file +} -- cgit v1.2.3 From 4d444cabe0a241afd7d12e565c6a32f866b260bd Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 8 May 2020 01:12:38 +0100 Subject: match OSi_EnterDmaCallback --- arm9/lib/src/OS_interrupt.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'arm9/lib/src/OS_interrupt.c') diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c index d45f46cf..f7a6d005 100644 --- a/arm9/lib/src/OS_interrupt.c +++ b/arm9/lib/src/OS_interrupt.c @@ -10,6 +10,7 @@ #pragma optimize_for_size on extern OSThreadQueue OSi_IrqThreadQueue; +extern OSIrqMask OS_EnableIrqMask(OSIrqMask intr); ARM_FUNC void OS_InitIrqTable() { OS_InitThreadQueue(&OSi_IrqThreadQueue); @@ -67,3 +68,12 @@ ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { } 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; +} -- cgit v1.2.3