@@ -340,10 +340,25 @@ 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.
+ * Since 0x7f is not a used keycode for ADB we overload it to indicate the
+ * power button when we're storing keycodes in our internal buffer, and
+ * expand it out to two bytes when we send to the guest.
+ */
+ if (keycode == 0x7f) {
+ obuf[0] = 0x7f;
+ obuf[1] = 0x7f;
+ olen = 2;
+ } else {
+ obuf[0] = keycode;
+ /* NOTE: the power key key-up is the two byte sequence 0xff 0xff;
+ * otherwise we could in theory send a second keycode in the second
+ * byte, but choose not to bother.
+ */
+ obuf[1] = 0xff;
+ olen = 2;
+ }
return olen;
}
@@ -421,14 +436,22 @@ static void adb_keyboard_event(DeviceState *dev, QemuConsole *src,
return;
}
keycode = qcode_to_adb_keycode[qcode];
- if (keycode == NO_KEY) { /* We don't want to send this to the guest */
+
+ /* 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);
+ }
+ } else if (keycode == NO_KEY) { /* NO_KEY shouldn't be sent to guest */
return;
+ } else { /* For all non-power keys - safe for 8-bit keycodes */
+ if (evt->u.key.data->down == false) { /* if key release event */
+ keycode = keycode | 0x80; /* create keyboard break code */
+ }
+ adb_kbd_put_keycode(s, keycode);
}
- 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. Signed-off-by: John Arbuckle <programmingkidx@gmail.com> --- v4 changes Removed double-quote from end of comment. Removed debug printf statement. v3 change Add several suggested comments. Moved the location of an else statement in the adb_keyboard_event() function. hw/input/adb.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-)