From: Tormod Volden <debian.tor...@gmail.com>

So that we can avoid asking the device about it. In particular
the Freerunner does not like too much enquiries.
---

Stefan (or someone with a Freerunner),
can you please test this patch against current master?

Please report back if it found the "cached USB_DT_DFU" or not.

Thanks,
Tormod

 src/main.c |   39 +++++++++++++++++++++++++++++++++++++--
 1 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/src/main.c b/src/main.c
index 819e26c..40fc9de 100644
--- a/src/main.c
+++ b/src/main.c
@@ -451,6 +451,41 @@ static int usb_get_extra_descriptor(struct dfu_if *dfu_if, 
unsigned char type,
                                     size);
 }
 
+static int get_dfu_functional_descriptor(struct dfu_if *dfu_if, void *resbuf,
+                                        int size)
+{
+       libusb_device *dev = dfu_if->dev;
+       struct libusb_config_descriptor *cfg;
+       const unsigned char *extra;
+       int extra_len;
+       int ret;
+
+       ret = libusb_get_config_descriptor_by_value(dev, dfu_if->configuration,
+                                                   &cfg);
+       if (ret)
+               return ret;
+
+       extra = cfg->interface[dfu_if->interface].
+                       altsetting[dfu_if->altsetting].extra;
+       extra_len = cfg->interface[dfu_if->interface].
+                       altsetting[dfu_if->altsetting].extra_length;
+       /* This assumes there is only one descriptor in extra */
+       if (extra && extra_len > 2 && extra[1] == USB_DT_DFU) {
+               printf("yoohoo! Found cached USB_DT_DFU of size %i\n",
+                       extra_len);
+               if (extra_len > size)
+                       extra_len = size;
+               memcpy(resbuf, extra, extra_len);
+               libusb_free_config_descriptor(cfg);
+               return extra_len;
+       }
+       libusb_free_config_descriptor(cfg);
+       printf("boooh! Did not find cached USB_DT_DFU\n");
+       /* Try retrieve it from device */
+       return usb_get_extra_descriptor(dfu_if, USB_DT_DFU,
+                               dfu_if->interface, resbuf, size);
+}
+
 static void help(void)
 {
        printf("Usage: dfu-util [options] ...\n"
@@ -890,8 +925,8 @@ status_again:
 
        if (!transfer_size) {
                /* Obtain DFU functional descriptor */
-               ret = usb_get_extra_descriptor(dif, USB_DT_DFU,
-                               dif->interface, &func_dfu, sizeof(func_dfu));
+               ret = get_dfu_functional_descriptor(dif, &func_dfu,
+                                                   sizeof(func_dfu));
                if (ret < 0) {
                        fprintf(stderr, "Error obtaining DFU functional "
                                "descriptor\n");
-- 
1.7.5.4


_______________________________________________
devel mailing list
devel@lists.openmoko.org
https://lists.openmoko.org/mailman/listinfo/devel

Reply via email to