All of lore.kernel.org
 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 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.