xref: /qemu/include/hw/virtio/virtio-input.h (revision b065e275a8066c3ec478f326f39c5fc3c9db103c)
1f73ddbadSGerd Hoffmann #ifndef _QEMU_VIRTIO_INPUT_H
2f73ddbadSGerd Hoffmann #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 
65f73ddbadSGerd Hoffmann     virtio_input_event                *queue;
66f73ddbadSGerd Hoffmann     uint32_t                          qindex, qsize;
67f73ddbadSGerd Hoffmann 
68f73ddbadSGerd Hoffmann     bool                              active;
69f73ddbadSGerd Hoffmann };
70f73ddbadSGerd Hoffmann 
71f73ddbadSGerd Hoffmann struct VirtIOInputClass {
72f73ddbadSGerd Hoffmann     /*< private >*/
73f73ddbadSGerd Hoffmann     VirtioDeviceClass parent;
74f73ddbadSGerd Hoffmann     /*< public >*/
75f73ddbadSGerd Hoffmann 
76f73ddbadSGerd Hoffmann     DeviceRealize realize;
77f73ddbadSGerd Hoffmann     DeviceUnrealize unrealize;
78f73ddbadSGerd Hoffmann     void (*change_active)(VirtIOInput *vinput);
79f73ddbadSGerd Hoffmann     void (*handle_status)(VirtIOInput *vinput, virtio_input_event *event);
80f73ddbadSGerd Hoffmann };
81f73ddbadSGerd Hoffmann 
8255a1d80aSGerd Hoffmann struct VirtIOInputHID {
8355a1d80aSGerd Hoffmann     VirtIOInput                       parent_obj;
845cce1733SGerd Hoffmann     char                              *display;
855cce1733SGerd Hoffmann     uint32_t                          head;
8655a1d80aSGerd Hoffmann     QemuInputHandler                  *handler;
8755a1d80aSGerd Hoffmann     QemuInputHandlerState             *hs;
8855a1d80aSGerd Hoffmann     int                               ledstate;
8955a1d80aSGerd Hoffmann };
9055a1d80aSGerd Hoffmann 
91006a5edeSGerd Hoffmann struct VirtIOInputHost {
92006a5edeSGerd Hoffmann     VirtIOInput                       parent_obj;
93006a5edeSGerd Hoffmann     char                              *evdev;
94006a5edeSGerd Hoffmann     int                               fd;
95006a5edeSGerd Hoffmann };
96006a5edeSGerd Hoffmann 
97f73ddbadSGerd Hoffmann void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);
98f73ddbadSGerd Hoffmann void virtio_input_init_config(VirtIOInput *vinput,
99f73ddbadSGerd Hoffmann                               virtio_input_config *config);
100*b065e275SLadi Prosek virtio_input_config *virtio_input_find_config(VirtIOInput *vinput,
101*b065e275SLadi Prosek                                               uint8_t select,
102*b065e275SLadi Prosek                                               uint8_t subsel);
103f73ddbadSGerd Hoffmann void virtio_input_add_config(VirtIOInput *vinput,
104f73ddbadSGerd Hoffmann                              virtio_input_config *config);
105f73ddbadSGerd Hoffmann void virtio_input_idstr_config(VirtIOInput *vinput,
106f73ddbadSGerd Hoffmann                                uint8_t select, const char *string);
107f73ddbadSGerd Hoffmann 
108f73ddbadSGerd Hoffmann #endif /* _QEMU_VIRTIO_INPUT_H */
109