qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support
@ 2011-04-03  5:33 Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 1/4] usb: Add Interface Association Descriptor descriptor type Brad Hards
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Brad Hards @ 2011-04-03  5:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel

These descriptors are covered in Section 9.6.4 of the USB 3.0 spec, 
but there is a better description in the Intel IAD whitepaper 
(www.usb.org/developers/whitepapers/iadclasscode_r10.pdf).

The short version is that IAD is an extra descriptor type that appears before 
a group (two or more) interface descriptors, that explains which interface 
descriptors make up a virtual device.  So it could look like:
Config Desc
IAD#0
Iface#0
Iface#1
Iface#2
IAD#1
Iface#3
Iface#4

[Check the diagram in the Intel IAD whitepaper if that makes no sense]

The implementation basically introduces the concept of a grouped of
interfaces (with an IAD header), and support for sending it to the
device.

The intended use for this is USB Video class devices, which have a
Control interface and Streaming interface that are a single logical
device.

Changes v2 (from v1):
 - Added Signed-off-by, per CODING_STYLE
 - Fixed bug in altsetting handling (.nif needed instead of .bNumInterfaces)
 - Fixed some whitespace and line-length problems indicated by checkstyle.pl

Diffstat:
 usb-desc.c   |   52 +++++++++++++++++++++++++++++++++++++++++++++++++---
 usb-desc.h   |   20 ++++++++++++++++++++
 usb-hid.c    |    3 +++
 usb-hub.c    |    1 +
 usb-msd.c    |    2 ++
 usb-serial.c |    1 +
 usb-wacom.c  |    1 +
 usb.h        |    2 ++
 8 files changed, 79 insertions(+), 3 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/4] usb: Add Interface Association Descriptor descriptor type
  2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
@ 2011-04-03  5:33 ` Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces Brad Hards
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Hards @ 2011-04-03  5:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Brad Hards

Signed-off-by: Brad Hards <bradh@frogmouth.net>
---
 hw/usb.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/usb.h b/hw/usb.h
index d3d755d..418853f 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -124,6 +124,7 @@
 #define USB_DT_ENDPOINT			0x05
 #define USB_DT_DEVICE_QUALIFIER         0x06
 #define USB_DT_OTHER_SPEED_CONFIG       0x07
+#define USB_DT_INTERFACE_ASSOC          0x0B
 
 #define USB_ENDPOINT_XFER_CONTROL	0
 #define USB_ENDPOINT_XFER_ISOC		1
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces
  2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 1/4] usb: Add Interface Association Descriptor descriptor type Brad Hards
@ 2011-04-03  5:33 ` Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 3/4] usb: remove fallback to bNumInterfaces if no .nif Brad Hards
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Hards @ 2011-04-03  5:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Brad Hards

Previously we relied on the .bNumInterfaces, but that won't always be
accurate after the introduction of grouped interfaces.

Signed-off-by: Brad Hards <bradh@frogmouth.net>
---
 hw/usb-hid.c    |    3 +++
 hw/usb-hub.c    |    1 +
 hw/usb-msd.c    |    2 ++
 hw/usb-serial.c |    1 +
 hw/usb-wacom.c  |    1 +
 5 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index c25362c..8a5e2ca 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -211,6 +211,7 @@ static const USBDescDevice desc_device_mouse = {
             .iConfiguration        = STR_CONFIG_MOUSE,
             .bmAttributes          = 0xa0,
             .bMaxPower             = 50,
+            .nif = 1,
             .ifs = &desc_iface_mouse,
         },
     },
@@ -227,6 +228,7 @@ static const USBDescDevice desc_device_tablet = {
             .iConfiguration        = STR_CONFIG_TABLET,
             .bmAttributes          = 0xa0,
             .bMaxPower             = 50,
+            .nif = 1,
             .ifs = &desc_iface_tablet,
         },
     },
@@ -243,6 +245,7 @@ static const USBDescDevice desc_device_keyboard = {
             .iConfiguration        = STR_CONFIG_KEYBOARD,
             .bmAttributes          = 0xa0,
             .bMaxPower             = 50,
+            .nif = 1,
             .ifs = &desc_iface_keyboard,
         },
     },
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 3dd31ba..4c19c8c 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -119,6 +119,7 @@ static const USBDescDevice desc_device_hub = {
             .bNumInterfaces        = 1,
             .bConfigurationValue   = 1,
             .bmAttributes          = 0xe0,
+            .nif = 1,
             .ifs = &desc_iface_hub,
         },
     },
