Revision 68735b6c hw/usb-hid.c
b/hw/usb-hid.c | ||
---|---|---|
66 | 66 |
int kind; |
67 | 67 |
int protocol; |
68 | 68 |
uint8_t idle; |
69 |
int64_t next_idle_clock; |
|
69 | 70 |
int changed; |
70 | 71 |
void *datain_opaque; |
71 | 72 |
void (*datain)(void *); |
... | ... | |
630 | 631 |
s->protocol = 1; |
631 | 632 |
} |
632 | 633 |
|
634 |
static void usb_hid_set_next_idle(USBHIDState *s, int64_t curtime) |
|
635 |
{ |
|
636 |
s->next_idle_clock = curtime + (get_ticks_per_sec() * s->idle * 4) / 1000; |
|
637 |
} |
|
638 |
|
|
633 | 639 |
static int usb_hid_handle_control(USBDevice *dev, int request, int value, |
634 | 640 |
int index, int length, uint8_t *data) |
635 | 641 |
{ |
... | ... | |
795 | 801 |
break; |
796 | 802 |
case SET_IDLE: |
797 | 803 |
s->idle = (uint8_t) (value >> 8); |
804 |
usb_hid_set_next_idle(s, qemu_get_clock(vm_clock)); |
|
798 | 805 |
ret = 0; |
799 | 806 |
break; |
800 | 807 |
default: |
... | ... | |
813 | 820 |
switch(p->pid) { |
814 | 821 |
case USB_TOKEN_IN: |
815 | 822 |
if (p->devep == 1) { |
816 |
/* TODO: Implement finite idle delays. */
|
|
817 |
if (!(s->changed || s->idle))
|
|
823 |
int64_t curtime = qemu_get_clock(vm_clock);
|
|
824 |
if (!s->changed && (!s->idle || s->next_idle_clock - curtime > 0))
|
|
818 | 825 |
return USB_RET_NAK; |
826 |
usb_hid_set_next_idle(s, curtime); |
|
819 | 827 |
s->changed = 0; |
820 | 828 |
if (s->kind == USB_MOUSE) |
821 | 829 |
ret = usb_mouse_poll(s, p->data, p->len); |
Also available in: Unified diff