static uint8_t keyboard_scancode_set(uint8_t scancode_set) { if (scancode_set > 3) return 0; // there is no scancode set 4, ... ps2_write_device(port, SCANCODE_SET); ps2_write_device(port, scancode_set); if (scancode_set == 0) { // read scancode set rather than write ps2_error_t err; return ps2_read_device(port, &err); } ps2_config_t config = ps2_read_config(); config.bits.port1_transl = 0; ps2_write_config(config); return scancode_set; }
//TODO this is horrible void ps2_init() { if(acpi_tables_loaded()) { kprintf("checking acpi for ps2 controller\n"); _ps2_available = acpi_fadt_has_8042(); } else { kprintf("no acpi. assuming ps2 controller\n"); _ps2_available = true; } if(ps2_probe()) { kprintf("ps2 controller responding\n"); _ps2_available = true; } if(!_ps2_available) { kprintf("ps2 controller absent\n"); return; } kprintf("ps2 controller present\n"); ps2_write_command(disable_first_ps2_port); ps2_write_command(disable_second_ps2_port); ps2_flush_output_buffer(); ps2_ctrl_cfg_t config = ps2_read_config(); bool is_dual_channel = PS2_CTRL_CFG_GET_2ND_PS2_CLOCK_DISABLE(config) != 0 ? true : false; kprintf("ps2 config: 0x%hhx dual_channel=%s\n", config, BOOL_TO_STR(is_dual_channel)); config = PS2_CTRL_CFG_SET_1ST_PS2_INT_ENABLE(config, 0); config = PS2_CTRL_CFG_SET_2ND_PS2_INT_ENABLE(config, 0); config = PS2_CTRL_CFG_SET_1ST_PS2_TRANSLATION_ENABLE(config, 0); ps2_write_config(config); ps2_write_command(test_first_ps2_port); ps2_wait_output_buffer_sync(); // should be 0 uint8_t first_port_response; uint8_t second_port_response; first_port_response = ps2_read_data(); kprintf("ps2 port 0 test result: 0x%hhx\n", first_port_response); if(is_dual_channel) { ps2_write_command(test_second_ps2_port); ps2_wait_output_buffer_sync(); second_port_response = ps2_read_data(); kprintf("ps2 port 1 test result: 0x%hhx\n", second_port_response); } if(first_port_response == 0) { ps2_write_command(enable_first_ps2_port); config = ps2_read_config(); config = PS2_CTRL_CFG_SET_1ST_PS2_INT_ENABLE(config, 1); ps2_write_config(config); } if(is_dual_channel && second_port_response == 0) { ps2_write_command(enable_second_ps2_port); config = ps2_read_config(); config = PS2_CTRL_CFG_SET_2ND_PS2_INT_ENABLE(config, 1); ps2_write_config(config); } kprintf("installing ps2 keyboard irq handler\n"); hal_install_irq_handler(_kbd_irq, ps2_kbd_interrupt_handler, ps2_kbd_thread, "ps2_kbd", NULL); }