55 lines
930 B
C
55 lines
930 B
C
#include "idt.h"
|
|
#include "io.h"
|
|
#include "pic.h"
|
|
#include "stdio.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, 0xff ^ 0x2);
|
|
outb(SLAVE_PIC_B, 0xff);
|
|
}
|
|
|
|
void init_pic(void)
|
|
{
|
|
send_icw1();
|
|
send_icw2();
|
|
send_icw3();
|
|
send_icw4();
|
|
mask_irqs();
|
|
asm volatile("sti");
|
|
}
|
|
|
|
void acknowledge(uint32_t int_vector)
|
|
{
|
|
printf("acknowledging %d\r\n", int_vector);
|
|
uint8_t ocw2 = 0x20;
|
|
if (int_vector >= IDT_RESERVED_ENTRIES + 8)
|
|
outb(SLAVE_PIC_A, ocw2);
|
|
outb(MASTER_PIC_A, ocw2);
|
|
}
|