#include "events/idt.h" #include "io.h" #include "pic.h" #include "stdio.h" #include "keyboard.h" static void send_icw1(void) { outb(MASTER_PIC_A, ICW1); outb(SLAVE_PIC_A, ICW1); } static void send_icw2(void) { outb(MASTER_PIC_B, IDT_RESERVED_ENTRIES); outb(SLAVE_PIC_B, IDT_RESERVED_ENTRIES + 8); } static void send_icw3(void) { outb(MASTER_PIC_B, 0x4); outb(SLAVE_PIC_B, 0x2); } static void send_icw4(void) { outb(MASTER_PIC_B, 0x1); outb(SLAVE_PIC_B, 0x1); } static void mask_irqs(void) { outb(MASTER_PIC_B, IRQ2_PIN | IRQ3_PIN | IRQ4_PIN | IRQ5_PIN | IRQ6_PIN | IRQ7_PIN); outb(SLAVE_PIC_B, 0xff); } void init_pic(void) { send_icw1(); send_icw2(); send_icw3(); send_icw4(); mask_irqs(); init_keyboard(); init_pit(); asm volatile("sti"); } void acknowledge(uint32_t int_vector) { uint8_t ocw2 = 0x20; if (int_vector >= IDT_RESERVED_ENTRIES + 8) outb(SLAVE_PIC_A, ocw2); outb(MASTER_PIC_A, ocw2); }