12a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_INPUT_H 22a6a4076SMarkus Armbruster #define QEMU_VIRTIO_INPUT_H 3f73ddbadSGerd Hoffmann 4*bad38726SLeo Yan #include "hw/virtio/vhost-user.h" 5*bad38726SLeo Yan #include "hw/virtio/vhost-user-base.h" 6f73ddbadSGerd Hoffmann #include "ui/input.h" 79c4d05b7SMarc-André Lureau #include "sysemu/vhost-user-backend.h" 8f73ddbadSGerd Hoffmann 9f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */ 10f73ddbadSGerd Hoffmann /* virtio input protocol */ 11f73ddbadSGerd Hoffmann 12f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_ids.h" 13f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_input.h" 14db1015e9SEduardo Habkost #include "qom/object.h" 15f73ddbadSGerd Hoffmann 16f73ddbadSGerd Hoffmann typedef struct virtio_input_absinfo virtio_input_absinfo; 17f73ddbadSGerd Hoffmann typedef struct virtio_input_config virtio_input_config; 18f73ddbadSGerd Hoffmann typedef struct virtio_input_event virtio_input_event; 19f73ddbadSGerd Hoffmann 20f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */ 21f73ddbadSGerd Hoffmann /* qemu internals */ 22f73ddbadSGerd Hoffmann 23f73ddbadSGerd Hoffmann #define TYPE_VIRTIO_INPUT "virtio-input-device" 24c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(VirtIOInput, VirtIOInputClass, 2530b5707cSEduardo Habkost VIRTIO_INPUT) 26f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_GET_PARENT_CLASS(obj) \ 27f73ddbadSGerd Hoffmann OBJECT_GET_PARENT_CLASS(obj, 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" 338e9ebd75SSergio Lopez #define TYPE_VIRTIO_MULTITOUCH "virtio-multitouch-device" 3455a1d80aSGerd Hoffmann 358063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHID, 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" 408063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHost, VIRTIO_INPUT_HOST) 41006a5edeSGerd Hoffmann #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \ 42006a5edeSGerd Hoffmann OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST) 43006a5edeSGerd Hoffmann 449c4d05b7SMarc-André Lureau #define TYPE_VHOST_USER_INPUT "vhost-user-input" 458063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VHostUserInput, VHOST_USER_INPUT) 469c4d05b7SMarc-André Lureau #define VHOST_USER_INPUT_GET_PARENT_CLASS(obj) \ 479c4d05b7SMarc-André Lureau OBJECT_GET_PARENT_CLASS(obj, TYPE_VHOST_USER_INPUT) 489c4d05b7SMarc-André Lureau 49f73ddbadSGerd Hoffmann typedef struct VirtIOInputConfig VirtIOInputConfig; 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; 89b1be65f6SPhilippe Mathieu-Daudé const QemuInputHandler *handler; 9055a1d80aSGerd Hoffmann QemuInputHandlerState *hs; 9155a1d80aSGerd Hoffmann int ledstate; 92f4924974SGerd 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 1019c4d05b7SMarc-André Lureau struct VHostUserInput { 102*bad38726SLeo Yan VHostUserBase parent_obj; 1039c4d05b7SMarc-André Lureau }; 1049c4d05b7SMarc-André Lureau 105f73ddbadSGerd Hoffmann void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event); 106f73ddbadSGerd Hoffmann void virtio_input_init_config(VirtIOInput *vinput, 107f73ddbadSGerd Hoffmann virtio_input_config *config); 108b065e275SLadi Prosek virtio_input_config *virtio_input_find_config(VirtIOInput *vinput, 109b065e275SLadi Prosek uint8_t select, 110b065e275SLadi Prosek uint8_t subsel); 111f73ddbadSGerd Hoffmann void virtio_input_add_config(VirtIOInput *vinput, 112f73ddbadSGerd Hoffmann virtio_input_config *config); 113f73ddbadSGerd Hoffmann void virtio_input_idstr_config(VirtIOInput *vinput, 114f73ddbadSGerd Hoffmann uint8_t select, const char *string); 115f73ddbadSGerd Hoffmann 1162a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_INPUT_H */ 117