⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.c

📁 raywill写的操作系统内核
💻 C
字号:
#include <i386/irq.h>
#include <maray/type.h>

#ifndef IRQ1_PORT
	#define IRQ1_PORT 0x21
	#define IRQ2_PORT 0xA1
#endif

void init_irq()
{
	static const unsigned irq0_int = 0x20, irq8_int = 0x28;
/**/

/* Initialization Control Word #1 (ICW1) */
	outportb(0x20, 0x11);
	outportb(0xA0, 0x11);
/* ICW2:
route IRQs 0-7 to INTs 20h-27h */
	outportb(0x21, irq0_int);
/* route IRQs 8-15 to INTs 28h-2Fh */
	outportb(0xA1, irq8_int);
/* ICW3 */
	outportb(0x21, 0x04);
	outportb(0xA1, 0x02);
/* ICW4 */
	outportb(0x21, 0x01);
	outportb(0xA1, 0x01);
/* enable IRQ0 (timer) and IRQ1 (keyboard) */
	outportb(0x21, ~0x00);/*only keyboard for testing*/
	outportb(0xA1, ~0x00);
	
	print("8259 init OK!\n");	
}

void enable_irq(int irq)
{
	/*two case:irq<8,irq>=8*/
	byte bit=1;
	
	if(irq>(15+IRQ_OFFSET)||irq<(0+IRQ_OFFSET)) return;
	
	bit<<=irq%8;
	if( irq < (8+IRQ_OFFSET) ){
		outportb(IRQ1_PORT,~bit & inportb(IRQ1_PORT) );
	}else{
		outportb(IRQ2_PORT,~bit & inportb(IRQ2_PORT));
	}
}

void disable_irq(int irq)
{
	/*two case:irq<8,irq>=8*/
	byte bit=1;
	
	if(irq>(15+IRQ_OFFSET)||irq<(0+IRQ_OFFSET)) return;

	bit<<=irq%8;
	if( irq < (8+IRQ_OFFSET) ){
		outportb(IRQ1_PORT,bit|inportb(IRQ1_PORT));
	}else{
		outportb(IRQ2_PORT,bit|inportb(IRQ2_PORT));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -