@@ -358,10 +358,17 @@ static int adb_kbd_poll(ADBDevice *d, uint8_t *obuf)
s->rptr = 0;
}
s->count--;
- obuf[0] = keycode;
- /* NOTE: could put a second keycode if needed */
- obuf[1] = 0xff;
- olen = 2;
+ /* The power key is the only two byte value key, so it is a special case. */
+ if (keycode == 0x7f) {
+ obuf[0] = 0x7f;
+ obuf[1] = 0x7f;
+ olen = 2;
+ } else {
+ obuf[0] = keycode;
+ /* NOTE: could put a second keycode if needed */
+ obuf[1] = 0xff;
+ olen = 2;
+ }
return olen;
}
@@ -440,11 +447,22 @@ static void adb_keyboard_event(DeviceState *dev, QemuConsole *src,
}
keycode = qcode_to_adb_keycode[qcode];
- if (evt->u.key.data->down == false) { /* if key release event */
- keycode = keycode | 0x80; /* create keyboard break code */
+ /* The power button is a special case because it is a 16-bit value */
+ if (qcode == Q_KEY_CODE_POWER) {
+ if (evt->u.key.data->down == true) { /* Power button pushed keycode */
+ adb_kbd_put_keycode(s, 0x7f);
+ } else { /* Power button released keycode */
+ adb_kbd_put_keycode(s, 0xff);
+ }
}
- adb_kbd_put_keycode(s, keycode);
+ /* For all non-power keys - safe for 8-bit keycodes */
+ else {
+ if (evt->u.key.data->down == false) { /* if key release event */
+ keycode = keycode | 0x80; /* create keyboard break code */
+ }
+ adb_kbd_put_keycode(s, keycode);
+ }
}
static const VMStateDescription vmstate_adb_kbd = {
Add support for the power key. It has to be handled differently from the other keys because it is the only 16-bit value key. Signed-off-by: John Arbuckle <programmingkidx@gmail.com> --- hw/input/adb.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-)