X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-6xxx%2Fprotocol.c;h=75d8ab91c0f14fb4c2cfed4ce2222173e53f4660;hb=551024f26f62cdea8eef1b787fbef31e1b58c466;hp=4c2b8cdaf76dbd817835f52572ef436b25e9bde6;hpb=c940b7a32f0bad7fe50e8b3d6772f208beb71faa;p=libsigrok.git diff --git a/src/hardware/hantek-6xxx/protocol.c b/src/hardware/hantek-6xxx/protocol.c index 4c2b8cda..75d8ab91 100644 --- a/src/hardware/hantek-6xxx/protocol.c +++ b/src/hardware/hantek-6xxx/protocol.c @@ -27,16 +27,12 @@ SR_PRIV int hantek_6xxx_open(struct sr_dev_inst *sdi) struct sr_usb_dev_inst *usb; struct libusb_device_descriptor des; libusb_device **devlist; - int err, i; + int err = SR_ERR, i; char connection_id[64]; devc = sdi->priv; usb = sdi->conn; - if (sdi->status == SR_ST_ACTIVE) - /* Already in use. */ - return SR_ERR; - libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); for (i = 0; devlist[i]; i++) { libusb_get_device_descriptor(devlist[i], &des); @@ -50,7 +46,9 @@ SR_PRIV int hantek_6xxx_open(struct sr_dev_inst *sdi) /* * Check device by its physical USB bus/port address. */ - usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)); + if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0) + continue; + if (strcmp(sdi->connection_id, connection_id)) /* This is not the one. */ continue; @@ -65,14 +63,16 @@ SR_PRIV int hantek_6xxx_open(struct sr_dev_inst *sdi) usb->address = libusb_get_device_address(devlist[i]); } - sdi->status = SR_ST_ACTIVE; sr_info("Opened device on %d.%d (logical) / " "%s (physical) interface %d.", usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); + + err = SR_OK; } else { sr_err("Failed to open device: %s.", libusb_error_name(err)); + err = SR_ERR; } /* If we made it here, we handled the device (somehow). */ @@ -81,10 +81,7 @@ SR_PRIV int hantek_6xxx_open(struct sr_dev_inst *sdi) libusb_free_device_list(devlist, 1); - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR; - - return SR_OK; + return err; } SR_PRIV void hantek_6xxx_close(struct sr_dev_inst *sdi) @@ -123,7 +120,7 @@ SR_PRIV int hantek_6xxx_get_channeldata(const struct sr_dev_inst *sdi, transfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(transfer, usb->devhdl, HANTEK_EP_IN, buf, data_amount, cb, (void *)sdi, 4000); - if ((ret = libusb_submit_transfer(transfer)) != 0) { + if ((ret = libusb_submit_transfer(transfer)) < 0) { sr_err("Failed to submit transfer: %s.", libusb_error_name(ret)); /* TODO: Free them all. */ @@ -215,6 +212,20 @@ SR_PRIV int hantek_6xxx_update_vdiv(const struct sr_dev_inst *sdi) return MIN(ret1, ret2); } +SR_PRIV int hantek_6xxx_update_coupling(const struct sr_dev_inst *sdi) +{ + struct dev_context *devc = sdi->priv; + uint8_t coupling = 0xFF & ((devc->coupling[1] << 4) | devc->coupling[0]); + + if (devc->has_coupling) { + sr_dbg("update coupling 0x%x", coupling); + return write_control(sdi, COUPLING_REG, coupling); + } else { + sr_dbg("coupling not supported"); + return SR_OK; + } +} + SR_PRIV int hantek_6xxx_update_channels(const struct sr_dev_inst *sdi) { struct dev_context *devc = sdi->priv; @@ -230,6 +241,7 @@ SR_PRIV int hantek_6xxx_init(const struct sr_dev_inst *sdi) hantek_6xxx_update_samplerate(sdi); hantek_6xxx_update_vdiv(sdi); + hantek_6xxx_update_coupling(sdi); // hantek_6xxx_update_channels(sdi); /* Only 2 channel mode supported. */ return SR_OK;