diff mbox series

[6/6] hw/input/stellaris_gamepad: Convert to qemu_input_handler_register()

Message ID 20231017122302.1692902-7-peter.maydell@linaro.org
State Superseded
Headers show
Series arm/stellaris: convert gamepad input device to qdev | expand

Commit Message

Peter Maydell Oct. 17, 2023, 12:23 p.m. UTC
Now that we have converted to qdev, we can use the newer
qemu_input_handler_register() API rather than the legacy
qemu_add_kbd_event_handler().

Since we only have one user, take the opportunity to convert
from scancodes to QCodes, rather than using
qemu_input_key_value_to_scancode() (which adds an 0xe0
prefix and encodes up/down indication in the scancode,
which our old handler function then had to reverse). That
lets us drop the old state field which was tracking whether
we were halfway through a two-byte scancode.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 include/hw/input/stellaris_gamepad.h |  2 +-
 hw/arm/stellaris.c                   |  6 ++++-
 hw/input/stellaris_gamepad.c         | 33 +++++++++++++---------------
 3 files changed, 21 insertions(+), 20 deletions(-)

Comments

Philippe Mathieu-Daudé Oct. 17, 2023, 1:09 p.m. UTC | #1
On 17/10/23 14:23, Peter Maydell wrote:
> Now that we have converted to qdev, we can use the newer
> qemu_input_handler_register() API rather than the legacy
> qemu_add_kbd_event_handler().
> 
> Since we only have one user, take the opportunity to convert
> from scancodes to QCodes, rather than using
> qemu_input_key_value_to_scancode() (which adds an 0xe0
> prefix and encodes up/down indication in the scancode,
> which our old handler function then had to reverse). That
> lets us drop the old state field which was tracking whether
> we were halfway through a two-byte scancode.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   include/hw/input/stellaris_gamepad.h |  2 +-
>   hw/arm/stellaris.c                   |  6 ++++-
>   hw/input/stellaris_gamepad.c         | 33 +++++++++++++---------------
>   3 files changed, 21 insertions(+), 20 deletions(-)


