55 lines
1.1 KiB
C
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);
|
|
}
|
|
} |