X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fhantek-dso%2Fapi.c;h=72f7079365b627dda049cb796d750047d141ce9f;hb=a5b35a167a32ffbaee1ce9c0de8501f781f733d1;hp=eccc6e7856a0fd8f30db88551ce2fcf5cd980c81;hpb=982947f7a221c4dbd2ea2fe9ecb4405ea8c2156a;p=libsigrok.git diff --git a/hardware/hantek-dso/api.c b/hardware/hantek-dso/api.c index eccc6e78..72f70793 100644 --- a/hardware/hantek-dso/api.c +++ b/hardware/hantek-dso/api.c @@ -157,6 +157,7 @@ static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof prof->vendor, prof->model, NULL); if (!sdi) return NULL; + sdi->driver = hdi; if (!(ctx = g_try_malloc0(sizeof(struct context)))) { sr_err("hantek-dso: ctx malloc failed"); @@ -201,6 +202,36 @@ static int configure_probes(struct context *ctx, const GSList *probes) return SR_OK; } +/* Properly close and free all devices. */ +static void clear_instances(void) +{ + struct sr_dev_inst *sdi; + struct context *ctx; + GSList *l; + + for (l = hdi->instances; l; l = l->next) { + if (!(sdi = l->data)) { + /* Log error, but continue cleaning up the rest. */ + sr_err("hantek-dso: %s: sdi was NULL, continuing", __func__); + continue; + } + if (!(ctx = sdi->priv)) { + /* Log error, but continue cleaning up the rest. */ + sr_err("hantek-dso: %s: sdi->priv was NULL, continuing", __func__); + continue; + } + dso_close(sdi); + sr_usb_dev_inst_free(ctx->usb); + g_free(ctx->triggersource); + + sr_dev_inst_free(sdi); + } + + g_slist_free(hdi->instances); + hdi->instances = NULL; + +} + static int hw_init(void) { @@ -212,17 +243,24 @@ static int hw_init(void) return SR_OK; } -static int hw_scan(void) +static GSList *hw_scan(GSList *options) { struct sr_dev_inst *sdi; - struct libusb_device_descriptor des; const struct dso_profile *prof; struct context *ctx; + GSList *devices; + struct libusb_device_descriptor des; libusb_device **devlist; int devcnt, ret, i, j; - /* Find all Hantek DSO devices and upload firmware to all of them. */ + (void)options; devcnt = 0; + devices = 0; + hdi->instances = NULL; + + clear_instances(); + + /* Find all Hantek DSO devices and upload firmware to all of them. */ libusb_get_device_list(usb_context, &devlist); for (i = 0; devlist[i]; i++) { if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { @@ -238,6 +276,7 @@ static int hw_scan(void) prof = &dev_profiles[j]; sr_dbg("hantek-dso: Found a %s %s.", prof->vendor, prof->model); sdi = dso_dev_new(devcnt, prof); + devices = g_slist_append(devices, sdi); ctx = sdi->priv; if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, prof->firmware) == SR_OK) @@ -258,6 +297,7 @@ static int hw_scan(void) sr_dbg("hantek-dso: Found a %s %s.", prof->vendor, prof->model); sdi = dso_dev_new(devcnt, prof); sdi->status = SR_ST_INACTIVE; + devices = g_slist_append(devices, sdi); ctx = sdi->priv; ctx->usb = sr_usb_dev_inst_new( libusb_get_bus_number(devlist[i]), @@ -272,18 +312,15 @@ static int hw_scan(void) } libusb_free_device_list(devlist, 1); - return devcnt; + return devices; } -static int hw_dev_open(int dev_index) +static int hw_dev_open(struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; struct context *ctx; int64_t timediff_us, timediff_ms; int err; - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ERR_ARG; ctx = sdi->priv; /* @@ -297,7 +334,7 @@ static int hw_dev_open(int dev_index) g_usleep(300 * 1000); timediff_ms = 0; while (timediff_ms < MAX_RENUM_DELAY_MS) { - if ((err = dso_open(dev_index)) == SR_OK) + if ((err = dso_open(sdi)) == SR_OK) break; g_usleep(100 * 1000); timediff_us = g_get_monotonic_time() - ctx->fw_updated; @@ -306,7 +343,7 @@ static int hw_dev_open(int dev_index) } sr_info("hantek-dso: device came back after %d ms", timediff_ms); } else { - err = dso_open(dev_index); + err = dso_open(sdi); } if (err != SR_OK) { @@ -323,12 +360,8 @@ static int hw_dev_open(int dev_index) return SR_OK; } -static int hw_dev_close(int dev_index) +static int hw_dev_close(struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; - - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ERR_ARG; dso_close(sdi); @@ -337,31 +370,8 @@ static int hw_dev_close(int dev_index) static int hw_cleanup(void) { - GSList *l; - struct sr_dev_inst *sdi; - struct context *ctx; - - /* Properly close and free all devices. */ - for (l = hdi->instances; l; l = l->next) { - if (!(sdi = l->data)) { - /* Log error, but continue cleaning up the rest. */ - sr_err("hantek-dso: %s: sdi was NULL, continuing", __func__); - continue; - } - if (!(ctx = sdi->priv)) { - /* Log error, but continue cleaning up the rest. */ - sr_err("hantek-dso: %s: sdi->priv was NULL, continuing", __func__); - continue; - } - dso_close(sdi); - sr_usb_dev_inst_free(ctx->usb); - g_free(ctx->triggersource); - sr_dev_inst_free(sdi); - } - - g_slist_free(hdi->instances); - hdi->instances = NULL; + clear_instances(); if (usb_context) libusb_exit(usb_context); @@ -370,71 +380,56 @@ static int hw_cleanup(void) return SR_OK; } -static const void *hw_dev_info_get(int dev_index, int dev_info_id) +static int hw_info_get(int info_id, const void **data, + const struct sr_dev_inst *sdi) { - struct sr_dev_inst *sdi; - const void *info; uint64_t tmp; - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return NULL; - - info = NULL; - switch (dev_info_id) { + switch (info_id) { case SR_DI_INST: - info = sdi; + *data = sdi; + break; + case SR_DI_HWCAPS: + *data = hwcaps; break; case SR_DI_NUM_PROBES: - info = GINT_TO_POINTER(NUM_PROBES); + *data = GINT_TO_POINTER(NUM_PROBES); break; case SR_DI_PROBE_NAMES: - info = probe_names; + *data = probe_names; break; case SR_DI_BUFFERSIZES: - info = buffersizes; + *data = buffersizes; break; case SR_DI_TIMEBASES: - info = timebases; + *data = timebases; break; case SR_DI_TRIGGER_SOURCES: - info = trigger_sources; + *data = trigger_sources; break; case SR_DI_FILTERS: - info = filter_targets; + *data = filter_targets; break; case SR_DI_VDIVS: - info = vdivs; + *data = vdivs; break; case SR_DI_COUPLING: - info = coupling; + *data = coupling; break; /* TODO remove this */ case SR_DI_CUR_SAMPLERATE: - info = &tmp; + *data = &tmp; break; + default: + return SR_ERR_ARG; } - return info; -} - -static int hw_dev_status_get(int dev_index) -{ - struct sr_dev_inst *sdi; - - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ST_NOT_FOUND; - - return sdi->status; -} - -static const int *hw_hwcap_get_all(void) -{ - return hwcaps; + return SR_OK; } -static int hw_dev_config_set(int dev_index, int hwcap, const void *value) +static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, + const void *value) { - struct sr_dev_inst *sdi; struct context *ctx; struct sr_rational tmp_rat; float tmp_float; @@ -442,9 +437,6 @@ static int hw_dev_config_set(int dev_index, int hwcap, const void *value) int ret, i; char **targets; - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ERR; - if (sdi->status != SR_ST_ACTIVE) return SR_ERR; @@ -785,19 +777,16 @@ static int handle_event(int fd, int revents, void *cb_data) return TRUE; } -static int hw_dev_acquisition_start(int dev_index, void *cb_data) +static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, + void *cb_data) { const struct libusb_pollfd **lupfd; struct sr_datafeed_packet packet; struct sr_datafeed_header header; struct sr_datafeed_meta_analog meta; - struct sr_dev_inst *sdi; struct context *ctx; int i; - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ERR; - if (sdi->status != SR_ST_ACTIVE) return SR_ERR; @@ -836,15 +825,12 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) /* TODO: doesn't really cancel pending transfers so they might come in after * SR_DF_END is sent. */ -static int hw_dev_acquisition_stop(int dev_index, void *cb_data) +static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, + void *cb_data) { struct sr_datafeed_packet packet; - struct sr_dev_inst *sdi; struct context *ctx; - if (!(sdi = sr_dev_inst_get(hdi->instances, dev_index))) - return SR_ERR; - if (sdi->status != SR_ST_ACTIVE) return SR_ERR; @@ -866,9 +852,7 @@ SR_PRIV struct sr_dev_driver hantek_dso_driver_info = { .scan = hw_scan, .dev_open = hw_dev_open, .dev_close = hw_dev_close, - .dev_info_get = hw_dev_info_get, - .dev_status_get = hw_dev_status_get, - .hwcap_get_all = hw_hwcap_get_all, + .info_get = hw_info_get, .dev_config_set = hw_dev_config_set, .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop,