void timer_install(u32int freq) { interrupt_install_handler(IRQ0, timer_handler, "PIT"); u32int d = 11913180 / freq; outportb(0x43, 0x36); u8int l = (u8int)(d & 0xFF); u8int h = (u8int)((d >> 8) & 0xFF); outportb(0x40, l); outportb(0x40, h); }
void keyboard_enable() { int i = 0; asm_disable_interrupt(); #ifdef _USE_GAZ /* This is for debugging purposes. */ set_vector(keyb_ISR, M_VEC+1, D_PRESENT + D_INT + D_DPL3, KERNEL_CS); enable_irq(1); #else /* Default - use OX driver logic. */ printk("initializing Keyboard driver version 1.0\n"); interrupt_install_handler(1, IRQ_EXCL, keyboard_handler, keyboard_info); printk("done initializing Keyboard driver version 1.0\n"); /* irq_enable(1); */ enable_irq(1); #endif led_status = 0; /* All leds off */ setleds(); }
general_error irq_init(void) { /* Send both PICs initialization word ICW1. */ outb(IRQ_MASTER | IRQ_CMD, IRQ_ICW1 | IRQ_ICW4_COMING); outb(IRQ_SLAVE | IRQ_CMD, IRQ_ICW1 | IRQ_ICW4_COMING); /* Send both PICs remapping information. */ outb(IRQ_MASTER | IRQ_DATA, IRQ_REMAP_MASK & 0x20); outb(IRQ_SLAVE | IRQ_DATA, IRQ_REMAP_MASK & 0x2F); /* Tell both PICs where the slave is mapped. */ outb(IRQ_MASTER | IRQ_DATA, IRQ_SLAVE_IS2); outb(IRQ_SLAVE | IRQ_DATA, IRQ_SLAVEID_2); /* Send both PICs some more configuration data. */ outb(IRQ_MASTER | IRQ_DATA, (IRQ_NONBUFFERED | IRQ_NORMAL_EOI | IRQ_8086_MODE)); outb(IRQ_SLAVE | IRQ_DATA, (IRQ_NONBUFFERED | IRQ_NORMAL_EOI | IRQ_8086_MODE)); /* Turn on only the keyboard IRQ. */ outb(IRQ_MASTER | IRQ_DATA, ~IRQ_MASTER_IRQ(IRQ_KEYBOARD)); outb(IRQ_SLAVE | IRQ_DATA, ~IRQ_SLAVE_IRQ(IRQ_KEYBOARD)); /* Install handlers for all IRQs. In principle, whenever an IRQ * is turned on by a driver, it should also install a handler, * but who knows, maybe it won't. This way, we are not stuck with * the very generic unhandled-interrupt routine, but something * slightly more infomative. */ interrupt_install_handler(0x20, &irq0_handler); interrupt_install_handler(0x21, &irq1_handler); interrupt_install_handler(0x22, &irq2_handler); interrupt_install_handler(0x23, &irq3_handler); interrupt_install_handler(0x24, &irq4_handler); interrupt_install_handler(0x25, &irq5_handler); interrupt_install_handler(0x26, &irq6_handler); interrupt_install_handler(0x27, &irq7_handler); interrupt_install_handler(0x28, &irq8_handler); interrupt_install_handler(0x29, &irq9_handler); interrupt_install_handler(0x2a, &irq10_handler); interrupt_install_handler(0x2b, &irq11_handler); interrupt_install_handler(0x2c, &irq12_handler); interrupt_install_handler(0x2d, &irq13_handler); interrupt_install_handler(0x2e, &irq14_handler); interrupt_install_handler(0x2f, &irq15_handler); /* Now install the individual handlers. */ unsigned int i; for (i = 0; i < 16; i++) install_irq_handler(i, &default_irq_handler); return GENERAL_OK; }