* [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; 7+ 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] 7+ 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; 7+ 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] 7+ 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; 7+ 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] 7+ 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; 7+ 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] 7+ 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; 7+ 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] 7+ 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; 7+ 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] 7+ messages in thread
* [Qemu-devel] [PATCH 0/4] usb: implement Interface Association Descriptor support @ 2011-03-29 2:31 Brad Hards 2011-03-29 2:31 ` [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces Brad Hards 0 siblings, 1 reply; 7+ messages in thread From: Brad Hards @ 2011-03-29 2:31 UTC (permalink / raw) To: qemu-devel This patchset implements Interface Association Descriptor suppoort. 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. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces 2011-03-29 2:31 [Qemu-devel] [PATCH 0/4] usb: " Brad Hards @ 2011-03-29 2:31 ` Brad Hards 0 siblings, 0 replies; 7+ messages in thread From: Brad Hards @ 2011-03-29 2:31 UTC (permalink / raw) To: qemu-devel; +Cc: Brad Hards Previously we relied on the .bNumInterfaces, but that won't always be accurate after the introduction of grouped interfaces. --- 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.0.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-05-05 11:35 UTC | newest] Thread overview: 7+ 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 -- strict thread matches above, loose matches on Subject: below -- 2011-03-29 2:31 [Qemu-devel] [PATCH 0/4] usb: " Brad Hards 2011-03-29 2:31 ` [Qemu-devel] [PATCH 2/4] usb: update config descriptors to identify number of interfaces Brad Hards
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).