All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lonnie Mendez <lmendez19@austin.rr.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Large USB patch
Date: Fri, 21 Apr 2006 15:50:30 -0500	[thread overview]
Message-ID: <44494596.3070808@austin.rr.com> (raw)
In-Reply-To: <444926AC.3070104@austin.rr.com>

[-- Attachment #1: Type: text/plain, Size: 457 bytes --]

   Another patch.  This one does a few things:

-fixes minor output bugs and some various OBO bugs
-adds some improvements to the emulated hub
-sets up the emulated devices to use the generic message handler (they 
now work again)
-makes tablet device visible to usb_add

   There are of course more bugs I've found.  Namely being able to 
usb_add any particular string with that string showing up as a new 
device even though no valid entry for it exists.

[-- Attachment #2: lusb-upd1.diff --]
[-- Type: text/plain, Size: 6133 bytes --]

--- a/qemu/hw/usb.c	2006-04-21 11:15:40.000000000 -0500
+++ b/qemu/hw/usb.c	2006-04-21 15:27:19.000000000 -0500
@@ -455,6 +455,10 @@
         /* we found a guest usb mouse */
         tree->dev= usb_mouse_init ();
         return add_usb_device (tree);
+    } else if (strcmp (tree->name,"tablet") == 0) {
+        /* we found a guest usb tablet */
+        tree->dev = usb_tablet_init ();
+        return add_usb_device (tree);
     }
     return 1;
 }
@@ -491,6 +495,7 @@
     usb_host_info();
     usb_hub_info();
     usb_mouse_info();
+    usb_tablet_info();
 }
 
 void usb_print_childs (USBTree *tree, int layer) {
--- a/qemu/hw/usb.h	2006-04-21 11:15:40.000000000 -0500
+++ b/qemu/hw/usb.h	2006-04-21 15:27:58.000000000 -0500
@@ -242,7 +242,9 @@
 void        usb_hub_info                (void);
 /* usb-hid.c */
 USBDevice*  usb_mouse_init              (void);
+USBDevice*  usb_tablet_init             (void);
 void        usb_mouse_info              (void);
+void        usb_tablet_info             (void);
 
 
 /* The usb dummy device functions, they exist only to make it easier to
--- a/qemu/hw/usb-hub.c	2006-04-21 11:15:40.000000000 -0500
+++ b/qemu/hw/usb-hub.c	2006-04-21 15:23:05.000000000 -0500
@@ -165,9 +165,9 @@
     0x0a,           /* u16  wHubCharacteristics; */
     0x00,           /*   (per-port OC, no power switching) */
     0x01,           /*  u8  bPwrOn2pwrGood; 2ms */
-    0x00,           /*  u8  bHubContrCurrent; 0 mA */
-    0x00,           /*  u8  DeviceRemovable; *** 7 Ports max *** */
-    0xff            /*  u8  PortPwrCtrlMask; *** 7 ports max *** */
+    0x00            /*  u8  bHubContrCurrent; 0 mA */
+
+    /* DeviceRemovable and PortPwrCtrlMask patched in later */
 };
 
 static int usb_hub_attach (USBDevice *hub, USBDevice *dev, int portnum)
@@ -260,6 +260,12 @@
         }
         ret = 0;
         break;
+    case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
+        if (value == 0 && index != 0x81) { /* clear ep halt */
+            goto fail;
+        }
+        ret = 0;
+        break;
     case DeviceOutRequest | USB_REQ_SET_FEATURE:
         if (value == USB_DEVICE_REMOTE_WAKEUP) {
             dev->remote_wakeup = 1;
@@ -282,6 +288,11 @@
         case USB_DT_CONFIG:
             memcpy(data, qemu_hub_config_descriptor, 
                    sizeof(qemu_hub_config_descriptor));
+
+            /* status change endpoint size based on number
+             * of ports */
+            data[22] = (s->nb_ports + 1 + 7) / 8;
+
             ret = sizeof(qemu_hub_config_descriptor);
             break;
         case USB_DT_STRING:
@@ -427,11 +438,29 @@
         }
         break;
     case GetHubDescriptor:
-        memcpy(data, qemu_hub_hub_descriptor, 
-               sizeof(qemu_hub_hub_descriptor));
-        data[2] = s->nb_ports;
-        ret = sizeof(qemu_hub_hub_descriptor);
-        break;
+        {
+            unsigned int n, limit, var_hub_size = 0;
+            memcpy(data, qemu_hub_hub_descriptor, 
+                   sizeof(qemu_hub_hub_descriptor));
+            data[2] = s->nb_ports;
+
+            /* fill DeviceRemovable bits */
+            limit = ((s->nb_ports + 1 + 7) / 8) + 7;
+            for (n = 7; n < limit; n++) {
+                data[n] = 0x00;
+                var_hub_size++;
+            }
+
+            /* fill PortPwrCtrlMask bits */
+            limit = limit + ((s->nb_ports + 7) / 8);
+            for (;n < limit; n++) {
+                data[n] = 0xff;
+                var_hub_size++;
+            }
+
+            ret = sizeof(qemu_hub_hub_descriptor) + var_hub_size;
+            break;
+        }
     default:
     fail:
         ret = USB_RET_STALL;
