[SeaBIOS] [Qemu-devel] [PATCH] USB HID does not support Set_Idle
Anthony Liguori
anthony at codemonkey.ws
Fri Feb 19 22:48:14 CET 2010
On 02/13/2010 05:32 PM, Kevin O'Connor wrote:
> I found that the QEMU USB keyboard support does not work properly with
> the Set_Idle command. Once a non-zero value is given to Set_Idle,
> then the keyboard reports an event on every poll - not based on the
> time issued in the Set_Idle command.
>
> I changed the code (see patch below) and it works for me. I'm not
> that familiar with the qemu internals, so I'm not sure if this is the
> best way to implement this feature.
>
> -Kevin
>
Applied. Thanks.
Regards,
Anthony Liguori
>
> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
> index 4f320d7..bf456bb 100644
> --- a/hw/usb-hid.c
> +++ b/hw/usb-hid.c
> @@ -66,6 +66,7 @@ typedef struct USBHIDState {
> int kind;
> int protocol;
> uint8_t idle;
> + int64_t next_idle_clock;
> int changed;
> void *datain_opaque;
> void (*datain)(void *);
> @@ -630,6 +631,11 @@ static void usb_keyboard_handle_reset(USBDevice *dev)
> s->protocol = 1;
> }
>
> +static void usb_hid_set_next_idle(USBHIDState *s, int64_t curtime)
> +{
> + s->next_idle_clock = curtime + (get_ticks_per_sec() * s->idle * 4) / 1000;
> +}
> +
> static int usb_hid_handle_control(USBDevice *dev, int request, int value,
> int index, int length, uint8_t *data)
> {
> @@ -795,6 +801,7 @@ static int usb_hid_handle_control(USBDevice *dev, int request, int value,
> break;
> case SET_IDLE:
> s->idle = (uint8_t) (value>> 8);
> + usb_hid_set_next_idle(s, qemu_get_clock(vm_clock));
> ret = 0;
> break;
> default:
> @@ -813,9 +820,10 @@ static int usb_hid_handle_data(USBDevice *dev, USBPacket *p)
> switch(p->pid) {
> case USB_TOKEN_IN:
> if (p->devep == 1) {
> - /* TODO: Implement finite idle delays. */
> - if (!(s->changed || s->idle))
> + int64_t curtime = qemu_get_clock(vm_clock);
> + if (!s->changed&& (!s->idle || s->next_idle_clock - curtime> 0))
> return USB_RET_NAK;
> + usb_hid_set_next_idle(s, curtime);
> s->changed = 0;
> if (s->kind == USB_MOUSE)
> ret = usb_mouse_poll(s, p->data, p->len);
>
>
>
>
More information about the SeaBIOS
mailing list