k-chow/k/events/pic/pic.c

58 lines
1013 B
C
Raw Normal View History

#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);
}