HhhOS/arch/x86_64/drivers/pic/pic.c
2021-08-17 12:45:35 +03:00

55 lines
1.1 KiB
C

#include <drivers/pic/pic.h>
static u8 pic1_mask = 0xff;
static u8 pic2_mask = 0xff;
void pic_init() {
outportb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4);
io_wait();
outportb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4);
io_wait();
outportb(PIC1_DATA, 0x20); // master offset 0x20
io_wait();
outportb(PIC2_DATA, 0x28); // slave offset 0x28
io_wait();
outportb(PIC1_DATA, 4);
io_wait();
outportb(PIC2_DATA, 2);
io_wait();
outportb(PIC1_DATA, ICW4_8086);
io_wait();
outportb(PIC2_DATA, ICW4_8086);
io_wait();
outportb(PIC1_DATA, pic1_mask);
outportb(PIC2_DATA, pic2_mask);
pic_irq_enable(2);
}
void pic_send_eoi(u8 no) {
if (no >= 8) {
outportb(PIC2_COMMAND, PIC_EOI);
}
outportb(PIC1_COMMAND, PIC_EOI);
}
void pic_irq_enable(u8 no) {
if (no >= 8) {
no -= 8;
pic2_mask &= ~(1 << no);
outportb(PIC2_DATA, pic2_mask);
} else {
pic1_mask &= ~(1 << no);
outportb(PIC1_DATA, pic1_mask);
}
}
void pic_irq_disable(u8 no) {
if (no >= 8) {
no -= 8;
pic2_mask |= (1 << no);
outportb(PIC2_DATA, pic2_mask);
} else {
pic1_mask |= (1 << no);
outportb(PIC1_DATA, pic1_mask);
}
}