diff --git a/hw/usb-msd.c b/hw/usb-msd.c
index 76f5b02..ea466c5 100644
--- a/hw/usb-msd.c
+++ b/hw/usb-msd.c
@@ -119,6 +119,7 @@ static const USBDescDevice desc_device_full = {
             .bConfigurationValue   = 1,
             .iConfiguration        = STR_CONFIG_FULL,
             .bmAttributes          = 0xc0,
+            .nif = 1,
             .ifs = &desc_iface_full,
         },
     },
@@ -153,6 +154,7 @@ static const USBDescDevice desc_device_high = {
             .bConfigurationValue   = 1,
             .iConfiguration        = STR_CONFIG_HIGH,
             .bmAttributes          = 0xc0,
+            .nif = 1,
             .ifs = &desc_iface_high,
         },
     },
diff --git a/hw/usb-serial.c b/hw/usb-serial.c
index 6763d52..48ea0d8 100644
--- a/hw/usb-serial.c
+++ b/hw/usb-serial.c
@@ -146,6 +146,7 @@ static const USBDescDevice desc_device = {
             .bConfigurationValue   = 1,
             .bmAttributes          = 0x80,
             .bMaxPower             = 50,
+            .nif = 1,
             .ifs = &desc_iface0,
         },
     },
diff --git a/hw/usb-wacom.c b/hw/usb-wacom.c
index 16be7a2..57041a1 100644
--- a/hw/usb-wacom.c
+++ b/hw/usb-wacom.c
@@ -108,6 +108,7 @@ static const USBDescDevice desc_device_wacom = {
             .bConfigurationValue   = 1,
             .bmAttributes          = 0x80,
             .bMaxPower             = 40,
+            .nif = 1,
             .ifs = &desc_iface_wacom,
         },
     },
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 3/4] usb: remove fallback to bNumInterfaces if no .nif
  2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 1/4] usb: Add Interface Association Descriptor descriptor type Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces Brad Hards
@ 2011-04-03  5:33 ` Brad Hards
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 4/4] usb: add support for "grouped" interfaces and the Interface Association Descriptor Brad Hards
  2011-05-05 11:35 ` [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Hards @ 2011-04-03  5:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Brad Hards

All callers have been updated.

Signed-off-by: Brad Hards <bradh@frogmouth.net>
---
 hw/usb-desc.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/usb-desc.c b/hw/usb-desc.c
index 62591f2..a784155 100644
--- a/hw/usb-desc.c
+++ b/hw/usb-desc.c
@@ -76,7 +76,7 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
 {
     uint8_t  bLength = 0x09;
     uint16_t wTotalLength = 0;
-    int i, rc, count;
+    int i, rc;
 
     if (len < bLength) {
         return -1;
@@ -91,8 +91,7 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
     dest[0x08] = conf->bMaxPower;
     wTotalLength += bLength;
 
-    count = conf->nif ? conf->nif : conf->bNumInterfaces;
-    for (i = 0; i < count; i++) {
+    for (i = 0; i < conf->nif; i++) {
         rc = usb_desc_iface(conf->ifs + i, dest + wTotalLength, len - wTotalLength);
         if (rc < 0) {
             return rc;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 4/4] usb: add support for "grouped" interfaces and the Interface Association Descriptor
  2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
                   ` (2 preceding siblings ...)
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 3/4] usb: remove fallback to bNumInterfaces if no .nif Brad Hards
@ 2011-04-03  5:33 ` Brad Hards
  2011-05-05 11:35 ` [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Brad Hards @ 2011-04-03  5:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Brad Hards

This is used for some devices that have multiple interfaces that form a logic
device. An example is Video Class, which has a Control interface and a
Streaming interface. There can be additional interfaces on the same (physical)
devices (e.g. a microphone), and Interface Association Descriptor handles this
case.

Signed-off-by: Brad Hards <bradh@frogmouth.net>
---
 hw/usb-desc.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 hw/usb-desc.h |   20 ++++++++++++++++++++
 hw/usb.h      |    1 +
 3 files changed, 68 insertions(+), 0 deletions(-)

diff --git a/hw/usb-desc.c b/hw/usb-desc.c
index a784155..8367c45 100644
--- a/hw/usb-desc.c
+++ b/hw/usb-desc.c
@@ -91,6 +91,18 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
     dest[0x08] = conf->bMaxPower;
     wTotalLength += bLength;
 
+    /* handle grouped interfaces if any*/
+    for (i = 0; i < conf->nif_groups; i++) {
+        rc = usb_desc_iface_group(&(conf->if_groups[i]),
+                                  dest + wTotalLength,
+                                  len - wTotalLength);
+        if (rc < 0) {
+            return rc;
+        }
+        wTotalLength += rc;
+    }
+
+    /* handle normal (ungrouped / no IAD) interfaces if any */
     for (i = 0; i < conf->nif; i++) {
         rc = usb_desc_iface(conf->ifs + i, dest + wTotalLength, len - wTotalLength);
         if (rc < 0) {
@@ -104,6 +116,41 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len)
     return wTotalLength;
 }
 
+int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest,
+                         size_t len)
+{
+    int pos = 0;
+    int i = 0;
+
+    /* handle interface association descriptor */
+    uint8_t bLength = 0x08;
+
+    if (len < bLength) {
+        return -1;
+    }
+
+    dest[0x00] = bLength;
+    dest[0x01] = USB_DT_INTERFACE_ASSOC;
+    dest[0x02] = iad->bFirstInterface;
+    dest[0x03] = iad->bInterfaceCount;
+    dest[0x04] = iad->bFunctionClass;
+    dest[0x05] = iad->bFunctionSubClass;
+    dest[0x06] = iad->bFunctionProtocol;
+    dest[0x07] = iad->iFunction;
+    pos += bLength;
+
+    /* handle associated interfaces in this group */
+    for (i = 0; i < iad->nif; i++) {
+        int rc = usb_desc_iface(&(iad->ifs[i]), dest + pos, len - pos);
+        if (rc < 0) {
+            return rc;
+        }
+        pos += rc;
+    }
+
+    return pos;
+}
+
 int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len)
 {
     uint8_t bLength = 0x09;
diff --git a/hw/usb-desc.h b/hw/usb-desc.h
index ac734ab..a612515 100644
--- a/hw/usb-desc.h
+++ b/hw/usb-desc.h
@@ -30,6 +30,24 @@ struct USBDescConfig {
     uint8_t                   bmAttributes;
     uint8_t                   bMaxPower;
 
+    /* grouped interfaces */
+    uint8_t                   nif_groups;
+    const USBDescIfaceAssoc   *if_groups;
+
+    /* "normal" interfaces */
+    uint8_t                   nif;
+    const USBDescIface        *ifs;
+};
+
+/* conceptually an Interface Association Descriptor, and releated interfaces */
+struct USBDescIfaceAssoc {
+    uint8_t                   bFirstInterface;
+    uint8_t                   bInterfaceCount;
+    uint8_t                   bFunctionClass;
+    uint8_t                   bFunctionSubClass;
+    uint8_t                   bFunctionProtocol;
+    uint8_t                   iFunction;
+
     uint8_t                   nif;
     const USBDescIface        *ifs;
 };
@@ -75,6 +93,8 @@ int usb_desc_device(const USBDescID *id, const USBDescDevice *dev,
 int usb_desc_device_qualifier(const USBDescDevice *dev,
                               uint8_t *dest, size_t len);
 int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len);
+int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest,
+                         size_t len);
 int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len);
 int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len);
 int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
diff --git a/hw/usb.h b/hw/usb.h
index 418853f..bbdb189 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -141,6 +141,7 @@ typedef struct USBDesc USBDesc;
 typedef struct USBDescID USBDescID;
 typedef struct USBDescDevice USBDescDevice;
 typedef struct USBDescConfig USBDescConfig;
+typedef struct USBDescIfaceAssoc USBDescIfaceAssoc;
 typedef struct USBDescIface USBDescIface;
 typedef struct USBDescEndpoint USBDescEndpoint;
 typedef struct USBDescOther USBDescOther;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support
  2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
                   ` (3 preceding siblings ...)
  2011-04-03  5:33 ` [Qemu-devel] [PATCH 4/4] usb: add support for "grouped" interfaces and the Interface Association Descriptor Brad Hards
@ 2011-05-05 11:35 ` Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2011-05-05 11:35 UTC (permalink / raw)
  To: Brad Hards; +Cc: qemu-devel

On 04/03/11 07:33, Brad Hards wrote:
> These descriptors are covered in Section 9.6.4 of the USB 3.0 spec,
> but there is a better description in the Intel IAD whitepaper
> (www.usb.org/developers/whitepapers/iadclasscode_r10.pdf).

> The implementation basically introduces the concept of a grouped of
> interfaces (with an IAD header), and support for sending it to the
> device.

Queued up in the usb patch queue.

thanks,
   Gerd

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-05-05 11:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-03  5:33 [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Brad Hards
2011-04-03  5:33 ` [Qemu-devel] [PATCH 1/4] usb: Add Interface Association Descriptor descriptor type Brad Hards
2011-04-03  5:33 ` [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces Brad Hards
2011-04-03  5:33 ` [Qemu-devel] [PATCH 3/4] usb: remove fallback to bNumInterfaces if no .nif Brad Hards
2011-04-03  5:33 ` [Qemu-devel] [PATCH 4/4] usb: add support for "grouped" interfaces and the Interface Association Descriptor Brad Hards
2011-05-05 11:35 ` [Qemu-devel] [PATCH v2 0/4]usb: implement Interface Association Descriptor support Gerd Hoffmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).