All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Kevin O'Connor <kevin@koconnor.net>
Cc: seabios@seabios.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] USB HID does not support Set_Idle
Date: Fri, 19 Feb 2010 15:48:14 -0600	[thread overview]
Message-ID: <4B7F071E.5090400@codemonkey.ws> (raw)
In-Reply-To: <20100213233217.GC18169@morn.localdomain>

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);
>
>
>
>    

      reply	other threads:[~2010-02-19 21:48 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-13 23:32 [Qemu-devel] [PATCH] USB HID does not support Set_Idle Kevin O'Connor
2010-02-19 21:48 ` Anthony Liguori [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B7F071E.5090400@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=kevin@koconnor.net \
    --cc=qemu-devel@nongnu.org \
    --cc=seabios@seabios.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.