CeDOS - src/kernel/pit.c

src/kernel/pit.c (view raw)

#include "cedos/pit.h"
#include "assembly.h"
#include "cedos/pic.h"

#define PIT_ACCESS_MODE_LO_HI (0b11 << 4)
#define PIT_COMMAND_PORT ((uint16_t)0x43)

void pit_setup_channel(PIT_CHANNEL channel, PIT_MODE mode, uint16_t freq_div) {
    pushf();
    cli();
    outb(((uint8_t)channel << 6) | PIT_ACCESS_MODE_LO_HI | (uint8_t)mode, PIT_COMMAND_PORT);
    nop(); nop(); nop(); nop();

    outb((uint8_t)(freq_div & 0xFF), 0x40 + (uint16_t)channel);
    nop(); nop(); nop(); nop();
    
    outb((uint8_t)(freq_div >> 8), 0x40 + (uint16_t)channel);
    popf();
}

int pit_init(void) {
    return 1;
}