[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v4 5/5] adb.c: add power key support
From: |
Programmingkid |
Subject: |
Re: [Qemu-ppc] [PATCH v4 5/5] adb.c: add power key support |
Date: |
Mon, 15 Aug 2016 15:53:02 -0400 |
On Aug 15, 2016, at 8:19 AM, David Gibson wrote:
> On Fri, Aug 12, 2016 at 08:10:03PM -0400, John Arbuckle wrote:
>> Add support for the power key.
>>
>> Signed-off-by: John Arbuckle <address@hidden>
>> Reviewed-by: Peter Maydell <address@hidden>
>> ---
>> 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(-)
>>
>> diff --git a/hw/input/adb.c b/hw/input/adb.c
>> index 2042903..3998490 100644
>> --- a/hw/input/adb.c
>> +++ b/hw/input/adb.c
>> @@ -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);
>
> The logic in the CODE_POWER and else cases doesn't actually seem to be
> different AFAICT.
The power key is a 16 bit value. It needs its own special case or the operating
system would not see it. After disabling the "if (qcode == Q_KEY_CODE_POWER)"
condition
so the power key would go thru the else statement, the guest stopped detecting
the
power key.
>
>> }
>> - 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 = {
>