int install_undi_irq_handler ( irq_t irq, segoff_t entrypointsp ) { segoff_t undi_irq_handler_segoff = SEGOFF(undi_irq_handler); if ( undi_irq_installed_on != IRQ_NONE ) { DBG ( "Can install undi IRQ handler only once\n" ); return 0; } if ( SEGMENT(undi_irq_handler) > 0xffff ) { DBG ( "Trivial IRQ handler not in base memory\n" ); return 0; } DBG ( "Installing undi IRQ handler on IRQ %d\n", irq ); *pxenv_undi_entrypointsp = entrypointsp; *pxenv_undi_irq = irq; if ( ! install_irq_handler ( irq, &undi_irq_handler_segoff, undi_irq_chain, undi_irq_chain_to ) ) return 0; undi_irq_installed_on = irq; DBG ( "Disabling undi IRQ %d\n", irq ); disable_irq ( irq ); *undi_irq_trigger_count = 0; undi_irq_previous_trigger_count = 0; DBG ( "UNDI IRQ handler installed successfully\n" ); return 1; }
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; }
void rtc_setup() { /* * Configure the PIT * Channel 0, Rate Interval, L/MSB, 16bit Word * Count Register=0x04AA which is about 1 ms per tick. */ outb(0x34, 0x43); // Control Word: 0b00110100 (CS=0,ACS=3,MODE=2,BCD=false) outb(0xAA, 0x40); // Reload Value: 0x04AA ~= 1 ms outb(0x04, 0x40); // Initialize the tick tracking _ticks = _seconds = 0; // Install IRQ Hander install_irq_handler(0, &rtc_IRQHandler); }
void floppy_init(void) { int i; uint8_t detect_floppy; if (floppy_params.bytes_per_sector > 2) { kprintf("FDD: ERROR: Sector size bigger than 512 bytes (disabled floppies)\n"); floppy_drives[0].type = 0; floppy_drives[1].type = 0; return; } outportb(0x70, 0x10); detect_floppy = inportb(0x71); floppy_drives[0].type = detect_floppy >> 4; floppy_drives[1].type = detect_floppy & 0xF; for (i = 0; i < MAX_DRIVES; ++i) { if (floppy_drives[i].type == 4) { device_insert(&floppy_drives[i].blockdev.std); /* with 1.44MB 3.5" floppy disk, 2 sides and 80 tracks per side */ floppy_drives[i].blockdev.block_size = 128 * (1 << floppy_params.bytes_per_sector); floppy_drives[i].blockdev.block_count = 2 * 80 * floppy_params.sectors_per_track; } else { if (floppy_drives[i].type) { kprintf("FDD: Found %s at %s, that's not supported.\n", floppy_drive_types[floppy_drives[i].type], floppy_drives[i].type); } floppy_drives[i].blockdev.std.dev_type = DEV_TYPE_NONE; } } install_irq_handler(FLOPPY_IRQ, floppy_handler); }
void keyboard_install() { install_irq_handler(1, keyboard_handler); }