diff options
Diffstat (limited to 'arch/i386/include')
-rw-r--r-- | arch/i386/include/kernel/pic.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/arch/i386/include/kernel/pic.h b/arch/i386/include/kernel/pic.h new file mode 100644 index 0000000..c3ede4f --- /dev/null +++ b/arch/i386/include/kernel/pic.h @@ -0,0 +1,45 @@ +#ifndef I386_PIC_H +#define I386_PIC_H + +#include <stdint.h> + +#define PIC1 0x20 +#define PIC2 0x28 +#define PIC1_COMMAND PIC1 +#define PIC1_DATA (PIC1+1) +#define PIC2_COMMAND PIC2 +#define PIC2_DATA (PIC2+1) + +#define ICW1_ICW4 0x01 +#define ICW1_SINGLE 0x02 +#define ICW1_INTERVAL4 0x04 +#define ICW1_LEVEL 0x08 +#define ICW1_INIT 0x10 + +#define ICW4_8086 0x01 +#define ICW4_AUTO 0x02 +#define ICW4_BUF_SLAVE 0x08 +#define ICW4_BUF_MASTER 0x0C +#define ICW4_SFNM 0x10 + +static inline void outb(uint16_t port, uint8_t value) { + asm volatile("outb %0, %1" : : "a"(value), "Nd"(port)); +} + +static inline uint8_t inb(uint16_t port) { + uint8_t ret; + asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline void io_wait(void) { + outb(0x80, 0); +} + +void pic_eoi(unsigned char irq); +void pic_remap(void); + +void irq_set_mask(uint8_t irq); +void irq_clear_mask(uint8_t irq); + +#endif |