Changes in kernel/genarch/src/drivers/i8259/i8259.c [c48de91:3daba42e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/i8259/i8259.c
rc48de91 r3daba42e 32 32 /** 33 33 * @file 34 * @brief i8259driver.34 * @brief PIC driver. 35 35 * 36 36 * Programmable Interrupt Controller for UP systems based on i8259 chip. … … 42 42 #include <log.h> 43 43 #include <interrupt.h> 44 45 /* ICW1 bits */46 #define I8259_ICW1 (1 << 4)47 #define I8259_ICW1_NEEDICW4 (1 << 0)48 49 /* OCW3 bits */50 #define I8259_OCW3 (1 << 3)51 #define I8259_OCW3_READ_ISR (3 << 0)52 53 /* OCW4 bits */54 #define I8259_OCW4 (0 << 3)55 #define I8259_OCW4_NSEOI (1 << 5)56 57 #define I8259_IRQ_COUNT 858 59 #define I8259_IRQ_SLAVE 260 61 static const char *i8259_get_name(void);62 63 pic_ops_t i8259_pic_ops = {64 .get_name = i8259_get_name,65 .enable_irqs = i8259_enable_irqs,66 .disable_irqs = i8259_disable_irqs,67 .eoi = i8259_eoi,68 .is_spurious = i8259_is_spurious,69 .handle_spurious = i8259_handle_spurious70 };71 44 72 45 // XXX: need to change pic_* API to get rid of these … … 80 53 81 54 /* ICW1: this is ICW1, ICW4 to follow */ 82 pio_write_8(&pic0->port1, I8259_ICW1 | I8259_ICW1_NEEDICW4);55 pio_write_8(&pic0->port1, PIC_ICW1 | PIC_ICW1_NEEDICW4); 83 56 84 57 /* ICW2: IRQ 0 maps to interrupt vector address irq0_vec */ 85 58 pio_write_8(&pic0->port2, irq0_vec); 86 59 87 /* ICW3: pic1 using IRQ I8259_IRQ_SLAVE*/88 pio_write_8(&pic0->port2, 1 << I8259_IRQ_SLAVE);60 /* ICW3: pic1 using IRQ PIC0_IRQ_PIC1 */ 61 pio_write_8(&pic0->port2, 1 << PIC0_IRQ_PIC1); 89 62 90 63 /* ICW4: i8086 mode */ … … 92 65 93 66 /* ICW1: ICW1, ICW4 to follow */ 94 pio_write_8(&pic1->port1, I8259_ICW1 | I8259_ICW1_NEEDICW4);67 pio_write_8(&pic1->port1, PIC_ICW1 | PIC_ICW1_NEEDICW4); 95 68 96 69 /* ICW2: IRQ 8 maps to interrupt vector address irq0_vec + 8 */ 97 pio_write_8(&pic1->port2, irq0_vec + I8259_IRQ_COUNT);70 pio_write_8(&pic1->port2, irq0_vec + PIC0_IRQ_COUNT); 98 71 99 /* ICW3: pic1 is known as I8259_IRQ_SLAVE*/100 pio_write_8(&pic1->port2, I8259_IRQ_SLAVE);72 /* ICW3: pic1 is known as PIC0_IRQ_PIC1 */ 73 pio_write_8(&pic1->port2, PIC0_IRQ_PIC1); 101 74 102 75 /* ICW4: i8086 mode */ 103 76 pio_write_8(&pic1->port2, 1); 104 77 105 /* disable all irq's */ 106 i8259_disable_irqs(0xffff); 107 /* but enable I8259_IRQ_SLAVE */ 108 i8259_enable_irqs(1 << I8259_IRQ_SLAVE); 78 pic_disable_irqs(0xffff); /* disable all irq's */ 79 pic_enable_irqs(1 << PIC0_IRQ_PIC1); /* but enable PIC0_IRQ_PIC1 */ 109 80 } 110 81 111 const char *i8259_get_name(void) 112 { 113 return "i8259"; 114 } 115 116 void i8259_enable_irqs(uint16_t irqmask) 82 void pic_enable_irqs(uint16_t irqmask) 117 83 { 118 84 uint8_t x; … … 123 89 (uint8_t) (x & (~(irqmask & 0xff)))); 124 90 } 125 if (irqmask >> I8259_IRQ_COUNT) {91 if (irqmask >> PIC0_IRQ_COUNT) { 126 92 x = pio_read_8(&saved_pic1->port2); 127 93 pio_write_8(&saved_pic1->port2, 128 (uint8_t) (x & (~(irqmask >> I8259_IRQ_COUNT))));94 (uint8_t) (x & (~(irqmask >> PIC0_IRQ_COUNT)))); 129 95 } 130 96 } 131 97 132 void i8259_disable_irqs(uint16_t irqmask)98 void pic_disable_irqs(uint16_t irqmask) 133 99 { 134 100 uint8_t x; … … 139 105 (uint8_t) (x | (irqmask & 0xff))); 140 106 } 141 if (irqmask >> I8259_IRQ_COUNT) {107 if (irqmask >> PIC0_IRQ_COUNT) { 142 108 x = pio_read_8(&saved_pic1->port2); 143 109 pio_write_8(&saved_pic1->port2, 144 (uint8_t) (x | (irqmask >> I8259_IRQ_COUNT)));110 (uint8_t) (x | (irqmask >> PIC0_IRQ_COUNT))); 145 111 } 146 112 } 147 113 148 void i8259_eoi(unsigned int irq)114 void pic_eoi(unsigned int irq) 149 115 { 150 if (irq >= I8259_IRQ_COUNT)151 pio_write_8(&saved_pic1->port1, I8259_OCW4 | I8259_OCW4_NSEOI);152 pio_write_8(&saved_pic0->port1, I8259_OCW4 | I8259_OCW4_NSEOI);116 if (irq >= PIC0_IRQ_COUNT) 117 pio_write_8(&saved_pic1->port1, PIC_OCW4 | PIC_OCW4_NSEOI); 118 pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI); 153 119 } 154 120 155 bool i8259_is_spurious(unsigned int irq)121 bool pic_is_spurious(unsigned int irq) 156 122 { 157 pio_write_8(&saved_pic0->port1, I8259_OCW3 | I8259_OCW3_READ_ISR);158 pio_write_8(&saved_pic1->port1, I8259_OCW3 | I8259_OCW3_READ_ISR);123 pio_write_8(&saved_pic0->port1, PIC_OCW3 | PIC_OCW3_READ_ISR); 124 pio_write_8(&saved_pic1->port1, PIC_OCW3 | PIC_OCW3_READ_ISR); 159 125 uint8_t isr_lo = pio_read_8(&saved_pic0->port1); 160 126 uint8_t isr_hi = pio_read_8(&saved_pic1->port1); 161 return !(((isr_hi << I8259_IRQ_COUNT) | isr_lo) & (1 << irq));127 return !(((isr_hi << PIC0_IRQ_COUNT) | isr_lo) & (1 << irq)); 162 128 } 163 129 164 void i8259_handle_spurious(unsigned int irq)130 void pic_handle_spurious(unsigned int irq) 165 131 { 166 132 /* For spurious IRQs from pic1, we need to isssue an EOI to pic0 */ 167 if (irq >= I8259_IRQ_COUNT)168 pio_write_8(&saved_pic0->port1, I8259_OCW4 | I8259_OCW4_NSEOI);133 if (irq >= PIC0_IRQ_COUNT) 134 pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI); 169 135 } 170 136
Note:
See TracChangeset
for help on using the changeset viewer.