1 #ifndef QEMU_VIRTIO_INPUT_H 2 #define QEMU_VIRTIO_INPUT_H 3 4 #include "ui/input.h" 5 #include "sysemu/vhost-user-backend.h" 6 7 /* ----------------------------------------------------------------- */ 8 /* virtio input protocol */ 9 10 #include "standard-headers/linux/virtio_ids.h" 11 #include "standard-headers/linux/virtio_input.h" 12 13 typedef struct virtio_input_absinfo virtio_input_absinfo; 14 typedef struct virtio_input_config virtio_input_config; 15 typedef struct virtio_input_event virtio_input_event; 16 17 /* ----------------------------------------------------------------- */ 18 /* qemu internals */ 19 20 #define TYPE_VIRTIO_INPUT "virtio-input-device" 21 #define VIRTIO_INPUT(obj) \ 22 OBJECT_CHECK(VirtIOInput, (obj), TYPE_VIRTIO_INPUT) 23 #define VIRTIO_INPUT_GET_PARENT_CLASS(obj) \ 24 OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT) 25 #define VIRTIO_INPUT_GET_CLASS(obj) \ 26 OBJECT_GET_CLASS(VirtIOInputClass, obj, TYPE_VIRTIO_INPUT) 27 #define VIRTIO_INPUT_CLASS(klass) \ 28 OBJECT_CLASS_CHECK(VirtIOInputClass, klass, TYPE_VIRTIO_INPUT) 29 30 #define TYPE_VIRTIO_INPUT_HID "virtio-input-hid-device" 31 #define TYPE_VIRTIO_KEYBOARD "virtio-keyboard-device" 32 #define TYPE_VIRTIO_MOUSE "virtio-mouse-device" 33 #define TYPE_VIRTIO_TABLET "virtio-tablet-device" 34 35 #define VIRTIO_INPUT_HID(obj) \ 36 OBJECT_CHECK(VirtIOInputHID, (obj), TYPE_VIRTIO_INPUT_HID) 37 #define VIRTIO_INPUT_HID_GET_PARENT_CLASS(obj) \ 38 OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HID) 39 40 #define TYPE_VIRTIO_INPUT_HOST "virtio-input-host-device" 41 #define VIRTIO_INPUT_HOST(obj) \ 42 OBJECT_CHECK(VirtIOInputHost, (obj), TYPE_VIRTIO_INPUT_HOST) 43 #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \ 44 OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST) 45 46 #define TYPE_VHOST_USER_INPUT "vhost-user-input" 47 #define VHOST_USER_INPUT(obj) \ 48 OBJECT_CHECK(VHostUserInput, (obj), TYPE_VHOST_USER_INPUT) 49 #define VHOST_USER_INPUT_GET_PARENT_CLASS(obj) \ 50 OBJECT_GET_PARENT_CLASS(obj, TYPE_VHOST_USER_INPUT) 51 52 typedef struct VirtIOInput VirtIOInput; 53 typedef struct VirtIOInputClass VirtIOInputClass; 54 typedef struct VirtIOInputConfig VirtIOInputConfig; 55 typedef struct VirtIOInputHID VirtIOInputHID; 56 typedef struct VirtIOInputHost VirtIOInputHost; 57 typedef struct VHostUserInput VHostUserInput; 58 59 struct VirtIOInputConfig { 60 virtio_input_config config; 61 QTAILQ_ENTRY(VirtIOInputConfig) node; 62 }; 63 64 struct VirtIOInput { 65 VirtIODevice parent_obj; 66 uint8_t cfg_select; 67 uint8_t cfg_subsel; 68 uint32_t cfg_size; 69 QTAILQ_HEAD(, VirtIOInputConfig) cfg_list; 70 VirtQueue *evt, *sts; 71 char *serial; 72 73 struct { 74 virtio_input_event event; 75 VirtQueueElement *elem; 76 } *queue; 77 uint32_t qindex, qsize; 78 79 bool active; 80 }; 81 82 struct VirtIOInputClass { 83 /*< private >*/ 84 VirtioDeviceClass parent; 85 /*< public >*/ 86 87 DeviceRealize realize; 88 DeviceUnrealize unrealize; 89 void (*change_active)(VirtIOInput *vinput); 90 void (*handle_status)(VirtIOInput *vinput, virtio_input_event *event); 91 }; 92 93 struct VirtIOInputHID { 94 VirtIOInput parent_obj; 95 char *display; 96 uint32_t head; 97 QemuInputHandler *handler; 98 QemuInputHandlerState *hs; 99 int ledstate; 100 bool wheel_axis; 101 }; 102 103 struct VirtIOInputHost { 104 VirtIOInput parent_obj; 105 char *evdev; 106 int fd; 107 }; 108 109 struct VHostUserInput { 110 VirtIOInput parent_obj; 111 112 VhostUserBackend *vhost; 113 }; 114 115 void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event); 116 void virtio_input_init_config(VirtIOInput *vinput, 117 virtio_input_config *config); 118 virtio_input_config *virtio_input_find_config(VirtIOInput *vinput, 119 uint8_t select, 120 uint8_t subsel); 121 void virtio_input_add_config(VirtIOInput *vinput, 122 virtio_input_config *config); 123 void virtio_input_idstr_config(VirtIOInput *vinput, 124 uint8_t select, const char *string); 125 126 #endif /* QEMU_VIRTIO_INPUT_H */ 127