Lines Matching full:hs

75 bool hid_has_events(HIDState *hs)  in hid_has_events()  argument
77 return hs->n > 0 || hs->idle_pending; in hid_has_events()
82 HIDState *hs = opaque; in hid_idle_timer() local
84 hs->idle_pending = true; in hid_idle_timer()
85 hs->event(hs); in hid_idle_timer()
88 static void hid_del_idle_timer(HIDState *hs) in hid_del_idle_timer() argument
90 if (hs->idle_timer) { in hid_del_idle_timer()
91 timer_free(hs->idle_timer); in hid_del_idle_timer()
92 hs->idle_timer = NULL; in hid_del_idle_timer()
96 void hid_set_next_idle(HIDState *hs) in hid_set_next_idle() argument
98 if (hs->idle) { in hid_set_next_idle()
100 NANOSECONDS_PER_SECOND * hs->idle * 4 / 1000; in hid_set_next_idle()
101 if (!hs->idle_timer) { in hid_set_next_idle()
102 hs->idle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, hid_idle_timer, hs); in hid_set_next_idle()
104 timer_mod_ns(hs->idle_timer, expire_time); in hid_set_next_idle()
106 hid_del_idle_timer(hs); in hid_set_next_idle()
120 HIDState *hs = (HIDState *)dev; in hid_pointer_event() local
125 assert(hs->n < QUEUE_LENGTH); in hid_pointer_event()
126 e = &hs->ptr.queue[(hs->head + hs->n) & QUEUE_MASK]; in hid_pointer_event()
170 HIDState *hs = (HIDState *)dev; in hid_pointer_sync() local
174 if (hs->n == QUEUE_LENGTH-1) { in hid_pointer_sync()
182 prev = &hs->ptr.queue[(hs->head + hs->n - 1) & QUEUE_MASK]; in hid_pointer_sync()
183 curr = &hs->ptr.queue[(hs->head + hs->n) & QUEUE_MASK]; in hid_pointer_sync()
184 next = &hs->ptr.queue[(hs->head + hs->n + 1) & QUEUE_MASK]; in hid_pointer_sync()
186 if (hs->n > 0) { in hid_pointer_sync()
200 if (hs->kind == HID_MOUSE) { in hid_pointer_sync()
213 if (hs->kind == HID_MOUSE) { in hid_pointer_sync()
223 hs->n++; in hid_pointer_sync()
224 hs->event(hs); in hid_pointer_sync()
231 HIDState *hs = (HIDState *)dev; in hid_keyboard_event() local
239 if (hs->n + count > QUEUE_LENGTH) { in hid_keyboard_event()
244 slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++; in hid_keyboard_event()
245 hs->kbd.keycodes[slot] = scancodes[i]; in hid_keyboard_event()
247 hs->event(hs); in hid_keyboard_event()
250 static void hid_keyboard_process_keycode(HIDState *hs) in hid_keyboard_process_keycode() argument
255 if (hs->n == 0) { in hid_keyboard_process_keycode()
258 slot = hs->head & QUEUE_MASK; QUEUE_INCR(hs->head); hs->n--; in hid_keyboard_process_keycode()
259 keycode = hs->kbd.keycodes[slot]; in hid_keyboard_process_keycode()
261 if (!hs->n) { in hid_keyboard_process_keycode()
266 index = key | ((hs->kbd.modifiers & (1 << 8)) >> 1); in hid_keyboard_process_keycode()
268 hs->kbd.modifiers &= ~(1 << 8); in hid_keyboard_process_keycode()
276 if (hs->kbd.modifiers & (1 << 9)) { in hid_keyboard_process_keycode()
282 hs->kbd.modifiers ^= (1 << 8) | (1 << 9); in hid_keyboard_process_keycode()
291 hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f)); in hid_keyboard_process_keycode()
297 * hs->kbd.modifiers implement a state machine that detects the in hid_keyboard_process_keycode()
302 hs->kbd.modifiers |= 1 << (hid_code & 0x0f); in hid_keyboard_process_keycode()
313 for (i = hs->kbd.keys - 1; i >= 0; i--) { in hid_keyboard_process_keycode()
314 if (hs->kbd.key[i] == hid_code) { in hid_keyboard_process_keycode()
315 hs->kbd.key[i] = hs->kbd.key[-- hs->kbd.keys]; in hid_keyboard_process_keycode()
316 hs->kbd.key[hs->kbd.keys] = 0x00; in hid_keyboard_process_keycode()
324 for (i = hs->kbd.keys - 1; i >= 0; i--) { in hid_keyboard_process_keycode()
325 if (hs->kbd.key[i] == hid_code) { in hid_keyboard_process_keycode()
330 if (hs->kbd.keys < sizeof(hs->kbd.key)) { in hid_keyboard_process_keycode()
331 hs->kbd.key[hs->kbd.keys++] = hid_code; in hid_keyboard_process_keycode()
350 void hid_pointer_activate(HIDState *hs) in hid_pointer_activate() argument
352 if (!hs->ptr.mouse_grabbed) { in hid_pointer_activate()
353 qemu_input_handler_activate(hs->s); in hid_pointer_activate()
354 hs->ptr.mouse_grabbed = 1; in hid_pointer_activate()
358 int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len) in hid_pointer_poll() argument
364 hs->idle_pending = false; in hid_pointer_poll()
366 hid_pointer_activate(hs); in hid_pointer_poll()
370 index = (hs->n ? hs->head : hs->head - 1); in hid_pointer_poll()
371 e = &hs->ptr.queue[index & QUEUE_MASK]; in hid_pointer_poll()
373 if (hs->kind == HID_MOUSE) { in hid_pointer_poll()
385 if (hs->n && in hid_pointer_poll()
387 (hs->kind == HID_TABLET || (!e->xdx && !e->ydy))) { in hid_pointer_poll()
389 QUEUE_INCR(hs->head); in hid_pointer_poll()
390 hs->n--; in hid_pointer_poll()
396 switch (hs->kind) { in hid_pointer_poll()
440 int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len) in hid_keyboard_poll() argument
442 hs->idle_pending = false; in hid_keyboard_poll()
448 hid_keyboard_process_keycode(hs); in hid_keyboard_poll()
450 buf[0] = hs->kbd.modifiers & 0xff; in hid_keyboard_poll()
452 if (hs->kbd.keys > 6) { in hid_keyboard_poll()
455 memcpy(buf + 2, hs->kbd.key, MIN(8, len) - 2); in hid_keyboard_poll()
461 int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len) in hid_keyboard_write() argument
470 hs->kbd.leds = buf[0]; in hid_keyboard_write()
471 if (hs->kbd.leds & 0x04) { in hid_keyboard_write()
474 if (hs->kbd.leds & 0x01) { in hid_keyboard_write()
477 if (hs->kbd.leds & 0x02) { in hid_keyboard_write()
485 void hid_reset(HIDState *hs) in hid_reset() argument
487 switch (hs->kind) { in hid_reset()
489 memset(hs->kbd.keycodes, 0, sizeof(hs->kbd.keycodes)); in hid_reset()
490 memset(hs->kbd.key, 0, sizeof(hs->kbd.key)); in hid_reset()
491 hs->kbd.keys = 0; in hid_reset()
492 hs->kbd.modifiers = 0; in hid_reset()
496 memset(hs->ptr.queue, 0, sizeof(hs->ptr.queue)); in hid_reset()
499 hs->head = 0; in hid_reset()
500 hs->n = 0; in hid_reset()
501 hs->protocol = 1; in hid_reset()
502 hs->idle = 0; in hid_reset()
503 hs->idle_pending = false; in hid_reset()
504 hid_del_idle_timer(hs); in hid_reset()
507 void hid_free(HIDState *hs) in hid_free() argument
509 qemu_input_handler_unregister(hs->s); in hid_free()
510 hid_del_idle_timer(hs); in hid_free()
533 void hid_init(HIDState *hs, int kind, HIDEventFunc event) in hid_init() argument
535 hs->kind = kind; in hid_init()
536 hs->event = event; in hid_init()
538 if (hs->kind == HID_KEYBOARD) { in hid_init()
539 hs->s = qemu_input_handler_register((DeviceState *)hs, in hid_init()
541 qemu_input_handler_activate(hs->s); in hid_init()
542 } else if (hs->kind == HID_MOUSE) { in hid_init()
543 hs->s = qemu_input_handler_register((DeviceState *)hs, in hid_init()
545 } else if (hs->kind == HID_TABLET) { in hid_init()
546 hs->s = qemu_input_handler_register((DeviceState *)hs, in hid_init()