summaryrefslogtreecommitdiff
path: root/arm7/lib/src
diff options
context:
space:
mode:
authorEgor Ananyin <ananinegor@gmail.com>2020-06-24 20:19:35 +0300
committerEgor Ananyin <ananinegor@gmail.com>2020-06-24 20:19:35 +0300
commitea1fc9a0c36fea36cc5eced2316b321735ed1aa5 (patch)
tree1f66b69d27f626151c57b852a9cc649eaf13c56d /arm7/lib/src
parentce09e79eb9ca2b384fb1c64f0946661b30ae75ea (diff)
OS_tick done
Diffstat (limited to 'arm7/lib/src')
-rw-r--r--arm7/lib/src/OS_tick.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/arm7/lib/src/OS_tick.c b/arm7/lib/src/OS_tick.c
new file mode 100644
index 00000000..063b05c9
--- /dev/null
+++ b/arm7/lib/src/OS_tick.c
@@ -0,0 +1,53 @@
+#include "OS_interrupt.h"
+#include "OS_system.h"
+#include "OS_tick.h"
+#include "function_target.h"
+
+extern void OSi_SetTimerReserved(u32);
+
+static u16 OSi_UseTick;
+static u64 OSi_TickCounter;
+static BOOL OSi_NeedResetTimer;
+
+ARM_FUNC void OS_InitTick(void) {
+ if (OSi_UseTick == 0) {
+ OSi_UseTick = 1;
+ OSi_SetTimerReserved(0);
+ OSi_TickCounter = 0;
+ OS_SetTimerControl(OS_TIMER_0, 0);
+ OS_SetTimerCount(OS_TIMER_0, 0);
+ OS_SetTimerControl(OS_TIMER_0, 0xc1);
+ OS_SetIrqFunction(8, OSi_CountUpTick);
+ (void)OS_EnableIrqMask(8);
+ OSi_NeedResetTimer = 0;
+ }
+}
+
+ARM_FUNC u16 OS_IsTickAvailable(void) {
+ return OSi_UseTick;
+}
+
+ARM_FUNC void OSi_CountUpTick(void) {
+ OSi_TickCounter++;
+ if (OSi_NeedResetTimer != 0) {
+ OS_SetTimerControl(OS_TIMER_0, 0);
+ OS_SetTimerCount(OS_TIMER_0, 0);
+ OS_SetTimerControl(OS_TIMER_0, 0xc1);
+ OSi_NeedResetTimer = 0;
+ }
+ OSi_EnterTimerCallback(0, (void(*)(void*))OSi_CountUpTick, NULL);
+}
+
+ARM_FUNC u64 OS_GetTick(void) {
+ OSIntrMode prev = OS_DisableInterrupts();
+ vu16 countL = *(REGType16 *)((u32)&reg_OS_TM0CNT_L + OS_TIMER_0 * 4);
+ vu64 countH = OSi_TickCounter & 0xffffffffffffULL;
+
+ if (reg_OS_IF & 8 && !(countL & 0x8000)) {
+ countH++;
+ }
+
+ (void)OS_RestoreInterrupts(prev);
+
+ return (countH << 16) | countL;
+}