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); }
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'); }
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; } }
// ------------------------------------------------------------------------- // 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(); }