Exemple #1
0
static void kb_handle_interrupt(uint8_t irq, struct irq_regs* regs)
{
    uint8_t scan_code = INB(0x60);

    if(scan_code == 0xFA && !g_initial_ack_received) {

        // Currently, we seem to be getting an interrupt
        // right after enabling the keyboard and interrupts.
        // The scan code is 0xFA, and the current set is 1.
        // This is not a valid scan code, and we currently do not
        // know why this is being sent. We have only ever seen it
        // get "sent" once, in this instance. So we simply ignore it.
        g_initial_ack_received = true;
        pic_send_eoi(pic_irq_keyboard);
        return;
    }

    //terminal_write_string("KB IRQ Scan code: ");
    //terminal_write_hex(scan_code);
    //terminal_write_string("\n");

    // Translate scancode
    int sc_index = sc_get_entry_index(g_current_map, scan_code);

    if (sc_index < 0) {

        // Unknown scan-code
        terminal_write_string("Unknown scan code value: ");
        terminal_write_uint32_x(scan_code);
        terminal_write_string("\n");
        // Reset to the first map in the set
        reset_map();
    }
    else {
        struct sc_map_entry* sc_entry = &g_current_map->entries[sc_index];

        switch (sc_entry->type) {
            case sc_map_entry_type_press:
                reset_map();
                if(g_current_subscriber->down != NULL) {
                    g_current_subscriber->down(sc_entry->data);
                }
                break;

            case sc_map_entry_type_release:
                reset_map();
                if(g_current_subscriber->up != NULL) {
                    g_current_subscriber->up(sc_entry->data);
                }
                break;

            case sc_map_entry_type_map:
                g_current_map = &g_current_set->maps[sc_entry->data];
                break;
        }
    }

    pic_send_eoi(pic_irq_keyboard);
}
Exemple #2
0
static void print_interrupt_name(uint8_t number) {
	Terminal *term = get_interrupt_terminal_instance();
	if (term->column != TERMINAL_START_X) {
		terminal_put_char(term, '\n');
	}
	terminal_write_string(term, interrupt_names[number]);
	terminal_put_char(term, '\n');
}
Exemple #3
0
void keyboard_handler(registers_t regs) {
	uint8_t keycode = read_from_port(0x60);
	Terminal *term = get_interrupt_terminal_instance();
	beep(700, 1000);

	switch(keycode) {
	case 0xAA: // LShift unpressed
		term->isShiftPressed = false;
		break;
	default:
		if((keycode & 128) != 128) {
			switch(keycode) {
			case 0x0F: // Tab
				kernel_task->is_something_changed = true;
				kernel_task->is_need_to_change_axis = true;
				terminal_write_string(term, "Changing axis\n");
				break;
			case 0x1C: // Enter
				term->term_line[term->command_column + 1] = '\0';
				terminal_put_char(term, '\n');
				process_command(term->term_line, term);
				kernel_task->is_something_changed = true;
				break;
			case 0x01: // Esc
				kernel_task->is_alive = false;
				terminal_write_string(term, "Stopping tasks, leaving OS\n");
				break;
			case 0x2A: // LShift pressed
				term->isShiftPressed = true;
				break;
			default:
				print_user_input(term, keycode);
				break;
			}
		}
		break;
	}
}
Exemple #4
0
// -------------------------------------------------------------------------
// Public Contract
// -------------------------------------------------------------------------
void usb_init()
{
    terminal_write_string("Initializing USB host controllers\n");
    terminal_indentation_increase();

    // TODO: This should really check whether PCI is available before it tries to do anything with it
    struct pci_address addr = {};
    pci_device dev;
    while(pci_device_get_next(&addr, USB_CLASS_CODE, USB_SUBCLASS_CODE, &dev)) {

        // NOTE: This function should NOT store the pointers passed in,
        //       as they're used for enumerating all devices
       usb_process_device(&addr, &dev);

       if(!pci_address_advance(&addr)) {
           break;
       }
    } 

    terminal_indentation_decrease();
}