X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-6xxx%2Fapi.c;h=ad407a2e29825983a70550f00b03615d0a04f187;hb=53279f13e4694fcf2aba314baade418941b0bc3e;hp=349b557b7eaa91d3937548ea21bad0de3097e475;hpb=1e1fdbc994e7c7345698e776e73d7ea5c4d950a9;p=libsigrok.git diff --git a/src/hardware/hantek-6xxx/api.c b/src/hardware/hantek-6xxx/api.c index 349b557b..ad407a2e 100644 --- a/src/hardware/hantek-6xxx/api.c +++ b/src/hardware/hantek-6xxx/api.c @@ -36,10 +36,10 @@ static const uint32_t drvopts[] = { static const uint32_t devopts[] = { SR_CONF_CONN | SR_CONF_GET, - SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_NUM_VDIV | SR_CONF_GET, SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET, SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET, + SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_NUM_VDIV | SR_CONF_GET, }; static const uint32_t devopts_cg[] = { @@ -52,7 +52,7 @@ static const char *channel_names[] = { }; static const char *dc_coupling[] = { - "DC", "DC", + "DC", }; static const char *acdc_coupling[] = { @@ -61,15 +61,20 @@ static const char *acdc_coupling[] = { static const struct hantek_6xxx_profile dev_profiles[] = { { - 0x04b4, 0x6022, 0x04b5, 0x6022, - "Hantek", "6022BE", "hantek-6022be.fw", + 0x04b4, 0x6022, 0x1d50, 0x608e, 0x0001, + "Hantek", "6022BE", "fx2lafw-hantek-6022be.fw", dc_coupling, ARRAY_SIZE(dc_coupling), FALSE, }, { - 0x8102, 0x8102, 0x1D50, 0x608E, - "Sainsmart", "DDS120", "sainsmart-dds120.fw", + 0x8102, 0x8102, 0x1d50, 0x608e, 0x0002, + "Sainsmart", "DDS120", "fx2lafw-sainsmart-dds120.fw", acdc_coupling, ARRAY_SIZE(acdc_coupling), TRUE, }, + { + 0x04b4, 0x602a, 0x1d50, 0x608e, 0x0003, + "Hantek", "6022BL", "fx2lafw-hantek-6022bl.fw", + dc_coupling, ARRAY_SIZE(dc_coupling), FALSE, + }, ALL_ZERO }; @@ -83,8 +88,6 @@ static const uint64_t vdivs[][2] = { static int read_channel(const struct sr_dev_inst *sdi, uint32_t amount); -static int dev_acquisition_stop(struct sr_dev_inst *sdi); - static struct sr_dev_inst *hantek_6xxx_dev_new(const struct hantek_6xxx_profile *prof) { struct sr_dev_inst *sdi; @@ -115,6 +118,7 @@ static struct sr_dev_inst *hantek_6xxx_dev_new(const struct hantek_6xxx_profile } devc->coupling_vals = prof->coupling_vals; devc->coupling_tab_size = prof->coupling_tab_size; + devc->has_coupling = prof->has_coupling; devc->sample_buf = NULL; devc->sample_buf_write = 0; @@ -152,7 +156,7 @@ static int configure_channels(const struct sr_dev_inst *sdi) return SR_OK; } -static void clear_dev_context(void *priv) +static void clear_helper(void *priv) { struct dev_context *devc; @@ -163,7 +167,7 @@ static void clear_dev_context(void *priv) static int dev_clear(const struct sr_dev_driver *di) { - return std_dev_clear(di, clear_dev_context); + return std_dev_clear_with_callback(di, clear_helper); } static GSList *scan(struct sr_dev_driver *di, GSList *options) @@ -241,7 +245,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) libusb_get_bus_number(devlist[i]), 0xff, NULL); break; } else if (des.idVendor == dev_profiles[j].fw_vid - && des.idProduct == dev_profiles[j].fw_pid) { + && des.idProduct == dev_profiles[j].fw_pid + && des.bcdDevice == dev_profiles[j].fw_prod_ver) { /* Device matches the post-firmware profile. */ prof = &dev_profiles[j]; sr_dbg("Found a %s %s.", prof->vendor, prof->model); @@ -307,7 +312,7 @@ static int dev_open(struct sr_dev_inst *sdi) err = libusb_claim_interface(usb->devhdl, USB_INTERFACE); if (err != 0) { sr_err("Unable to claim interface: %s.", - libusb_error_name(err)); + libusb_error_name(err)); return SR_ERR; } @@ -378,7 +383,8 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s *data = g_variant_new("(tt)", vdiv[0], vdiv[1]); break; case SR_CONF_COUPLING: - *data = g_variant_new_string(devc->coupling_vals[devc->coupling[ch_idx]]); + *data = g_variant_new_string((devc->coupling[ch_idx] \ + == COUPLING_DC) ? "DC" : "AC"); break; } } @@ -395,9 +401,6 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd unsigned int i; const char *tmp_str; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - ret = SR_OK; devc = sdi->priv; if (!cg) { @@ -701,7 +704,7 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer) PRIu64 " <= %" PRIu64, devc->limit_samples, devc->samp_received); send_data(sdi, devc->sample_buf, devc->limit_samples); - sdi->driver->dev_acquisition_stop(sdi); + sr_dev_acquisition_stop(sdi); } else if (devc->limit_msec && (g_get_monotonic_time() - devc->aq_started) / 1000 >= devc->limit_msec) { sr_info("Requested time limit reached, stopping. %d <= %d", @@ -710,7 +713,7 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer) send_data(sdi, devc->sample_buf, devc->samp_received); g_free(devc->sample_buf); devc->sample_buf = NULL; - sdi->driver->dev_acquisition_stop(sdi); + sr_dev_acquisition_stop(sdi); } else { read_channel(sdi, data_amount(sdi)); } @@ -778,9 +781,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) struct sr_dev_driver *di = sdi->driver; struct drv_context *drvc = di->context; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - devc = sdi->priv; if (configure_channels(sdi) != SR_OK) { @@ -810,13 +810,11 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) { struct dev_context *devc; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR; - devc = sdi->priv; devc->dev_state = STOPPING; - g_free(devc->sample_buf); devc->sample_buf = NULL; + g_free(devc->sample_buf); + devc->sample_buf = NULL; return SR_OK; }