qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] USB HID does not support Set_Idle


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] USB HID does not support Set_Idle
Date: Fri, 19 Feb 2010 15:48:14 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091209 Fedora/3.0-4.fc12 Lightning/1.0pre Thunderbird/3.0

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 via email to

[Prev in Thread] Current Thread [Next in Thread]