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