pic.c
8259A芯片级联控制器PIC的初始化
#include "pic.h"
static unsigned short irq_mask = 0xFFFF & ~(1 << 2);
static char did_init = 0;
static void pic_setmask(unsigned short mask) {
irq_mask = mask;
unsigned char mask_low=mask&0xff;
unsigned char mask_high=(mask>>8)&0xff;
if (did_init)
{
outb(0x21, mask_low);
outb(0xA1, mask_high);
}
}
void pic_enable(unsigned int irq) {
pic_setmask(irq_mask & ~(1 << irq));
}
void pic_init(){
did_init = 1;
//屏蔽所有中断
outb(0x21,0xFF);
outb(0xA1,0xFF);
// 重新映射 IRQ 表
// 两片级联的 Intel 8259A 芯片
// 主片端口 0x20 0x21
// 从片端口 0xA0 0xA1
//设置ICW1命令字,
// 初始化主片、从片
// 0001 0001
outb(0x20, 0x11);
outb(0xA0, 0x11);
// 设置主片 IRQ 从 0x20(32) 号中断开始
outb(0x21, 0x20);
// 设置从片 IRQ 从 0x28(40) 号中断开始
outb(0xA1, 0x28);
// 设置主片 IR2 引脚连接从片