/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id$
**************************************************************************************/
#include <ubixos/io.h>
#include <drivers/8259.h>
unsigned int irqMask = 0xFFFF;
/* Initializes The PIC */
void init8259() {
outportByte(mPic, icw1); /* Initialize Master PIC */
outportByte(sPic, icw1); /* Initialize Seconary PIC */
outportByte(mPic+1, mVec); /* Master Interrup Vector */
outportByte(sPic+1, sVec); /* Secondary Interrupt Vector */
outportByte(mPic+1, 1<<2); /* Bitmask for cascade on IRQ 2 */
outportByte(sPic+1, 2); /* Cascade on IRQ 2 */
outportByte(mPic+1, icw4); /* Finish Primary Initialization */
outportByte(sPic+1, icw4); /* Finish Seconary Initialization */
outportByte(mImr, 0xff); /* Mask All Primary Interrupts */
outportByte(sImr, 0xff); /* Mask All Seconary Interrupts */
}
/* Enable IRQ # */
void enableIrq(unsigned short irqNo) {
irqMask &= ~(1 << irqNo);
if (irqNo >= 8) {
irqMask &= ~(1 << 2);
}
outportByte(mPic+1, irqMask & 0xFF);
outportByte(sPic+1, (irqMask >> 8) & 0xFF);
}
/* Disables IRQ # */
void disableIrq(unsigned short irqNo) {
irqMask |= (1 << irqNo);
if ((irqMask & 0xFF00)==0xFF00) {
irqMask |= (1 << 2);
}
outportByte(mPic+1, irqMask & 0xFF);
outportByte(sPic+1, (irqMask >> 8) & 0xFF);
}