]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/drivers/irq/i8259a.c
Handle interrupts
[nameless-os.git] / kernel / drivers / irq / i8259a.c
1 #include <io.h>
2 #include <tty.h>
3 #include <irq/i8259a.h>
4
5 void pic_init(int offset1, int offset2)
6 {
7 uint8_t a1, a2;
8
9 a1 = inb(PIC1_DATA);
10 a2 = inb(PIC2_DATA);
11
12 outb(PIC1_COMMAND, PIC_ICW1_INIT | PIC_ICW1_ICW4);
13 io_wait();
14 outb(PIC2_COMMAND, PIC_ICW1_INIT | PIC_ICW1_ICW4);
15 io_wait();
16 outb(PIC1_DATA, offset1);
17 io_wait();
18 outb(PIC2_DATA, offset2);
19 io_wait();
20 outb(PIC1_DATA, 4);
21 io_wait();
22 outb(PIC2_DATA, 2);
23 io_wait();
24
25 outb(PIC1_DATA, PIC_ICW4_8086);
26 io_wait();
27 outb(PIC2_DATA, PIC_ICW4_8086);
28 io_wait();
29
30 outb(PIC1_DATA, a1);
31 outb(PIC2_DATA, a2);
32 }
33
34 void pic_mask(uint8_t irq)
35 {
36 uint16_t port;
37 uint8_t value;
38
39 if (irq < 8) {
40 port = PIC1_DATA;
41 } else {
42 port = PIC2_DATA;
43 }
44
45 value = inb(port) | (1 << irq);
46 outb(port, value);
47 }
48
49 void pic_unmask(uint8_t irq)
50 {
51 uint16_t port;
52 uint8_t value;
53
54 if (irq < 8) {
55 port = PIC1_DATA;
56 } else {
57 port = PIC2_DATA;
58 }
59
60 value = inb(port) & ~(1 << irq);
61 outb(port, value);
62 }
63
64 void pic_mask_all(void)
65 {
66 outb(PIC1_DATA, 0xFF);
67 }
68
69 void pic_unmask_all(void)
70 {
71 outb(PIC1_DATA, 0);
72 }
73
74 void pic_send_eoi(uint8_t irq)
75 {
76 if (irq >= 8)
77 outb(PIC2_COMMAND, PIC_EOI);
78
79 outb(PIC1_COMMAND, PIC_EOI);
80 }