pic.c (845B)
1 #include <arch/x86/io.h> 2 3 #define PIC1_CMD 0x20 4 #define PIC1_DATA 0x21 5 #define PIC2_CMD 0xA0 6 #define PIC2_DATA 0xA1 7 8 #define ICW1 0x11 // ICW1 initialize and ICW4 is needed, cascading 9 // 8 byte interrupts vectors 10 #define ICW4 0x01 // x86 architecture, normal EOI, not buffered, sequential 11 12 void pic_init(int pic1_pos, int pic2_pos) { 13 unsigned char a1, a2; 14 15 // save masks 16 a1 = inb(PIC1_DATA); 17 a2 = inb(PIC2_DATA); 18 19 outb(PIC1_CMD, ICW1); 20 outb(PIC2_CMD, ICW1); 21 22 outb(PIC1_DATA, pic1_pos); 23 outb(PIC2_DATA, pic2_pos); 24 25 outb(PIC1_DATA, 4); // Master PIC: There is a slave at IRQ2 (0000 0100) 26 outb(PIC2_DATA, 2); // Slave PIC: cascade identity 0000 0010 27 28 outb(PIC1_DATA, ICW4); 29 outb(PIC2_DATA, ICW4); 30 31 // restore saved masks 32 outb(PIC1_DATA, a1); 33 outb(PIC2_DATA, a2); 34 }