]> sigrok.org Git - libsigrok.git/commitdiff
fx2lafw: Support conn scan parameter
authorBert Vermeulen <redacted>
Mon, 15 Apr 2013 21:50:16 +0000 (23:50 +0200)
committerBert Vermeulen <redacted>
Mon, 15 Apr 2013 21:56:33 +0000 (23:56 +0200)
This takes a USB specification. Fixes bug 82.

hardware/fx2lafw/fx2lafw.c

index f4e0360fecccfe6ca85e914edb79c784a985df7b..f76fa57f73020c9ec1c95249a1401be4e30e46c2 100644 (file)
@@ -380,15 +380,18 @@ static int hw_init(struct sr_context *sr_ctx)
 
 static GSList *hw_scan(GSList *options)
 {
-       GSList *devices;
-       struct libusb_device_descriptor des;
-       struct sr_dev_inst *sdi;
-       const struct fx2lafw_profile *prof;
        struct drv_context *drvc;
        struct dev_context *devc;
+       struct sr_dev_inst *sdi;
+       struct sr_usb_dev_inst *usb;
        struct sr_probe *probe;
+       struct sr_config *src;
+       const struct fx2lafw_profile *prof;
+       GSList *l, *devices, *conn_devices;
+       struct libusb_device_descriptor des;
        libusb_device **devlist;
        int devcnt, num_logic_probes, ret, i, j;
+       const char *conn;
 
        (void)options;
 
@@ -397,13 +400,39 @@ static GSList *hw_scan(GSList *options)
        /* This scan always invalidates any previous scans. */
        clear_instances();
 
+       conn = NULL;
+       for (l = options; l; l = l->next) {
+               src = l->data;
+               switch (src->key) {
+               case SR_CONF_CONN:
+                       conn = g_variant_get_string(src->data, NULL);
+                       break;
+               }
+       }
+       if (conn)
+               conn_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, conn);
+       else
+               conn_devices = NULL;
+
        /* Find all fx2lafw compatible devices and upload firmware to them. */
        devices = NULL;
        libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
        for (i = 0; devlist[i]; i++) {
+               if (conn) {
+                       usb = NULL;
+                       for (l = conn_devices; l; l = l->next) {
+                               usb = l->data;
+                               if (usb->bus == libusb_get_bus_number(devlist[i])
+                                       && usb->address == libusb_get_device_address(devlist[i]))
+                                       break;
+                       }
+                       if (!l)
+                               /* This device matched none of the ones that
+                                * matched the conn specification. */
+                               continue;
+               }
 
-               if ((ret = libusb_get_device_descriptor(
-                    devlist[i], &des)) != 0) {
+               if ((ret = libusb_get_device_descriptor( devlist[i], &des)) != 0) {
                        sr_warn("Failed to get device descriptor: %s.",
                                libusb_error_name(ret));
                        continue;