Commit 46c608f0 by malcolm

Preliminary PIT added, needs IDT install

parent fd304617
Showing with 122 additions and 0 deletions
#include "pit.h"
#include "pic.h"
static volatile uint32_t _pit_ticks = 0;
static bool _pit_is_init = false;
void pit_irq()
{
asm volatile ("add %esp, 12; pushad");
_pit_ticks++;
//TODO: NEED TO SEND DONE MESSAGE BACK
asm volatile("popad; iretd");
}
void pit_command(uint8_t cmd)
{
outb(PIC_REG_COMD, cmd);
}
void pit_write(uint16_t data, uint8_t counter)
{
uint16_t port= (counter == PIT_OCW_CONT_0) ? PIT_REG_CONT_0 :
((counter == PIT_OCW_CONT_1) ? PIT_REG_CONT_1 : PIT_REG_CONT_2);
outb(port, (uint8_t)data);
}
uint8_t pit_read(uint16_t counter)
{
uint16_t port= (counter == PIT_OCW_CONT_0) ? PIT_REG_CONT_0 :
((counter == PIT_OCW_CONT_1) ? PIT_REG_CONT_1 : PIT_REG_CONT_2);
return inb(port);
}
uint32_t pit_set_tick(uint32_t i)
{
uint32_t ret = _pit_ticks;
_pit_ticks = i;
return ret;
}
uint32_t pit_get_tick()
{
return _pit_ticks;
}
void pit_start_counter(uint32_t frequency, uint8_t counter, uint8_t mode)
{
if(freq == 0)
{
return;
}
uint16_t div = (uint16_t)(1193181 / (uint16_t)freq);
uint8_t ocw = 0;
ocw = (ocw & ~PIT_OCW_MODE) | mode;
ocw = (ocw & ~PIT_OCW_RL) | PIT_OCW_RL_DATA;
ocw = (ocw & ~PIT_OCW_CONT) | counter;
pit_command(ocw);
pit_write(div & 0xFF, 0);
pit_write((div >> 8)& 0xFF, 0);
_pit_ticks = 0;
}
void pit_init();
{
//TODO: NEED TO SET INT 32 TO PIT IRQ HANDLER
_pit_is_init = true;
}
bool pit_is_init()
{
return _pit_is_init;
}
#ifndef _PIT_INC
#define _PIT_INC
#include <stdint.h>
//OCW masks
#define PIT_OCW_BINC 0x01
#define PIT_OCW_MODE 0x0E
#define PIT_OCW_RL 0x30
#define PIT_OCW_CONT 0xC0
//OCW control bits
#define PIT_OCW_BINC_BIN 0x0
#define PIT_OCW_BINC_BCD 0x1
#define PIT_OCW_MODE_TERMCNT 0x0
#define PIT_OCW_MODE_ONESHOT 0x2
#define PIT_OCW_MODE_RATEGEN 0x4
#define PIT_OCW_MODE_SQWVGEN 0x6
#define PIT_OCW_MODE_SOFTTRG 0x8
#define PIT_OCW_MODE_HARDTRG 0xA
#define PIT_OCW_RL_LATH 0x00
#define PIT_OCW_RL_LSB 0x10
#define PIT_OCW_RL_MSB 0x20
#define PIT_OCW_RL_DATA 0x30
#define PIT_OCW_CONT_0 0x00
#define PIT_OCW_CONT_1 0x40
#define PIT_OCW_CONT_2 0x80
#define PIT_REG_CONT_0 0x40
#define PIT_REG_CONT_1 0x41
#define PIT_REG_CONT_2 0x42
#define PIT_REG_COMD 0x43
void pit_command(uint8_t cmd);
void pit_write(uint16_t data, uint8_t counter);
uint8_t pit_read(uint16_t counter);
uint32_t pit_set_tick(uint32_t i);
uint32_t pit_get_tick();
void pit_start_counter(uint32_t frequency, uint8_t counter, uint8_t mode);
void pit_init();
bool pit_is_init();
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment