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