示例#1
0
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;
}
示例#2
0
文件: ps2.c 项目: cmsd2/ChrisOS
//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);
}