* [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