X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-dso%2Fdso.c;h=d46ddd6e0987550baa707e39fe77eb973cea8a36;hb=5e23fcab889c62864b92aa3ad6902ce3e9f5be49;hp=da5eb121b3a04ff1fab70c6bfa5358dc9ddb9959;hpb=155b680da482cea2381becb73c51cfb838bff31e;p=libsigrok.git diff --git a/src/hardware/hantek-dso/dso.c b/src/hardware/hantek-dso/dso.c index da5eb121..d46ddd6e 100644 --- a/src/hardware/hantek-dso/dso.c +++ b/src/hardware/hantek-dso/dso.c @@ -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; @@ -388,19 +383,18 @@ static int dso_set_filters(const struct sr_dev_inst *sdi) memset(cmdstring, 0, sizeof(cmdstring)); cmdstring[0] = CMD_SET_FILTERS; cmdstring[1] = 0x0f; - if (devc->filter_ch1) { + if (devc->filter[0]) { sr_dbg("Turning on CH1 filter."); cmdstring[2] |= 0x80; } - if (devc->filter_ch2) { + if (devc->filter[1]) { sr_dbg("Turning on CH2 filter."); cmdstring[2] |= 0x40; } - if (devc->filter_trigger) { - /* TODO: supported on the DSO-2090? */ - sr_dbg("Turning on trigger filter."); - cmdstring[2] |= 0x20; - } + /* + * Not supported: filtering on the trigger + * cmdstring[2] |= 0x20; + */ if (send_begin(sdi) != SR_OK) return SR_ERR; @@ -433,8 +427,8 @@ static int dso_set_voltage(const struct sr_dev_inst *sdi) cmdstring[2] = 0x30; /* CH1 volts/div is encoded in bits 0-1 */ - sr_dbg("CH1 vdiv index: %d.", devc->voltage_ch1); - switch (devc->voltage_ch1) { + sr_dbg("CH1 vdiv index: %d.", devc->voltage[0]); + switch (devc->voltage[0]) { case VDIV_1V: case VDIV_100MV: case VDIV_10MV: @@ -453,8 +447,8 @@ static int dso_set_voltage(const struct sr_dev_inst *sdi) } /* CH2 volts/div is encoded in bits 2-3 */ - sr_dbg("CH2 vdiv index: %d.", devc->voltage_ch2); - switch (devc->voltage_ch2) { + sr_dbg("CH2 vdiv index: %d.", devc->voltage[1]); + switch (devc->voltage[1]) { case VDIV_1V: case VDIV_100MV: case VDIV_10MV: @@ -499,24 +493,24 @@ static int dso_set_relays(const struct sr_dev_inst *sdi) devc = sdi->priv; usb = sdi->conn; - if (devc->voltage_ch1 < VDIV_1V) + if (devc->voltage[0] < VDIV_1V) relays[1] = ~relays[1]; - if (devc->voltage_ch1 < VDIV_100MV) + if (devc->voltage[0] < VDIV_100MV) relays[2] = ~relays[2]; - sr_dbg("CH1 coupling: %d.", devc->coupling_ch1); - if (devc->coupling_ch1 != COUPLING_AC) + sr_dbg("CH1 coupling: %d.", devc->coupling[0]); + if (devc->coupling[0] != COUPLING_AC) relays[3] = ~relays[3]; - if (devc->voltage_ch2 < VDIV_1V) + if (devc->voltage[1] < VDIV_1V) relays[4] = ~relays[4]; - if (devc->voltage_ch2 < VDIV_100MV) + if (devc->voltage[1] < VDIV_100MV) relays[5] = ~relays[5]; - sr_dbg("CH2 coupling: %d.", devc->coupling_ch1); - if (devc->coupling_ch2 != COUPLING_AC) + sr_dbg("CH2 coupling: %d.", devc->coupling[1]); + if (devc->coupling[1] != COUPLING_AC) relays[6] = ~relays[6]; if (!strcmp(devc->triggersource, "EXT")) @@ -557,7 +551,7 @@ static int dso_set_voffsets(const struct sr_dev_inst *sdi) memset(offsets, 0, sizeof(offsets)); /* Channel 1 */ - ch_levels = devc->channel_levels[0][devc->voltage_ch1]; + ch_levels = devc->channel_levels[0][devc->voltage[0]]; offset = (ch_levels[1] - ch_levels[0]) * devc->voffset_ch1 + ch_levels[0]; offsets[0] = (offset >> 8) | 0x20; offsets[1] = offset & 0xff; @@ -565,7 +559,7 @@ static int dso_set_voffsets(const struct sr_dev_inst *sdi) offsets[0], offsets[1]); /* Channel 2 */ - ch_levels = devc->channel_levels[1][devc->voltage_ch2]; + ch_levels = devc->channel_levels[1][devc->voltage[1]]; offset = (ch_levels[1] - ch_levels[0]) * devc->voffset_ch2 + ch_levels[0]; offsets[2] = (offset >> 8) | 0x20; offsets[3] = offset & 0xff;