aboutsummaryrefslogtreecommitdiff
path: root/kernel/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/timer.c')
-rw-r--r--kernel/timer.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index 571fcbe..2fbd8eb 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1,10 +1,11 @@
#include <stdint.h>
+#include "io.h"
#include "isr.h"
#include "timer.h"
-uint64_t current_tick_data = 0;
+volatile uint64_t current_tick_data = 0;
-const uint64_t *current_tick = &current_tick_data;
+volatile const uint64_t *current_tick = &current_tick_data;
static void timer_callback(struct regs_t regs)
{
@@ -12,7 +13,24 @@ static void timer_callback(struct regs_t regs)
++current_tick_data;
}
-void timer_init(void)
+void timer_init(uint32_t freq)
{
set_interrupt_handler(IRQ(0), timer_callback);
+
+ current_tick_data = 0;
+
+ uint32_t divisor = PIT_FREQ / freq;
+
+ uint8_t hi = (divisor >> 8) & 0xFF;
+ uint8_t lo = (divisor >> 0) & 0xFF;
+
+ outb(0x43, 0x36);
+ outb(0x40, lo);
+ outb(0x40, hi);
+}
+
+void timer_delay(uint64_t ticks)
+{
+ uint64_t end = *current_tick + ticks;
+ while(*current_tick <= end);
}