static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { PS2KbdState *s = (PS2KbdState *)dev; int scancodes[3], i, count; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); count = qemu_input_key_value_to_scancode(evt->key->key, evt->key->down, scancodes); for (i = 0; i < count; i++) { ps2_put_keycode(s, scancodes[i]); } }
static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { PS2KbdState *s = (PS2KbdState *)dev; InputKeyEvent *key = evt->u.key.data; int qcode; uint16_t keycode; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); assert(evt->type == INPUT_EVENT_KIND_KEY); qcode = qemu_input_key_value_to_qcode(key->key); if (s->scancode_set == 1) { if (qcode == Q_KEY_CODE_PAUSE) { if (key->down) { ps2_put_keycode(s, 0xe1); ps2_put_keycode(s, 0x1d); ps2_put_keycode(s, 0x45); ps2_put_keycode(s, 0x91); ps2_put_keycode(s, 0x9d); ps2_put_keycode(s, 0xc5); } } else if (qcode == Q_KEY_CODE_PRINT) { if (key->down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x2a); ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x37); } else { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xb7); ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xaa); } } else { keycode = qcode_to_keycode_set1[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); } if (!key->down) { keycode |= 0x80; } ps2_put_keycode(s, keycode & 0xff); } else { qemu_log_mask(LOG_UNIMP, "ps2: ignoring key with qcode %d\n", qcode); } }
void ps2_write_keyboard(void *opaque, int val) { PS2KbdState *s = (PS2KbdState *)opaque; trace_ps2_write_keyboard(opaque, val); switch(s->common.write_cmd) { default: case -1: switch(val) { case 0x00: ps2_queue(&s->common, KBD_REPLY_ACK); break; case 0x05: ps2_queue(&s->common, KBD_REPLY_RESEND); break; case KBD_CMD_GET_ID: ps2_queue(&s->common, KBD_REPLY_ACK); /* We emulate a MF2 AT keyboard here */ ps2_queue(&s->common, KBD_REPLY_ID); if (s->translate) ps2_queue(&s->common, 0x41); else ps2_queue(&s->common, 0x83); break; case KBD_CMD_ECHO: ps2_queue(&s->common, KBD_CMD_ECHO); break; case KBD_CMD_ENABLE: s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_SCANCODE: case KBD_CMD_SET_LEDS: case KBD_CMD_SET_RATE: s->common.write_cmd = val; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_DISABLE: ps2_reset_keyboard(s); s->scan_enabled = 0; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_ENABLE: ps2_reset_keyboard(s); s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET: ps2_reset_keyboard(s); ps2_queue(&s->common, KBD_REPLY_ACK); ps2_queue(&s->common, KBD_REPLY_POR); break; default: ps2_queue(&s->common, KBD_REPLY_ACK); break; } break; case KBD_CMD_SCANCODE: if (val == 0) { if (s->scancode_set == 1) ps2_put_keycode(s, 0x43); else if (s->scancode_set == 2) ps2_put_keycode(s, 0x41); else if (s->scancode_set == 3) ps2_put_keycode(s, 0x3f); } else { if (val >= 1 && val <= 3) s->scancode_set = val; ps2_queue(&s->common, KBD_REPLY_ACK); } s->common.write_cmd = -1; break; case KBD_CMD_SET_LEDS: ps2_set_ledstate(s, val); ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; break; case KBD_CMD_SET_RATE: ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; break; } }