diff --git a/kernel/arch/idt/idt.c b/kernel/arch/idt/idt.c index 52cecff..1517301 100644 --- a/kernel/arch/idt/idt.c +++ b/kernel/arch/idt/idt.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -16,8 +17,7 @@ static idtr_t idtr; static bool vectors[IDT_MAX_DESCRIPTORS]; -extern struct keyboard_state keyb_state; - +extern struct pit_state pit; #define EXTERNAL_BIT (0x1) @@ -229,6 +229,10 @@ void exception_handler(struct cpu_state __attribute__((unused)) cpu, uint32_t in /** EXCEPTIONS END **/ /** PIC BEGIN **/ + case PIC_PIT: + pit.interrupts++; + PIC_sendEOI(0); + break; case PIC_KEYB: inbyte = inb(0x60); do_keypress(decode_scancode(inbyte)); @@ -276,6 +280,7 @@ void idt_init(void) PIC_remap(0x20, 0x28); pic_disable(); // mask everything + IRQ_clear_mask(0); IRQ_clear_mask(1); __asm__ volatile("sti"); // set the interrupt flag diff --git a/kernel/arch/io/pit.c b/kernel/arch/io/pit.c index 67be0f3..540fba6 100644 --- a/kernel/arch/io/pit.c +++ b/kernel/arch/io/pit.c @@ -61,4 +61,15 @@ void set_pit_count(uint8_t channel, uint16_t count) // Only in lobyte/hibyte mod // TODO: make sure to set interrupts } +void init_pit(uint8_t init_command, uint8_t channel, uint32_t divisor) +{ + uint32_t normalized_div = normalize_divisor(divisor); + pit.divisor = normalized_div; + pit.interrupts = 0; + + outb(PIT_CMD_REG, init_command); // access mode must be lobyte/hibyte + + outb(channel, normalized_div & 0xFF); + outb(channel, (normalized_div & 0xFF00) >> 8); +} diff --git a/kernel/include/kernel/x86/pit.h b/kernel/include/kernel/x86/pit.h index ed212e9..f0b09c1 100644 --- a/kernel/include/kernel/x86/pit.h +++ b/kernel/include/kernel/x86/pit.h @@ -16,7 +16,7 @@ */ enum PIT_CHANNEL { CHANNEL_0 = 0x0, - CHANNEL_1, + CHANNEL_1, // this channel isn't always here... CHANNEL_2, /** * Isn't supported on 8253 chips, but should be supported on AT and later (except for PS/2). @@ -245,9 +245,12 @@ enum PIT_DIGIT_MODE { struct pit_state { uint32_t divisor; + // this allows us to track a.. very long time before an overflow... 52ms * INT64MAX = 4.8e20ms = 5.6e12 days = 1.5e7 centuries + // TODO: ... handle overflow? :p + uint64_t interrupts; } __attribute__((packed)); -void init_pit(uint32_t divisor); +void init_pit(uint8_t init_command, uint8_t channel, uint32_t divisor); double get_time_from_divisor(uint32_t divisor); diff --git a/kernel/kmain.c b/kernel/kmain.c index 5b61bc6..c03abbc 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -28,6 +29,8 @@ void kmain(void) init_kb(); + init_pit(0x36, PIT_CHANNEL_0, 0); + printf("%f\n", get_time_from_divisor(10)); printf("Entering loop...\n");