SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

Diff markup

Differences between /hwcore/i8259.c (Article 9.5) and /hwcore/i8259.c (Article 3)


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

source navigation ] diff markup ] identifier search ] general search ]