Newer
Older
ubixos / src / sys / drivers / 8259.c
@reddawg reddawg on 7 May 2002 1 KB Looking Good
/**************************************************************************************
 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);
  }