57 lines
1.3 KiB
C
57 lines
1.3 KiB
C
#include <system.h>
|
|
#include <time.h>
|
|
#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;
|
|
}
|