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