[U-Boot] [PATCH] usb: gadget: dfu: add functional descriptor in descriptor set

Patrick Delaunay patrick.delaunay73 at gmail.com
Thu Dec 8 18:10:49 CET 2016


From: Patrick Delaunay <patrick.delaunay at st.com>

The "DFU descriptor set" must contain the "DFU functional descriptor"
but it is missing today in U-Boot code
(cf: DFU spec 1.1, chapter 4.2 DFU Mode Descriptor Set)
This patch only allocate buffer and copy DFU functional descriptor
after interfaces.


Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>
---
in DFU spec 1.1 :

  4.2 DFU Mode Descriptor Set
  After the host and device agree to perform DFU
  operations, the host re-enumerates the device.
  It is at this time that the device exports
  the DFU descriptor set, which contains:
  - A DFU device descriptor
  - A single configuration descriptor
  - A single interface descriptor (including descriptors
    for alternate settings, if present)
  - A single functional descriptor

But after test and code-review the functional descriptor
is missing in U-Boot in response to USB_DT_CONFIG.

This descriptor is provided only when it is specifically
requested (see dfu_handle function for USB_TYPE_STANDARD request
USB_REQ_GET_DESCRIPTOR for DFU_DT_FUNC).

cf composite.c:config_desc()
  descriptor is provided in f->descriptors or f->hs_descriptors
  set to f_dfu->function in f_dfu.c, in to_dfu_mode()
  and f_dfu->function is initialized in dfu_prepare_function()
  only with interfaces
  but not with DFU functional descriptor !

This patch only allocate buffer and copy DFU functional descriptor
after interfaces descriptor and tested with Linux command "lsusb -v"

=>  "Device Firmware Upgrade Interface Descriptor"
     is now present as expected

Device Descriptor:
  bLength                18
  bDescriptorType         1
    Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           36
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          2 USB download gadget
    bmAttributes         0xc0
      Self Powered
    MaxPower                2mA
.....
      Interface Descriptor:
....
      Device Firmware Upgrade Interface Descriptor:
        bLength                             9
        bDescriptorType                    33
        bmAttributes                       15
          Will Detach
          Manifestation Tolerant
          Upload Supported
          Download Supported
        wDetachTimeout                      0 milliseconds
        wTransferSize                    4096 bytes
        bcdDFUVersion                   1.10
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0001
  Self Powered


 drivers/usb/gadget/f_dfu.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c
index 8e7c981..73b32f8 100644
--- a/drivers/usb/gadget/f_dfu.c
+++ b/drivers/usb/gadget/f_dfu.c
@@ -654,7 +654,7 @@ static int dfu_prepare_function(struct f_dfu *f_dfu, int n)
 	struct usb_interface_descriptor *d;
 	int i = 0;
 
-	f_dfu->function = calloc(sizeof(struct usb_descriptor_header *), n + 1);
+	f_dfu->function = calloc(sizeof(struct usb_descriptor_header *), n + 2);
 	if (!f_dfu->function)
 		goto enomem;
 
@@ -673,6 +673,14 @@ static int dfu_prepare_function(struct f_dfu *f_dfu, int n)
 
 		f_dfu->function[i] = (struct usb_descriptor_header *)d;
 	}
+
+	/* add DFU Functional Descriptor */
+	f_dfu->function[i] = calloc(sizeof(dfu_func), 1);
+	if (!f_dfu->function[i])
+		goto enomem;
+	memcpy(f_dfu->function[i], &dfu_func, sizeof(dfu_func));
+
+	i++;
 	f_dfu->function[i] = NULL;
 
 	return 0;
-- 
1.9.1



More information about the U-Boot mailing list