|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
001 /* Copyright (C) 2004 The KOS Team 001 /* Copyright (C) 2004 The KOS Team 002 Copyright (C) 1999 Free Software Foundatio << 003 002 004 This program is free software; you can redi 003 This program is free software; you can redistribute it and/or 005 modify it under the terms of the GNU Genera 004 modify it under the terms of the GNU General Public License 006 as published by the Free Software Foundatio 005 as published by the Free Software Foundation; either version 2 007 of the License, or (at your option) any lat 006 of the License, or (at your option) any later version. 008 007 009 This program is distributed in the hope tha 008 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the 009 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR 010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU General Public License for more details 011 GNU General Public License for more details. 013 012 014 You should have received a copy of the GNU 013 You should have received a copy of the GNU General Public License 015 along with this program; if not, write to t 014 along with this program; if not, write to the Free Software 016 Foundation, Inc., 59 Temple Place - Suite 3 015 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 017 USA. 016 USA. 018 */ 017 */ 019 #include "ioports.h" 018 #include "ioports.h" 020 019 021 #include "i8259.h" 020 #include "i8259.h" 022 021 023 #define PIC_MASTER 0x20 022 #define PIC_MASTER 0x20 024 #define PIC_SLAVE 0xa0 023 #define PIC_SLAVE 0xa0 025 024 026 /** Setup the 8259 PIC */ 025 /** Setup the 8259 PIC */ 027 sos_ret_t sos_i8259_subsystem_setup(void) 026 sos_ret_t sos_i8259_subsystem_setup(void) 028 { 027 { 029 /* Send ICW1: 8086 mode + NOT Single ctrl + 028 /* Send ICW1: 8086 mode + NOT Single ctrl + call address 030 interval=8 */ 029 interval=8 */ 031 outb(0x11, PIC_MASTER); 030 outb(0x11, PIC_MASTER); 032 outb(0x11, PIC_SLAVE); 031 outb(0x11, PIC_SLAVE); 033 032 034 /* Send ICW2: ctrl base address */ 033 /* Send ICW2: ctrl base address */ 035 outb(0x20, PIC_MASTER+1); 034 outb(0x20, PIC_MASTER+1); 036 outb(0x28, PIC_SLAVE+1); 035 outb(0x28, PIC_SLAVE+1); 037 036 038 /* Send ICW3 master: mask where slaves are c 037 /* Send ICW3 master: mask where slaves are connected */ 039 outb(0x4, PIC_MASTER+1); 038 outb(0x4, PIC_MASTER+1); 040 /* Send ICW3 slave: index where the slave is 039 /* Send ICW3 slave: index where the slave is connected on master */ 041 outb(0x2, PIC_SLAVE+1); 040 outb(0x2, PIC_SLAVE+1); 042 041 043 /* Send ICW4: 8086 mode, fully nested, not b 042 /* Send ICW4: 8086 mode, fully nested, not buffered, no implicit EOI */ 044 outb(0x1, PIC_MASTER+1); 043 outb(0x1, PIC_MASTER+1); 045 outb(0x1, PIC_SLAVE+1); 044 outb(0x1, PIC_SLAVE+1); 046 045 047 /* Send OCW1: 046 /* Send OCW1: 048 * Closing all IRQs : waiting for a correct 047 * Closing all IRQs : waiting for a correct handler The only IRQ 049 * enabled is the cascade (that's why we use 048 * enabled is the cascade (that's why we use 0xFB for the master) */ 050 outb(0xFB, PIC_MASTER+1); 049 outb(0xFB, PIC_MASTER+1); 051 outb(0xFF, PIC_SLAVE+1); 050 outb(0xFF, PIC_SLAVE+1); 052 051 053 return SOS_OK; 052 return SOS_OK; 054 } 053 } 055 054 056 055 057 sos_ret_t sos_i8259_enable_irq_line(int numirq 056 sos_ret_t sos_i8259_enable_irq_line(int numirq) 058 { 057 { 059 if(numirq < 8) 058 if(numirq < 8) 060 /* irq on master PIC */ 059 /* irq on master PIC */ 061 outb((inb(PIC_MASTER+1) & ~(1 << numirq)), 060 outb((inb(PIC_MASTER+1) & ~(1 << numirq)), PIC_MASTER+1); 062 else 061 else 063 /* irq on slave PIC */ 062 /* irq on slave PIC */ 064 outb((inb(PIC_SLAVE+1) & ~(1 << (numirq-8) 063 outb((inb(PIC_SLAVE+1) & ~(1 << (numirq-8))), PIC_SLAVE+1); 065 064 066 return SOS_OK; 065 return SOS_OK; 067 } 066 } 068 067 069 068 070 sos_ret_t sos_i8259_disable_irq_line(int numir 069 sos_ret_t sos_i8259_disable_irq_line(int numirq) 071 { 070 { 072 if(numirq < 8) 071 if(numirq < 8) 073 /* irq on master PIC */ 072 /* irq on master PIC */ 074 outb((inb(PIC_MASTER+1) | (1 << numirq)), 073 outb((inb(PIC_MASTER+1) | (1 << numirq)), PIC_MASTER+1); 075 else 074 else 076 /* irq on slave PIC */ 075 /* irq on slave PIC */ 077 outb((inb(PIC_SLAVE+1) | (1 << (numirq-8)) 076 outb((inb(PIC_SLAVE+1) | (1 << (numirq-8))), PIC_SLAVE+1); 078 077 079 return SOS_OK; 078 return SOS_OK; 080 } 079 }
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |