diff --git a/include/pic/timer.h b/include/pic/timer.h index be1cc54..0091d5e 100644 --- a/include/pic/timer.h +++ b/include/pic/timer.h @@ -34,4 +34,8 @@ union { void init_timer(); +double get_uptime(); + +void sleep(double seconds); + #endif diff --git a/src/pic/timer.c b/src/pic/timer.c index d8e698c..98b5fba 100644 --- a/src/pic/timer.c +++ b/src/pic/timer.c @@ -1,30 +1,45 @@ - #include #include #include -int i = 0; -int j = 0; -void timer(struct interrupt_frame *frame) { - return; +unsigned long ticks; // The amount of ticks that have passed +int hz; // Self-Explanitory + +// Timer callback +void timer(struct interrupt_frame * frame) { + ticks++; + return; +} + +void sleep(double seconds) { + double to_wait = seconds + get_uptime(); + while(to_wait != get_uptime()); } -void set_timer_phase(int hz) { - PIT_8254 cmd; - cmd.BCD = BCD_16_BIT; - cmd.mode = MODE_SQR_WAVE; - cmd.RW = RW_READ | RW_WRITE; - cmd.CNTR = 0; - - outb(PIT_CMD, cmd.cmd); - int divisor = 1193180 / hz; - outb(PIT_CH0, divisor & 0xff); - outb(PIT_CH0, divisor >> 8); +// Returns how many seconds the computer was awake +double get_uptime() { + return ticks * (1 / hz); +} + +void set_timer_phase() { + PIT_8254 cmd; + cmd.BCD = BCD_16_BIT; + cmd.mode = MODE_SQR_WAVE; + cmd.RW = RW_READ | RW_WRITE; + cmd.CNTR = 0; + + outb(PIT_CMD, cmd.cmd); + int divisor = 1193180 / hz; + outb(PIT_CH0, divisor & 0xff); + outb(PIT_CH0, divisor >> 8); } void init_timer() { - set_timer_phase(20); + hz = 20; + secs = 0; + ticks = 0; + set_timer_phase(); - set_interrupt_handler(0x20, &timer); - outb(PIC1_DATA, inb(PIC1_DATA)&~0x01); + set_interrupt_handler(0x20, & timer); + outb(PIC1_DATA, inb(PIC1_DATA) & ~0x01); }