blob: 2c05167eca3ce175e28170e234462018e903f5d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <stdint.h>
#include <stdio.h>
#include "io.h"
#include "isr.h"
#include "timer.h"
volatile uint64_t current_tick_data = 0;
volatile const uint64_t *current_tick = ¤t_tick_data;
static void timer_callback(struct regs_t *regs)
{
(void) regs;
++current_tick_data;
}
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)
{
asm("sti");
asm("hlt");
}
}
|