From: Bert Vermeulen Date: Mon, 15 Apr 2013 21:50:16 +0000 (+0200) Subject: fx2lafw: Support conn scan parameter X-Git-Tag: dsupstream~144 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=754b5ff2b48fc2fda3771940aa9d98108ae4f6af;p=libsigrok.git fx2lafw: Support conn scan parameter This takes a USB specification. Fixes bug 82. --- diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index f4e0360f..f76fa57f 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -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;