sos

[unmaintained] experimenting with low level OS development
Log | Files | Refs | README | LICENSE

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 }