Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
File: rtc.c Progetto: en0/rpos
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
void keyboard_install()
{
	install_irq_handler(1, keyboard_handler);	
}