xref: /qemu/include/hw/virtio/virtio-input.h (revision f4924974c7c72560f68ab298ac25a525a28a2124)
12a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_INPUT_H
22a6a4076SMarkus Armbruster #define QEMU_VIRTIO_INPUT_H
3f73ddbadSGerd Hoffmann 
4f73ddbadSGerd Hoffmann #include "ui/input.h"
5f73ddbadSGerd Hoffmann 
6f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
7f73ddbadSGerd Hoffmann /* virtio input protocol                                             */
8f73ddbadSGerd Hoffmann 
9f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_ids.h"
10f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_input.h"
11f73ddbadSGerd Hoffmann 
12f73ddbadSGerd Hoffmann typedef struct virtio_input_absinfo virtio_input_absinfo;
13f73ddbadSGerd Hoffmann typedef struct virtio_input_config virtio_input_config;
14f73ddbadSGerd Hoffmann typedef struct virtio_input_event virtio_input_event;
15f73ddbadSGerd Hoffmann 
16f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
17f73ddbadSGerd Hoffmann /* qemu internals                                                    */
18f73ddbadSGerd Hoffmann 
19f73ddbadSGerd Hoffmann #define TYPE_VIRTIO_INPUT "virtio-input-device"
20f73ddbadSGerd Hoffmann #define VIRTIO_INPUT(obj) \
21f73ddbadSGerd Hoffmann         OBJECT_CHECK(VirtIOInput, (obj), TYPE_VIRTIO_INPUT)
22f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_GET_PARENT_CLASS(obj) \
23f73ddbadSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT)
24f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_GET_CLASS(obj) \
25f73ddbadSGerd Hoffmann         OBJECT_GET_CLASS(VirtIOInputClass, obj, TYPE_VIRTIO_INPUT)
26f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_CLASS(klass) \
27f73ddbadSGerd Hoffmann         OBJECT_CLASS_CHECK(VirtIOInputClass, klass, TYPE_VIRTIO_INPUT)
28f73ddbadSGerd Hoffmann 
29e63d114bSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HID "virtio-input-hid-device"
30e63d114bSGerd Hoffmann #define TYPE_VIRTIO_KEYBOARD  "virtio-keyboard-device"
31e63d114bSGerd Hoffmann #define TYPE_VIRTIO_MOUSE     "virtio-mouse-device"
32e63d114bSGerd Hoffmann #define TYPE_VIRTIO_TABLET    "virtio-tablet-device"
3355a1d80aSGerd Hoffmann 
3455a1d80aSGerd Hoffmann #define VIRTIO_INPUT_HID(obj) \
3555a1d80aSGerd Hoffmann         OBJECT_CHECK(VirtIOInputHID, (obj), TYPE_VIRTIO_INPUT_HID)
3655a1d80aSGerd Hoffmann #define VIRTIO_INPUT_HID_GET_PARENT_CLASS(obj) \
3755a1d80aSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HID)
3855a1d80aSGerd Hoffmann 
39006a5edeSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HOST   "virtio-input-host-device"
40006a5edeSGerd Hoffmann #define VIRTIO_INPUT_HOST(obj) \
41006a5edeSGerd Hoffmann         OBJECT_CHECK(VirtIOInputHost, (obj), TYPE_VIRTIO_INPUT_HOST)
42006a5edeSGerd Hoffmann #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \
43006a5edeSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST)
44006a5edeSGerd Hoffmann 
45f73ddbadSGerd Hoffmann typedef struct VirtIOInput VirtIOInput;
46f73ddbadSGerd Hoffmann typedef struct VirtIOInputClass VirtIOInputClass;
47f73ddbadSGerd Hoffmann typedef struct VirtIOInputConfig VirtIOInputConfig;
4855a1d80aSGerd Hoffmann typedef struct VirtIOInputHID VirtIOInputHID;
49006a5edeSGerd Hoffmann typedef struct VirtIOInputHost VirtIOInputHost;
50f73ddbadSGerd Hoffmann 
51f73ddbadSGerd Hoffmann struct VirtIOInputConfig {
52f73ddbadSGerd Hoffmann     virtio_input_config               config;
53f73ddbadSGerd Hoffmann     QTAILQ_ENTRY(VirtIOInputConfig)   node;
54f73ddbadSGerd Hoffmann };
55f73ddbadSGerd Hoffmann 
56f73ddbadSGerd Hoffmann struct VirtIOInput {
57f73ddbadSGerd Hoffmann     VirtIODevice                      parent_obj;
58f73ddbadSGerd Hoffmann     uint8_t                           cfg_select;
59f73ddbadSGerd Hoffmann     uint8_t                           cfg_subsel;
60f73ddbadSGerd Hoffmann     uint32_t                          cfg_size;
61f73ddbadSGerd Hoffmann     QTAILQ_HEAD(, VirtIOInputConfig)  cfg_list;
62f73ddbadSGerd Hoffmann     VirtQueue                         *evt, *sts;
636f2b9a5bSGerd Hoffmann     char                              *serial;
64f73ddbadSGerd Hoffmann 
6557094547SLadi Prosek     struct {
6657094547SLadi Prosek         virtio_input_event event;
6757094547SLadi Prosek         VirtQueueElement *elem;
6857094547SLadi Prosek     }                                 *queue;
69f73ddbadSGerd Hoffmann     uint32_t                          qindex, qsize;
70f73ddbadSGerd Hoffmann 
71f73ddbadSGerd Hoffmann     bool                              active;
72f73ddbadSGerd Hoffmann };
73f73ddbadSGerd Hoffmann 
74f73ddbadSGerd Hoffmann struct VirtIOInputClass {
75f73ddbadSGerd Hoffmann     /*< private >*/
76f73ddbadSGerd Hoffmann     VirtioDeviceClass parent;
77f73ddbadSGerd Hoffmann     /*< public >*/
78f73ddbadSGerd Hoffmann 
79f73ddbadSGerd Hoffmann     DeviceRealize realize;
80f73ddbadSGerd Hoffmann     DeviceUnrealize unrealize;
81f73ddbadSGerd Hoffmann     void (*change_active)(VirtIOInput *vinput);
82f73ddbadSGerd Hoffmann     void (*handle_status)(VirtIOInput *vinput, virtio_input_event *event);
83f73ddbadSGerd Hoffmann };
84f73ddbadSGerd Hoffmann 
8555a1d80aSGerd Hoffmann struct VirtIOInputHID {
8655a1d80aSGerd Hoffmann     VirtIOInput                       parent_obj;
875cce1733SGerd Hoffmann     char                              *display;
885cce1733SGerd Hoffmann     uint32_t                          head;
8955a1d80aSGerd Hoffmann     QemuInputHandler                  *handler;
9055a1d80aSGerd Hoffmann     QemuInputHandlerState             *hs;
9155a1d80aSGerd Hoffmann     int                               ledstate;
92*f4924974SGerd Hoffmann     bool                              wheel_axis;
9355a1d80aSGerd Hoffmann };
9455a1d80aSGerd Hoffmann 
95006a5edeSGerd Hoffmann struct VirtIOInputHost {
96006a5edeSGerd Hoffmann     VirtIOInput                       parent_obj;
97006a5edeSGerd Hoffmann     char                              *evdev;
98006a5edeSGerd Hoffmann     int                               fd;
99006a5edeSGerd Hoffmann };
100006a5edeSGerd Hoffmann 
101f73ddbadSGerd Hoffmann void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);
102f73ddbadSGerd Hoffmann void virtio_input_init_config(VirtIOInput *vinput,
103f73ddbadSGerd Hoffmann                               virtio_input_config *config);
104b065e275SLadi Prosek virtio_input_config *virtio_input_find_config(VirtIOInput *vinput,
105b065e275SLadi Prosek                                               uint8_t select,
106b065e275SLadi Prosek                                               uint8_t subsel);
107f73ddbadSGerd Hoffmann void virtio_input_add_config(VirtIOInput *vinput,
108f73ddbadSGerd Hoffmann                              virtio_input_config *config);
109f73ddbadSGerd Hoffmann void virtio_input_idstr_config(VirtIOInput *vinput,
110f73ddbadSGerd Hoffmann                                uint8_t select, const char *string);
111f73ddbadSGerd Hoffmann 
1122a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_INPUT_H */
113