[U-Boot] [PATCH] dfu, usb: set usb descriptor to values defined in dfu spec 1.1

set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf
Signed-off-by: Heiko Schocher hs@denx.de Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Roger Meier r.meier@siemens.com
---
before this patch, "dfu-util -l" showed:
Bus 002 Device 114: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 2 Communications bDeviceSubClass 2 Abstract (modem) bDeviceProtocol 0 None bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG
with this patch:
Bus 002 Device 089: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG iProduct 2 USB download gadget
which fits for "bcdUSB", "bDeviceClass" and "bDeviceSubClass" with the DFU spezifikation. --- drivers/usb/gadget/f_dfu.c | 5 +++-- drivers/usb/gadget/g_dnl.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9128add..9429e50 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -83,8 +83,9 @@ static struct usb_descriptor_header *dfu_runtime_descs[] = { static const struct usb_qualifier_descriptor dev_qualifier = { .bLength = sizeof dev_qualifier, .bDescriptorType = USB_DT_DEVICE_QUALIFIER, - .bcdUSB = __constant_cpu_to_le16(0x0200), - .bDeviceClass = USB_CLASS_VENDOR_SPEC, + .bcdUSB = __constant_cpu_to_le16(0x0110), + .bDeviceClass = USB_CLASS_PER_INTERFACE, + .bDeviceSubClass = 0x00, .bNumConfigurations = 1, };
diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c index dd95afe..bcca965 100644 --- a/drivers/usb/gadget/g_dnl.c +++ b/drivers/usb/gadget/g_dnl.c @@ -57,9 +57,9 @@ static struct usb_device_descriptor device_desc = { .bLength = sizeof device_desc, .bDescriptorType = USB_DT_DEVICE,
- .bcdUSB = __constant_cpu_to_le16(0x0200), - .bDeviceClass = USB_CLASS_COMM, - .bDeviceSubClass = 0x02, /*0x02:CDC-modem , 0x00:CDC-serial*/ + .bcdUSB = __constant_cpu_to_le16(0x0110), + .bDeviceClass = USB_CLASS_PER_INTERFACE, + .bDeviceSubClass = 0x00, /*0x02:CDC-modem , 0x00:CDC-serial*/
.idVendor = __constant_cpu_to_le16(CONFIG_G_DNL_VENDOR_NUM), .idProduct = __constant_cpu_to_le16(CONFIG_G_DNL_PRODUCT_NUM),

On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
Signed-off-by: Heiko Schocher hs@denx.de Cc: Lukasz Majewski l.majewski@samsung.com Cc: Marek Vasut marex@denx.de Cc: Roger Meier r.meier@siemens.com
before this patch, "dfu-util -l" showed:
Bus 002 Device 114: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 2 Communications bDeviceSubClass 2 Abstract (modem) bDeviceProtocol 0 None bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG
with this patch:
Bus 002 Device 089: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG iProduct 2 USB download gadget
which fits for "bcdUSB", "bDeviceClass" and "bDeviceSubClass" with the DFU spezifikation.
This patch doesn't seem fully right, let me explain below please.
drivers/usb/gadget/f_dfu.c | 5 +++-- drivers/usb/gadget/g_dnl.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9128add..9429e50 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -83,8 +83,9 @@ static struct usb_descriptor_header *dfu_runtime_descs[] = { static const struct usb_qualifier_descriptor dev_qualifier = { .bLength = sizeof dev_qualifier, .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
- .bcdUSB = __constant_cpu_to_le16(0x0200),
- .bDeviceClass = USB_CLASS_VENDOR_SPEC,
- .bcdUSB = __constant_cpu_to_le16(0x0110),
See [1] and look for first and second instance of 'bcdUsb' there please. Quote of the second one:
' The bcdUSB field reports the highest version of USB the device supports. The value is in binary coded decimal with a format of 0xJJMN where JJ is the major version number, M is the minor version number and N is the sub minor version number. e.g. USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as 0x0100. '
So this should be configured dynamically based on what the highest mode the controller supports is, no?
- .bDeviceClass = USB_CLASS_PER_INTERFACE,
This might be OK.
- .bDeviceSubClass = 0x00,
But this is not, the device definitelly isn't CDC-serial.
[...]

Hello Marek,
Am 05.09.2014 00:42, schrieb Marek Vasut:
On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
:-( Maybe it is deleted currently there? Hmm.. there is a search field if you open the above URL ... and if you type DFU and press search, you get:
DFU File Format: PDF/Adobe Acrobat Aug 5, 2004 ... USB Device Firmware Upgrade Specification, Revision 1.1. 2. Intellectual Property Disclaimer. THIS SPECIFICATION IS PROVIDED “AS IS” ... www.usb.org/developers/devclass_docs/DFU_1.1.pdf
This is exactly the above link ...
This link is also referenced from openmoko:
http://wiki.openmoko.org/wiki/USB_DFU_-_The_USB_Device_Firmware_Upgrade_stan...
Signed-off-by: Heiko Schocherhs@denx.de Cc: Lukasz Majewskil.majewski@samsung.com Cc: Marek Vasutmarex@denx.de Cc: Roger Meierr.meier@siemens.com
before this patch, "dfu-util -l" showed:
Bus 002 Device 114: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 2 Communications bDeviceSubClass 2 Abstract (modem) bDeviceProtocol 0 None bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG
with this patch:
Bus 002 Device 089: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG iProduct 2 USB download gadget
which fits for "bcdUSB", "bDeviceClass" and "bDeviceSubClass" with the DFU spezifikation.
This patch doesn't seem fully right, let me explain below please.
drivers/usb/gadget/f_dfu.c | 5 +++-- drivers/usb/gadget/g_dnl.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9128add..9429e50 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -83,8 +83,9 @@ static struct usb_descriptor_header *dfu_runtime_descs[] = { static const struct usb_qualifier_descriptor dev_qualifier = { .bLength = sizeof dev_qualifier, .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
- .bcdUSB = __constant_cpu_to_le16(0x0200),
- .bDeviceClass = USB_CLASS_VENDOR_SPEC,
- .bcdUSB = __constant_cpu_to_le16(0x0110),
See [1] and look for first and second instance of 'bcdUsb' there please. Quote of the second one:
' The bcdUSB field reports the highest version of USB the device supports. The value is in binary coded decimal with a format of 0xJJMN where JJ is the major version number, M is the minor version number and N is the sub minor version number. e.g. USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as 0x0100. '
So this should be configured dynamically based on what the highest mode the controller supports is, no?
Good question ... the DFU 1.1 spezification says in chapter 4.2.1 DFU Mode Device Descriptor:
bcdUSB = 0100 USB specification release number in binary coded decimal. (which seems wrong, as the spez is version 1.1, see [2]) bDeviceClass = 0 bDeviceSubClass = 0
... ?
I discussed this change with Lukasz, see:
[2] http://lists.denx.de/pipermail/u-boot/2014-August/186918.html
- .bDeviceClass = USB_CLASS_PER_INTERFACE,
This might be OK.
- .bDeviceSubClass = 0x00,
But this is not, the device definitelly isn't CDC-serial.
[...]
bye, Heiko

Hi Heiko,
Hello Marek,
Am 05.09.2014 00:42, schrieb Marek Vasut:
On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
:-( Maybe it is deleted currently there? Hmm.. there is a search field if you open the above URL ... and if you type DFU and press search, you get:
DFU File Format: PDF/Adobe Acrobat Aug 5, 2004 ... USB Device Firmware Upgrade Specification, Revision 1.1. 2. Intellectual Property Disclaimer. THIS SPECIFICATION IS PROVIDED “AS IS” ... www.usb.org/developers/devclass_docs/DFU_1.1.pdf
This is exactly the above link ...
This link is also referenced from openmoko:
http://wiki.openmoko.org/wiki/USB_DFU_-_The_USB_Device_Firmware_Upgrade_stan...
I can confirm that the original link is dead. Maybe we can add above information to the commit message?
Signed-off-by: Heiko Schocherhs@denx.de Cc: Lukasz Majewskil.majewski@samsung.com Cc: Marek Vasutmarex@denx.de Cc: Roger Meierr.meier@siemens.com
before this patch, "dfu-util -l" showed:
Bus 002 Device 114: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 2 Communications bDeviceSubClass 2 Abstract (modem) bDeviceProtocol 0 None bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG
with this patch:
Bus 002 Device 089: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG iProduct 2 USB download gadget
which fits for "bcdUSB", "bDeviceClass" and "bDeviceSubClass" with the DFU spezifikation.
This patch doesn't seem fully right, let me explain below please.
drivers/usb/gadget/f_dfu.c | 5 +++-- drivers/usb/gadget/g_dnl.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9128add..9429e50 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -83,8 +83,9 @@ static struct usb_descriptor_header *dfu_runtime_descs[] = { static const struct usb_qualifier_descriptor dev_qualifier = { .bLength = sizeof dev_qualifier, .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
- .bcdUSB = __constant_cpu_to_le16(0x0200),
- .bDeviceClass = USB_CLASS_VENDOR_SPEC,
- .bcdUSB = __constant_cpu_to_le16(0x0110),
See [1] and look for first and second instance of 'bcdUsb' there please. Quote of the second one:
' The bcdUSB field reports the highest version of USB the device supports. The value is in binary coded decimal with a format of 0xJJMN where JJ is the major version number, M is the minor version number and N is the sub minor version number. e.g. USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as 0x0100. '
So this should be configured dynamically based on what the highest mode the controller supports is, no?
Good question ... the DFU 1.1 spezification says in chapter 4.2.1 DFU Mode Device Descriptor:
bcdUSB = 0100 USB specification release number in binary coded decimal. (which seems wrong, as the spez is version 1.1, see [2]) bDeviceClass = 0 bDeviceSubClass = 0
... ?
I discussed this change with Lukasz, see:
[2] http://lists.denx.de/pipermail/u-boot/2014-August/186918.html
I'm more than happy to announce that you both may be right :-).
In the DFU 1.1 spec the point 4.2.1 describes the DFU MODE DEVICE DESCRIPTOR.
According to information from point 4.- "Enumeration Phase":
"It is very important to note that the device exposes two distinct and independent descriptor sets, one each at the appropriate time: - Run-time descriptor (the one from [1] pointed out by Marek) - DFU mode descriptor (the one from 4.2.1. - fixed by Heiko)
It seems to me that the first descriptor is defined at g_dnl.c and the second, which I guess should be changed, at f_dfu.c
However, to be 100% sure I need to examine this with USB analizer. I'm going to setup it today or on Monday.
- .bDeviceClass = USB_CLASS_PER_INTERFACE,
This might be OK.
- .bDeviceSubClass = 0x00,
But this is not, the device definitelly isn't CDC-serial.
[...]
bye, Heiko

Hello Lukasz,
Am 05.09.2014 09:53, schrieb Lukasz Majewski:
Hi Heiko,
Hello Marek,
Am 05.09.2014 00:42, schrieb Marek Vasut:
On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
:-( Maybe it is deleted currently there? Hmm.. there is a search field if you open the above URL ... and if you type DFU and press search, you get:
DFU File Format: PDF/Adobe Acrobat Aug 5, 2004 ... USB Device Firmware Upgrade Specification, Revision 1.1. 2. Intellectual Property Disclaimer. THIS SPECIFICATION IS PROVIDED “AS IS” ... www.usb.org/developers/devclass_docs/DFU_1.1.pdf
This is exactly the above link ...
This link is also referenced from openmoko:
http://wiki.openmoko.org/wiki/USB_DFU_-_The_USB_Device_Firmware_Upgrade_stan...
I can confirm that the original link is dead. Maybe we can add above information to the commit message?
Hmm.. better would be to add a correct new link... do you have an idea, where we can find this document now?
Signed-off-by: Heiko Schocherhs@denx.de Cc: Lukasz Majewskil.majewski@samsung.com Cc: Marek Vasutmarex@denx.de Cc: Roger Meierr.meier@siemens.com
before this patch, "dfu-util -l" showed:
Bus 002 Device 114: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 2 Communications bDeviceSubClass 2 Abstract (modem) bDeviceProtocol 0 None bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG
with this patch:
Bus 002 Device 089: ID 0908:02c5 Siemens AG Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0908 Siemens AG idProduct 0x02c5 bcdDevice 0.00 iManufacturer 1 Siemens AG iProduct 2 USB download gadget
which fits for "bcdUSB", "bDeviceClass" and "bDeviceSubClass" with the DFU spezifikation.
This patch doesn't seem fully right, let me explain below please.
drivers/usb/gadget/f_dfu.c | 5 +++-- drivers/usb/gadget/g_dnl.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9128add..9429e50 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -83,8 +83,9 @@ static struct usb_descriptor_header *dfu_runtime_descs[] = { static const struct usb_qualifier_descriptor dev_qualifier = { .bLength = sizeof dev_qualifier, .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
- .bcdUSB = __constant_cpu_to_le16(0x0200),
- .bDeviceClass = USB_CLASS_VENDOR_SPEC,
- .bcdUSB = __constant_cpu_to_le16(0x0110),
See [1] and look for first and second instance of 'bcdUsb' there please. Quote of the second one:
' The bcdUSB field reports the highest version of USB the device supports. The value is in binary coded decimal with a format of 0xJJMN where JJ is the major version number, M is the minor version number and N is the sub minor version number. e.g. USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as 0x0100. '
So this should be configured dynamically based on what the highest mode the controller supports is, no?
Good question ... the DFU 1.1 spezification says in chapter 4.2.1 DFU Mode Device Descriptor:
bcdUSB = 0100 USB specification release number in binary coded decimal. (which seems wrong, as the spez is version 1.1, see [2]) bDeviceClass = 0 bDeviceSubClass = 0
... ?
I discussed this change with Lukasz, see:
[2] http://lists.denx.de/pipermail/u-boot/2014-August/186918.html
I'm more than happy to announce that you both may be right :-).
;-)
In the DFU 1.1 spec the point 4.2.1 describes the DFU MODE DEVICE DESCRIPTOR.
According to information from point 4.- "Enumeration Phase":
"It is very important to note that the device exposes two distinct and independent descriptor sets, one each at the appropriate time:
- Run-time descriptor (the one from [1] pointed out by Marek)
- DFU mode descriptor (the one from 4.2.1. - fixed by Heiko)
It seems to me that the first descriptor is defined at g_dnl.c and the second, which I guess should be changed, at f_dfu.c
Ah, I fixed both ...
However, to be 100% sure I need to examine this with USB analizer. I'm going to setup it today or on Monday.
Oh, that would be great, thanks!
bye, Heiko
- .bDeviceClass = USB_CLASS_PER_INTERFACE,
This might be OK.
- .bDeviceSubClass = 0x00,
But this is not, the device definitelly isn't CDC-serial.
[...]
bye, Heiko

On Friday, September 05, 2014 at 10:11:23 AM, Heiko Schocher wrote:
[...]
In the DFU 1.1 spec the point 4.2.1 describes the DFU MODE DEVICE DESCRIPTOR.
According to information from point 4.- "Enumeration Phase":
"It is very important to note that the device exposes two distinct and independent descriptor sets, one each at the appropriate time:
- Run-time descriptor (the one from [1] pointed out by Marek)
- DFU mode descriptor (the one from 4.2.1. - fixed by Heiko)
It seems to me that the first descriptor is defined at g_dnl.c and the second, which I guess should be changed, at f_dfu.c
Ah, I fixed both ...
However, to be 100% sure I need to examine this with USB analizer. I'm going to setup it today or on Monday.
Oh, that would be great, thanks!
Thanks to both of you!
Best regards, Marek Vasut

Hello Marek,
Am 05.09.2014 00:42, schrieb Marek Vasut:
On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
Ah! Here the correct link:
http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf
I change this for v2.
bye, Heiko

On Tuesday, September 09, 2014 at 10:45:57 AM, Heiko Schocher wrote:
Hello Marek,
Am 05.09.2014 00:42, schrieb Marek Vasut:
On Thursday, September 04, 2014 at 12:21:40 PM, Heiko Schocher wrote:
Hi Heiko,
I'll just rant a bit, but please wait until Lukasz does a proper runthrough.
set bDeviceClass, bDeviceSubClass and bcdUSB to the values defined in dfu spec 1.1 chapter 4.2.1 found here:
This URL gives me a website with: " Resource not found. Please check the URL and try again. "
Ah! Here the correct link:
http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf
I change this for v2.
Cool, thank you! :)
Best regards, Marek Vasut
participants (3)
-
Heiko Schocher
-
Lukasz Majewski
-
Marek Vasut