#include #include #include "../irq/irq.h" #include "pit.h" volatile unsigned int _pit_ticks = 0; volatile unsigned int _pit_frequency = 0; unsigned char _pit_init = 0; volatile TIME _internal_clock; void i86_pit_set_frequency(int frequency) { int divisor = 1193180/frequency; // Calculate the divisor outportb(0x43, 0x36); // Set our command byte 0x36 outportb(0x40, divisor&0xFF); // Set low byte outportb(0x40, divisor>>8); // Set high byte _pit_frequency = frequency; } void i86_pit_handler(ISR_stack_regs *r) { _pit_ticks++; // count tick if (_pit_ticks % _pit_frequency == 0) _CLOCK_INC((TIME*)&_internal_clock); // update internal clock } unsigned int i86_pit_set_tick_count(unsigned int i) { unsigned int r = _pit_ticks; _pit_ticks = i; return r; } unsigned int i86_pit_get_tick_count() { return _pit_ticks; } unsigned int i86_pit_get_frequency() { return _pit_frequency; } void i86_pit_install(int freq) { i86_irq_install_handler(0, i86_pit_handler); i86_pit_set_frequency(freq); _pit_ticks = 0; _pit_init = 1; } unsigned char i86_pit_is_initialized() { return _pit_init; }