CeDOS - kernel/pic.h

kernel/pic.h (view raw)

/*! \file
 * Interface for accessing the programmable interrupt contoller (PIC).
 */
#ifndef PIC_H
#define PIC_H

#include "assembly.h"

#define PIC1_COMMAND			0x20
#define PIC1_DATA				0x21
#define PIC2_COMMAND			0xA0
#define PIC2_DATA				0xA1

#define PIC1_OFFSET				0x20
#define PIC2_OFFSET				0x28

#define PIC_END_OF_INTERRUPT	0x20

// IRQ number of the slave interrupt cascade
#define PIC_IRQ_CASCADE         2

#define PIC1_IRQ(n) (PIC1_OFFSET + n)
#define PIC2_IRQ(n) (PIC2_OFFSET + n)

/*!
 * Moves irqs to appropriate addresses and enables all PIC interrupts
 * \return 1 on success, 0 on fail
 */
int pic_init(void);

/*!
 * Unmasks interrupt number \p irq.
 * \param irq Number of the interrupt to unmask.
 * \return 1 on success, 0 on fail
 */
int pic_unmask_interrupt(int irq);

/*!
 * Masks interrupt number \p irq.
 * \param irq Number of the interrupt to mask.
 * \return 1 on success, 0 on fail
 */
int pic_mask_interrupt(int irq);

/*!
 * Sends an end-of-interrupt-signal to the corresponding PIC.
 */
__attribute__((always_inline)) inline void pic1_eoi(void) {
    outb(PIC_END_OF_INTERRUPT, PIC1_COMMAND);
}

__attribute__((always_inline)) inline void pic2_eoi(void) {
    outb(PIC_END_OF_INTERRUPT, PIC2_COMMAND);
    outb(PIC_END_OF_INTERRUPT, PIC1_COMMAND);
}

#endif