]> sigrok.org Git - libsigrok.git/commitdiff
hantek-dso: Use physical USB connection instead of sdi->index
authorSoeren Apel <redacted>
Sat, 27 Sep 2014 19:51:56 +0000 (21:51 +0200)
committerBert Vermeulen <redacted>
Mon, 29 Sep 2014 23:42:58 +0000 (01:42 +0200)
src/hardware/hantek-dso/api.c
src/hardware/hantek-dso/dso.c

index e0e05df5ef268bc62ea67989eaa606db2c4e3e0f..3ad928bdd79ac05e2a1d28baf91043b812f92c6f 100644 (file)
@@ -158,7 +158,7 @@ static struct sr_dev_driver *di = &hantek_dso_driver_info;
 
 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
 
-static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof)
+static struct sr_dev_inst *dso_dev_new(const struct dso_profile *prof)
 {
        struct sr_dev_inst *sdi;
        struct sr_channel *ch;
@@ -166,7 +166,7 @@ static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof
        struct dev_context *devc;
        int i;
 
-       sdi = sr_dev_inst_new(index, SR_ST_INITIALIZING,
+       sdi = sr_dev_inst_new(0, SR_ST_INITIALIZING,
                prof->vendor, prof->model, NULL);
        if (!sdi)
                return NULL;
@@ -266,12 +266,12 @@ static GSList *scan(GSList *options)
        GSList *l, *devices, *conn_devices;
        struct libusb_device_descriptor des;
        libusb_device **devlist;
-       int devcnt, ret, i, j;
+       int ret, i, j;
        const char *conn;
+       char connection_id[64];
 
        drvc = di->priv;
 
-       devcnt = 0;
        devices = 0;
 
        conn = NULL;
@@ -310,6 +310,8 @@ static GSList *scan(GSList *options)
                        continue;
                }
 
+               usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
+
                prof = NULL;
                for (j = 0; dev_profiles[j].orig_vid; j++) {
                        if (des.idVendor == dev_profiles[j].orig_vid
@@ -317,7 +319,8 @@ static GSList *scan(GSList *options)
                                /* Device matches the pre-firmware profile. */
                                prof = &dev_profiles[j];
                                sr_dbg("Found a %s %s.", prof->vendor, prof->model);
-                               sdi = dso_dev_new(devcnt, prof);
+                               sdi = dso_dev_new(prof);
+                               sdi->connection_id = g_strdup(connection_id);
                                devices = g_slist_append(devices, sdi);
                                devc = sdi->priv;
                                if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION,
@@ -325,19 +328,18 @@ static GSList *scan(GSList *options)
                                        /* Remember when the firmware on this device was updated */
                                        devc->fw_updated = g_get_monotonic_time();
                                else
-                                       sr_err("Firmware upload failed for "
-                                               "device %d.", devcnt);
+                                       sr_err("Firmware upload failed");
                                /* Dummy USB address of 0xff will get overwritten later. */
                                sdi->conn = sr_usb_dev_inst_new(
                                                libusb_get_bus_number(devlist[i]), 0xff, NULL);
-                               devcnt++;
                                break;
                        } else if (des.idVendor == dev_profiles[j].fw_vid
                                && des.idProduct == dev_profiles[j].fw_pid) {
                                /* Device matches the post-firmware profile. */
                                prof = &dev_profiles[j];
                                sr_dbg("Found a %s %s.", prof->vendor, prof->model);
-                               sdi = dso_dev_new(devcnt, prof);
+                               sdi = dso_dev_new(prof);
+                               sdi->connection_id = g_strdup(connection_id);
                                sdi->status = SR_ST_INACTIVE;
                                devices = g_slist_append(devices, sdi);
                                devc = sdi->priv;
@@ -345,7 +347,6 @@ static GSList *scan(GSList *options)
                                sdi->conn = sr_usb_dev_inst_new(
                                                libusb_get_bus_number(devlist[i]),
                                                libusb_get_device_address(devlist[i]), NULL);
-                               devcnt++;
                                break;
                        }
                }
index da5eb121b3a04ff1fab70c6bfa5358dc9ddb9959..b83045757f756c26e29769ac6200e1b9af8dbe17 100644 (file)
@@ -113,7 +113,8 @@ SR_PRIV int dso_open(struct sr_dev_inst *sdi)
        struct sr_usb_dev_inst *usb;
        struct libusb_device_descriptor des;
        libusb_device **devlist;
-       int err, skip, i;
+       int err, i;
+       char connection_id[64];
 
        devc = sdi->priv;
        usb = sdi->conn;
@@ -122,7 +123,6 @@ SR_PRIV int dso_open(struct sr_dev_inst *sdi)
                /* already in use */
                return SR_ERR;
 
-       skip = 0;
        libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist);
        for (i = 0; devlist[i]; i++) {
                if ((err = libusb_get_device_descriptor(devlist[i], &des))) {
@@ -135,20 +135,14 @@ SR_PRIV int dso_open(struct sr_dev_inst *sdi)
                    || des.idProduct != devc->profile->fw_pid)
                        continue;
 
-               if (sdi->status == SR_ST_INITIALIZING) {
-                       if (skip != sdi->index) {
-                               /* Skip devices of this type that aren't the one we want. */
-                               skip += 1;
-                               continue;
-                       }
-               } else if (sdi->status == SR_ST_INACTIVE) {
+               if ((sdi->status == SR_ST_INITIALIZING) ||
+                               (sdi->status == SR_ST_INACTIVE)) {
                        /*
-                        * This device is fully enumerated, so we need to find
-                        * this device by vendor, product, bus and address.
+                        * Check device by its physical USB bus/port address.
                         */
-                       if (libusb_get_bus_number(devlist[i]) != usb->bus
-                               || libusb_get_device_address(devlist[i]) != usb->address)
-                               /* this is not the one */
+                       usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
+                       if (strcmp(sdi->connection_id, connection_id))
+                               /* This is not the one. */
                                continue;
                }
 
@@ -164,9 +158,10 @@ SR_PRIV int dso_open(struct sr_dev_inst *sdi)
                                sr_err("Wrong endpoint profile.");
                        else {
                                sdi->status = SR_ST_ACTIVE;
-                               sr_info("Opened device %d on %d.%d interface %d.",
-                                       sdi->index, usb->bus,
-                                       usb->address, USB_INTERFACE);
+                               sr_info("Opened device on %d.%d (logical) / "
+                                               "%s (physical) interface %d.",
+                                       usb->bus, usb->address,
+                                       sdi->connection_id, USB_INTERFACE);
                        }
                } else {
                        sr_err("Failed to open device: %s.",
@@ -193,8 +188,8 @@ SR_PRIV void dso_close(struct sr_dev_inst *sdi)
        if (usb->devhdl == NULL)
                return;
 
-       sr_info("Closing device %d on %d.%d interface %d.", sdi->index,
-               usb->bus, usb->address, USB_INTERFACE);
+       sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
+                       usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
        libusb_release_interface(usb->devhdl, USB_INTERFACE);
        libusb_close(usb->devhdl);
        usb->devhdl = NULL;