>   static const VMStateDescription vmstate_stellaris_gamepad = {
> @@ -44,13 +36,18 @@ static const VMStateDescription vmstate_stellaris_gamepad = {
>       .version_id = 2,
>       .minimum_version_id = 2,

Updating the migration version:
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

>       .fields = (VMStateField[]) {
> -        VMSTATE_INT32(extension, StellarisGamepad),
>           VMSTATE_VARRAY_UINT32(pressed, StellarisGamepad, num_buttons,
>                                 0, vmstate_info_uint8, uint8_t),
>           VMSTATE_END_OF_LIST()
>       }
>   };
Philippe Mathieu-Daudé Oct. 19, 2023, 9:47 p.m. UTC | #2
Hi Peter,

On 17/10/23 14:23, Peter Maydell wrote:
> Now that we have converted to qdev, we can use the newer
> qemu_input_handler_register() API rather than the legacy
> qemu_add_kbd_event_handler().
> 
> Since we only have one user, take the opportunity to convert
> from scancodes to QCodes, rather than using
> qemu_input_key_value_to_scancode() (which adds an 0xe0
> prefix and encodes up/down indication in the scancode,
> which our old handler function then had to reverse). That
> lets us drop the old state field which was tracking whether
> we were halfway through a two-byte scancode.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   include/hw/input/stellaris_gamepad.h |  2 +-
>   hw/arm/stellaris.c                   |  6 ++++-
>   hw/input/stellaris_gamepad.c         | 33 +++++++++++++---------------
>   3 files changed, 21 insertions(+), 20 deletions(-)

If 
https://lore.kernel.org/qemu-devel/20231019211814.30576-47-philmd@linaro.org/
gets merged before you respin, this structure needs to be declared
const:

> +static QemuInputHandler stellaris_gamepad_handler = {
> +    .name = "Stellaris Gamepad",
> +    .mask = INPUT_EVENT_MASK_KEY,
> +    .event = stellaris_gamepad_event,
> +};
diff mbox series

Patch

diff --git a/include/hw/input/stellaris_gamepad.h b/include/hw/input/stellaris_gamepad.h
index 50c17041121..979e7243fd8 100644
--- a/include/hw/input/stellaris_gamepad.h
+++ b/include/hw/input/stellaris_gamepad.h
@@ -17,6 +17,7 @@ 
 /*
  * QEMU interface:
  *  + QOM array property "keycodes": uint32_t QEMU keycodes to handle
+ *    (these are QCodes, ie the Q_KEY_* values)
  *  + unnamed GPIO outputs: one per keycode, in the same order as the
  *    "keycodes" array property entries; asserted when key is down
  */
@@ -33,7 +34,6 @@  struct StellarisGamepad {
     qemu_irq *irqs;
     uint32_t *keycodes;
     uint8_t *pressed;
-    int extension;
 };
 
 #endif
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 707b0dae375..dd90f686bfa 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -32,6 +32,7 @@ 
 #include "hw/qdev-clock.h"
 #include "qom/object.h"
 #include "qapi/qmp/qlist.h"
+#include "ui/input.h"
 
 #define GPIO_A 0
 #define GPIO_B 1
@@ -1276,7 +1277,10 @@  static void stellaris_init(MachineState *ms, stellaris_board_info *board)
     }
     if (board->peripherals & BP_GAMEPAD) {
         QList *gpad_keycode_list = qlist_new();
-        static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
+        static const int gpad_keycode[5] = {
+            Q_KEY_CODE_UP, Q_KEY_CODE_DOWN, Q_KEY_CODE_LEFT,
+            Q_KEY_CODE_RIGHT, Q_KEY_CODE_CTRL,
+        };
         DeviceState *gpad;
 
         gpad = qdev_new(TYPE_STELLARIS_GAMEPAD);
diff --git a/hw/input/stellaris_gamepad.c b/hw/input/stellaris_gamepad.c
index 48d37bd6275..65247ecd782 100644
--- a/hw/input/stellaris_gamepad.c
+++ b/hw/input/stellaris_gamepad.c
@@ -15,28 +15,20 @@ 
 #include "migration/vmstate.h"
 #include "ui/console.h"
 
-static void stellaris_gamepad_put_key(void * opaque, int keycode)
+static void stellaris_gamepad_event(DeviceState *dev, QemuConsole *src,
+                                    InputEvent *evt)
 {
-    StellarisGamepad *s = (StellarisGamepad *)opaque;
+    StellarisGamepad *s = STELLARIS_GAMEPAD(dev);
+    InputKeyEvent *key = evt->u.key.data;
+    int qcode = qemu_input_key_value_to_qcode(key->key);
     int i;
-    int down;
-
-    if (keycode == 0xe0 && !s->extension) {
-        s->extension = 0x80;
-        return;
-    }
-
-    down = (keycode & 0x80) == 0;
-    keycode = (keycode & 0x7f) | s->extension;
 
     for (i = 0; i < s->num_buttons; i++) {
-        if (s->keycodes[i] == keycode && s->pressed[i] != down) {
-            s->pressed[i] = down;
-            qemu_set_irq(s->irqs[i], down);
+        if (s->keycodes[i] == qcode && s->pressed[i] != key->down) {
+            s->pressed[i] = key->down;
+            qemu_set_irq(s->irqs[i], key->down);
         }
     }
-
-    s->extension = 0;
 }
 
 static const VMStateDescription vmstate_stellaris_gamepad = {
@@ -44,13 +36,18 @@  static const VMStateDescription vmstate_stellaris_gamepad = {
     .version_id = 2,
     .minimum_version_id = 2,
     .fields = (VMStateField[]) {
-        VMSTATE_INT32(extension, StellarisGamepad),
         VMSTATE_VARRAY_UINT32(pressed, StellarisGamepad, num_buttons,
                               0, vmstate_info_uint8, uint8_t),
         VMSTATE_END_OF_LIST()
     }
 };
 
+static QemuInputHandler stellaris_gamepad_handler = {
+    .name = "Stellaris Gamepad",
+    .mask = INPUT_EVENT_MASK_KEY,
+    .event = stellaris_gamepad_event,
+};
+
 static void stellaris_gamepad_realize(DeviceState *dev, Error **errp)
 {
     StellarisGamepad *s = STELLARIS_GAMEPAD(dev);
@@ -63,7 +60,7 @@  static void stellaris_gamepad_realize(DeviceState *dev, Error **errp)
     s->irqs = g_new0(qemu_irq, s->num_buttons);
     s->pressed = g_new0(uint8_t, s->num_buttons);
     qdev_init_gpio_out(dev, s->irqs, s->num_buttons);
-    qemu_add_kbd_event_handler(stellaris_gamepad_put_key, dev);
+    qemu_input_handler_register(dev, &stellaris_gamepad_handler);
 }
 
 static void stellaris_gamepad_reset_enter(Object *obj, ResetType type)