CTAOS v3
This commit is contained in:
56
SysCore/hal/pit/pit.c
Normal file
56
SysCore/hal/pit/pit.c
Normal file
@ -0,0 +1,56 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user