root / hw / hid.h @ 136be99e
History | View | Annotate | Download (2.5 kB)
1 | dcfda673 | Gerd Hoffmann | #ifndef QEMU_HID_H
|
---|---|---|---|
2 | dcfda673 | Gerd Hoffmann | #define QEMU_HID_H
|
3 | dcfda673 | Gerd Hoffmann | |
4 | 701a8f76 | Paolo Bonzini | #include "vmstate.h" |
5 | 701a8f76 | Paolo Bonzini | |
6 | dcfda673 | Gerd Hoffmann | #define HID_MOUSE 1 |
7 | dcfda673 | Gerd Hoffmann | #define HID_TABLET 2 |
8 | dcfda673 | Gerd Hoffmann | #define HID_KEYBOARD 3 |
9 | dcfda673 | Gerd Hoffmann | |
10 | dcfda673 | Gerd Hoffmann | typedef struct HIDPointerEvent { |
11 | dcfda673 | Gerd Hoffmann | int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */
|
12 | dcfda673 | Gerd Hoffmann | int32_t dz, buttons_state; |
13 | dcfda673 | Gerd Hoffmann | } HIDPointerEvent; |
14 | dcfda673 | Gerd Hoffmann | |
15 | dcfda673 | Gerd Hoffmann | #define QUEUE_LENGTH 16 /* should be enough for a triple-click */ |
16 | dcfda673 | Gerd Hoffmann | #define QUEUE_MASK (QUEUE_LENGTH-1u) |
17 | dcfda673 | Gerd Hoffmann | #define QUEUE_INCR(v) ((v)++, (v) &= QUEUE_MASK)
|
18 | dcfda673 | Gerd Hoffmann | |
19 | dcfda673 | Gerd Hoffmann | typedef struct HIDState HIDState; |
20 | dcfda673 | Gerd Hoffmann | typedef void (*HIDEventFunc)(HIDState *s); |
21 | dcfda673 | Gerd Hoffmann | |
22 | dcfda673 | Gerd Hoffmann | typedef struct HIDMouseState { |
23 | dcfda673 | Gerd Hoffmann | HIDPointerEvent queue[QUEUE_LENGTH]; |
24 | dcfda673 | Gerd Hoffmann | int mouse_grabbed;
|
25 | dcfda673 | Gerd Hoffmann | QEMUPutMouseEntry *eh_entry; |
26 | dcfda673 | Gerd Hoffmann | } HIDMouseState; |
27 | dcfda673 | Gerd Hoffmann | |
28 | dcfda673 | Gerd Hoffmann | typedef struct HIDKeyboardState { |
29 | dcfda673 | Gerd Hoffmann | uint32_t keycodes[QUEUE_LENGTH]; |
30 | dcfda673 | Gerd Hoffmann | uint16_t modifiers; |
31 | dcfda673 | Gerd Hoffmann | uint8_t leds; |
32 | dcfda673 | Gerd Hoffmann | uint8_t key[16];
|
33 | dcfda673 | Gerd Hoffmann | int32_t keys; |
34 | dcfda673 | Gerd Hoffmann | } HIDKeyboardState; |
35 | dcfda673 | Gerd Hoffmann | |
36 | dcfda673 | Gerd Hoffmann | struct HIDState {
|
37 | dcfda673 | Gerd Hoffmann | union {
|
38 | dcfda673 | Gerd Hoffmann | HIDMouseState ptr; |
39 | dcfda673 | Gerd Hoffmann | HIDKeyboardState kbd; |
40 | dcfda673 | Gerd Hoffmann | }; |
41 | dcfda673 | Gerd Hoffmann | uint32_t head; /* index into circular queue */
|
42 | dcfda673 | Gerd Hoffmann | uint32_t n; |
43 | dcfda673 | Gerd Hoffmann | int kind;
|
44 | b069d348 | Gerd Hoffmann | int32_t protocol; |
45 | b069d348 | Gerd Hoffmann | uint8_t idle; |
46 | b069d348 | Gerd Hoffmann | int64_t next_idle_clock; |
47 | dcfda673 | Gerd Hoffmann | HIDEventFunc event; |
48 | dcfda673 | Gerd Hoffmann | }; |
49 | dcfda673 | Gerd Hoffmann | |
50 | dcfda673 | Gerd Hoffmann | void hid_init(HIDState *hs, int kind, HIDEventFunc event); |
51 | dcfda673 | Gerd Hoffmann | void hid_reset(HIDState *hs);
|
52 | dcfda673 | Gerd Hoffmann | void hid_free(HIDState *hs);
|
53 | dcfda673 | Gerd Hoffmann | |
54 | dcfda673 | Gerd Hoffmann | bool hid_has_events(HIDState *hs);
|
55 | b069d348 | Gerd Hoffmann | void hid_set_next_idle(HIDState *hs, int64_t curtime);
|
56 | 21635e12 | Gerd Hoffmann | void hid_pointer_activate(HIDState *hs);
|
57 | dcfda673 | Gerd Hoffmann | int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len); |
58 | dcfda673 | Gerd Hoffmann | int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len); |
59 | dcfda673 | Gerd Hoffmann | int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len); |
60 | dcfda673 | Gerd Hoffmann | |
61 | 701a8f76 | Paolo Bonzini | extern const VMStateDescription vmstate_hid_keyboard_device; |
62 | 701a8f76 | Paolo Bonzini | |
63 | 701a8f76 | Paolo Bonzini | #define VMSTATE_HID_KEYBOARD_DEVICE(_field, _state) { \
|
64 | 701a8f76 | Paolo Bonzini | .name = (stringify(_field)), \ |
65 | 701a8f76 | Paolo Bonzini | .size = sizeof(HIDState), \
|
66 | 701a8f76 | Paolo Bonzini | .vmsd = &vmstate_hid_keyboard_device, \ |
67 | 701a8f76 | Paolo Bonzini | .flags = VMS_STRUCT, \ |
68 | 701a8f76 | Paolo Bonzini | .offset = vmstate_offset_value(_state, _field, HIDState), \ |
69 | 701a8f76 | Paolo Bonzini | } |
70 | 701a8f76 | Paolo Bonzini | |
71 | 701a8f76 | Paolo Bonzini | extern const VMStateDescription vmstate_hid_ptr_device; |
72 | 701a8f76 | Paolo Bonzini | |
73 | 701a8f76 | Paolo Bonzini | #define VMSTATE_HID_POINTER_DEVICE(_field, _state) { \
|
74 | 701a8f76 | Paolo Bonzini | .name = (stringify(_field)), \ |
75 | 701a8f76 | Paolo Bonzini | .size = sizeof(HIDState), \
|
76 | 701a8f76 | Paolo Bonzini | .vmsd = &vmstate_hid_ptr_device, \ |
77 | 701a8f76 | Paolo Bonzini | .flags = VMS_STRUCT, \ |
78 | 701a8f76 | Paolo Bonzini | .offset = vmstate_offset_value(_state, _field, HIDState), \ |
79 | 701a8f76 | Paolo Bonzini | } |
80 | 701a8f76 | Paolo Bonzini | |
81 | 701a8f76 | Paolo Bonzini | |
82 | dcfda673 | Gerd Hoffmann | #endif /* QEMU_HID_H */ |