diff options
Diffstat (limited to 'kernel/timer.c')
| -rw-r--r-- | kernel/timer.c | 24 |
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 = ¤t_tick_data; +volatile const uint64_t *current_tick = ¤t_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); } |