@@ -453,8 +482,11 @@
             unsigned int status;
             int i, n;
             n = (s->nb_ports + 1 + 7) / 8;
-            if (n > len)
+            if (len == 1) { /* FreeBSD uhub workaround */
+                n = 1;
+            } else if (n > len) {
                 return USB_RET_BABBLE;
+            }
             status = 0;
             for(i = 0; i < s->nb_ports; i++) {
                 port = &s->ports[i];
@@ -467,7 +499,7 @@
                 }
                 ret = n;
             } else {
-                ret = 0;
+                ret = USB_RET_NAK; /* usb_20 11.12.1 */
             }
         } else {
             goto fail;
@@ -541,6 +573,7 @@
         return NULL;
     dev->opaque=                s;
     dev->speed=                 USB_SPEED_FULL;
+    dev->handle_msg=            usb_generic_handle_msg;
     dev->handle_packet=         usb_hub_handle_packet;
     dev->handle_attach=         usb_hub_attach;
     dev->handle_reset=          usb_hub_handle_reset;
@@ -558,5 +591,5 @@
 
 void usb_hub_info(void) {
     term_printf("  Device usbhub, Manufacturer QEMU, Product QEMU USB Hub\n" );
-    term_printf ("     VendorID:ProductID 0000:0000, USB-Standard: 01.01\n");
+    term_printf ("     VendorID:ProductID 0000:0000, USB-Standard: 01.10\n");
 }
--- a/qemu/hw/usb-hid.c	2006-04-21 11:15:40.000000000 -0500
+++ b/qemu/hw/usb-hid.c	2006-04-21 15:31:55.000000000 -0500
@@ -515,6 +515,7 @@
         return NULL;
     dev->opaque=            s;
     dev->speed=             USB_SPEED_FULL;
+    dev->handle_msg=        usb_generic_handle_msg;
     dev->handle_packet=     usb_generic_handle_packet;
 
     dev->handle_reset=      usb_mouse_handle_reset;
@@ -536,6 +539,7 @@
         return NULL;
     dev->opaque=            s;
     dev->speed=             USB_SPEED_FULL;
+    dev->handle_msg=        usb_generic_handle_msg;
     dev->handle_packet=     usb_generic_handle_packet;
 
     dev->handle_reset=      usb_mouse_handle_reset;
@@ -549,5 +553,10 @@
 
 void usb_mouse_info() {
     term_printf("  Device mouse, Manufacturer QEMU, Product QEMU USB Mouse\n" );
-    term_printf ("     VendorID:ProductID 2706:0001, USB-Standard: 01.00\n");
+    term_printf ("     VendorID:ProductID 0627:0001, USB-Standard: 01.00\n");
+}
+
+void usb_tablet_info() {
+    term_printf("  Device tablet, Manufacturer QEMU, Product QEMU USB Tablet\n");
+    term_printf ("     VendorID:ProductID 0627:0001, USB-Standard: 01.00\n");
 }

  reply	other threads:[~2006-04-21 20:50 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-20 19:59 [Qemu-devel] Large USB patch nix.wie.weg
2006-04-21  2:23 ` Lonnie Mendez
2006-04-21  5:59   ` nix.wie.weg
2006-04-21  7:04     ` Lonnie Mendez
2006-04-21 14:53 ` Lonnie Mendez
2006-04-21 15:00   ` Lonnie Mendez
2006-04-21 15:50   ` Lonnie Mendez
2006-04-21 16:19     ` Lonnie Mendez
2006-04-21 16:29       ` nix.wie.weg
2006-04-21 17:28         ` Lonnie Mendez
2006-04-21 18:06           ` Lonnie Mendez
2006-04-21 18:38             ` Lonnie Mendez
2006-04-21 20:50               ` Lonnie Mendez [this message]
2006-04-22  9:33                 ` nix.wie.weg
2006-04-22 14:36                   ` Lonnie Mendez
2006-04-22 15:36                     ` nix.wie.weg
2006-04-22 15:38                       ` nix.wie.weg
2006-04-22 16:00                     ` nix.wie.weg
2006-04-22 16:19                       ` Lonnie Mendez
2006-04-22 16:35                         ` nix.wie.weg
2006-04-23  3:38                           ` Lonnie Mendez
2006-04-23 21:54                             ` nix.wie.weg
2006-04-29  1:03                             ` Lonnie Mendez
2006-04-29  3:29                               ` Lonnie Mendez
2006-04-30  0:46                                 ` Lonnie Mendez
2006-04-30 20:56                                   ` Lonnie Mendez
2006-04-21 16:26     ` nix.wie.weg
2006-04-22 14:15 ` nix.wie.weg
2006-04-23 15:02 ` Fabrice Bellard
2006-04-23 16:11   ` nix.wie.weg
2006-04-24 23:50 ` [Qemu-devel] Update for cvs 2006-04-24 nix.wie.weg

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=44494596.3070808@austin.rr.com \
    --to=lmendez19@austin.rr.com \
    --cc=qemu-devel@nongnu.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.