/* keycode is expressed as follow: bit 7 - 0 key pressed, 1 = key released bits 6-0 - translated scancode set 2 */ static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; trace_ps2_put_keycode(opaque, keycode); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); /* XXX: add support for scancode set 1 */ if (!s->translate && keycode < 0xe0 && s->scancode_set > 1) { if (keycode & 0x80) { ps2_queue(&s->common, 0xf0); } if (s->scancode_set == 2) { keycode = ps2_raw_keycode[keycode & 0x7f]; } else if (s->scancode_set == 3) { keycode = ps2_raw_keycode_set3[keycode & 0x7f]; } } ps2_queue(&s->common, keycode); }
/* keycode is the untranslated scancode in the current scancode set. */ static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; trace_ps2_put_keycode(opaque, keycode); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); if (s->translate) { if (keycode == 0xf0) { s->need_high_bit = true; } else if (s->need_high_bit) { ps2_queue(&s->common, translate_table[keycode] | 0x80); s->need_high_bit = false; } else { ps2_queue(&s->common, translate_table[keycode]); } } else { ps2_queue(&s->common, keycode); } }