X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fkingst-la2016%2Fapi.c;h=93bc4d668132c2452ebbdbf9ed4e2178926ab807;hb=7047acc8e85b38713450e800037dbcddb1fa98ac;hp=0e8f9fe03c6378e4b6bcd51bbaf7fb37a7e7e003;hpb=9270f8f437581605ab4e3e808e2bd62f41ab7d35;p=libsigrok.git diff --git a/src/hardware/kingst-la2016/api.c b/src/hardware/kingst-la2016/api.c index 0e8f9fe0..93bc4d66 100644 --- a/src/hardware/kingst-la2016/api.c +++ b/src/hardware/kingst-la2016/api.c @@ -1,6 +1,7 @@ /* * This file is part of the libsigrok project. * + * Copyright (C) 2022 Gerhard Sittig * Copyright (C) 2020 Florian Schmidt * Copyright (C) 2013 Marcus Comstedt * Copyright (C) 2013 Bert Vermeulen @@ -50,10 +51,6 @@ static const uint32_t devopts[] = { SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET, #if WITH_THRESHOLD_DEVCFG SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, -#if !WITH_THRESHOLD_SIMPLE - SR_CONF_LOGIC_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, - SR_CONF_LOGIC_THRESHOLD_CUSTOM | SR_CONF_GET | SR_CONF_SET, -#endif #endif SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, @@ -153,8 +150,6 @@ static const uint64_t rates_100mhz[] = { SR_MHZ(100), }; -#if WITH_THRESHOLD_SIMPLE - /* * Only list a few discrete voltages, to form a useful set which covers * most logic families. Too many choices can make some applications use @@ -188,55 +183,6 @@ static double threshold_voltage(const struct sr_dev_inst *sdi, double *high) return voltage; } -#else /* WITH_THRESHOLD_SIMPLE */ - -static const float logic_threshold_value[] = { - 1.58, - 2.5, - 1.165, - 1.5, - 1.25, - 0.9, - 0.75, - 0.60, - 0.45, -}; - -static const char *logic_threshold[] = { - "TTL 5V", - "CMOS 5V", - "CMOS 3.3V", - "CMOS 3.0V", - "CMOS 2.5V", - "CMOS 1.8V", - "CMOS 1.5V", - "CMOS 1.2V", - "CMOS 0.9V", - "USER", -}; - -#define LOGIC_THRESHOLD_IDX_USER (ARRAY_SIZE(logic_threshold) - 1) - -static double threshold_voltage(const struct sr_dev_inst *sdi, double *high) -{ - struct dev_context *devc; - size_t idx; - double voltage; - - devc = sdi->priv; - idx = devc->threshold_voltage_idx; - if (idx == LOGIC_THRESHOLD_IDX_USER) - voltage = devc->threshold_voltage; - else - voltage = logic_threshold_value[idx]; - if (high) - *high = voltage; - - return voltage; -} - -#endif /* WITH_THRESHOLD_SIMPLE */ - /* Convenience. Release an allocated devc from error paths. */ static void kingst_la2016_free_devc(struct dev_context *devc) { @@ -572,9 +518,10 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) * this device. */ devc->fw_uploaded = 0; + devc->usb_pid = pid; if (des.iProduct != LA2016_IPRODUCT_INDEX) { sr_info("Uploading MCU firmware to '%s'.", conn_id); - ret = la2016_upload_firmware(sdi, ctx, dev, pid); + ret = la2016_upload_firmware(sdi, ctx, dev, FALSE); if (ret != SR_OK) { sr_err("MCU firmware upload failed."); kingst_la2016_free_sdi(sdi); @@ -584,6 +531,13 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) usb->address = 0xff; renum_devices = g_slist_append(renum_devices, sdi); continue; + } else { + ret = la2016_upload_firmware(sdi, NULL, NULL, TRUE); + if (ret != SR_OK) { + sr_err("MCU firmware filename check failed."); + kingst_la2016_free_sdi(sdi); + continue; + } } /* @@ -672,13 +626,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sr_sw_limits_init(&devc->sw_limits); devc->sw_limits.limit_samples = 0; devc->capture_ratio = 50; - devc->cur_samplerate = devc->model->samplerate; -#if WITH_THRESHOLD_SIMPLE + devc->samplerate = devc->model->samplerate; devc->threshold_voltage_idx = LOGIC_THRESHOLD_IDX_DFLT; -#else /* WITH_THRESHOLD_SIMPLE */ - devc->threshold_voltage_idx = 0; - devc->threshold_voltage = logic_threshold_value[devc->threshold_voltage_idx]; -#endif /* WITH_THRESHOLD_SIMPLE */ if (ARRAY_SIZE(devc->pwm_setting) >= 1) { devc->pwm_setting[0].enabled = FALSE; devc->pwm_setting[0].freq = SR_KHZ(1); @@ -731,7 +680,8 @@ static int dev_close(struct sr_dev_inst *sdi) if (!usb->devhdl) return SR_ERR_BUG; - la2016_deinit_hardware(sdi); + if (WITH_DEINIT_IN_CLOSE) + la2016_deinit_hardware(sdi); sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.", usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); @@ -803,7 +753,6 @@ static int config_get(uint32_t key, GVariant **data, struct pwm_setting *pwm; struct sr_usb_dev_inst *usb; double voltage, rounded; - const char *label; (void)rounded; (void)voltage; @@ -821,12 +770,10 @@ static int config_get(uint32_t key, GVariant **data, if (cg && cg_type == SR_CHANNEL_LOGIC) { switch (key) { #if !WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_VOLTAGE_THRESHOLD: voltage = threshold_voltage(sdi, NULL); *data = std_gvar_tuple_double(voltage, voltage); break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ default: return SR_ERR_NA; @@ -859,7 +806,7 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_printf("%d.%d", usb->bus, usb->address); break; case SR_CONF_SAMPLERATE: - *data = g_variant_new_uint64(devc->cur_samplerate); + *data = g_variant_new_uint64(devc->samplerate); break; case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_MSEC: @@ -868,24 +815,10 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_uint64(devc->capture_ratio); break; #if WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_VOLTAGE_THRESHOLD: voltage = threshold_voltage(sdi, NULL); *data = std_gvar_tuple_double(voltage, voltage); break; -#else /* WITH_THRESHOLD_SIMPLE */ - case SR_CONF_VOLTAGE_THRESHOLD: - rounded = (int)(devc->threshold_voltage / 0.1) * 0.1; - *data = std_gvar_tuple_double(rounded, rounded + 0.1); - break; - case SR_CONF_LOGIC_THRESHOLD: - label = logic_threshold[devc->threshold_voltage_idx]; - *data = g_variant_new_string(label); - break; - case SR_CONF_LOGIC_THRESHOLD_CUSTOM: - *data = g_variant_new_double(devc->threshold_voltage); - break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ default: return SR_ERR_NA; @@ -902,7 +835,6 @@ static int config_set(uint32_t key, GVariant *data, size_t logic_idx, analog_idx; struct pwm_setting *pwm; double value_f; - double low, high, voltage; int idx; devc = sdi->priv; @@ -916,7 +848,6 @@ static int config_set(uint32_t key, GVariant *data, if (cg && cg_type == SR_CHANNEL_LOGIC) { switch (key) { #if !WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_LOGIC_THRESHOLD: idx = std_double_tuple_idx(data, ARRAY_AND_SIZE(threshold_ranges)); @@ -924,7 +855,6 @@ static int config_set(uint32_t key, GVariant *data, return SR_ERR_ARG; devc->threshold_voltage_idx = idx; break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ default: return SR_ERR_NA; @@ -968,7 +898,7 @@ static int config_set(uint32_t key, GVariant *data, switch (key) { case SR_CONF_SAMPLERATE: - devc->cur_samplerate = g_variant_get_uint64(data); + devc->samplerate = g_variant_get_uint64(data); break; case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_MSEC: @@ -977,7 +907,6 @@ static int config_set(uint32_t key, GVariant *data, devc->capture_ratio = g_variant_get_uint64(data); break; #if WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_VOLTAGE_THRESHOLD: idx = std_double_tuple_idx(data, ARRAY_AND_SIZE(threshold_ranges)); @@ -985,26 +914,6 @@ static int config_set(uint32_t key, GVariant *data, return SR_ERR_ARG; devc->threshold_voltage_idx = idx; break; -#else /* WITH_THRESHOLD_SIMPLE */ - case SR_CONF_VOLTAGE_THRESHOLD: - g_variant_get(data, "(dd)", &low, &high); - devc->threshold_voltage = (low + high) / 2.0; - devc->threshold_voltage_idx = LOGIC_THRESHOLD_IDX_USER; - break; - case SR_CONF_LOGIC_THRESHOLD: { - idx = std_str_idx(data, ARRAY_AND_SIZE(logic_threshold)); - if (idx < 0) - return SR_ERR_ARG; - if (idx != LOGIC_THRESHOLD_IDX_USER) { - devc->threshold_voltage = logic_threshold_value[idx]; - } - devc->threshold_voltage_idx = idx; - break; - } - case SR_CONF_LOGIC_THRESHOLD_CUSTOM: - devc->threshold_voltage = g_variant_get_double(data); - break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ default: return SR_ERR_NA; @@ -1038,11 +947,9 @@ static int config_list(uint32_t key, GVariant **data, sizeof(devopts_cg_logic[0])); break; #if !WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_VOLTAGE_THRESHOLD: *data = std_gvar_thresholds(ARRAY_AND_SIZE(threshold_ranges)); break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ default: return SR_ERR_NA; @@ -1076,33 +983,22 @@ static int config_list(uint32_t key, GVariant **data, *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_500mhz)); else if (devc->model->samplerate == SR_MHZ(200)) *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_200mhz)); - else + else if (devc->model->samplerate == SR_MHZ(100)) *data = std_gvar_samplerates(ARRAY_AND_SIZE(rates_100mhz)); + else + return SR_ERR_BUG; break; case SR_CONF_LIMIT_SAMPLES: *data = std_gvar_tuple_u64(0, LA2016_NUM_SAMPLES_MAX); break; #if WITH_THRESHOLD_DEVCFG -#if WITH_THRESHOLD_SIMPLE case SR_CONF_VOLTAGE_THRESHOLD: *data = std_gvar_thresholds(ARRAY_AND_SIZE(threshold_ranges)); break; -#else /* WITH_THRESHOLD_SIMPLE */ - case SR_CONF_VOLTAGE_THRESHOLD: - *data = std_gvar_min_max_step_thresholds( - LA2016_THR_VOLTAGE_MIN, - LA2016_THR_VOLTAGE_MAX, 0.1); - break; -#endif /* WITH_THRESHOLD_SIMPLE */ #endif /* WITH_THRESHOLD_DEVCFG */ case SR_CONF_TRIGGER_MATCH: *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches)); break; -#if WITH_THRESHOLD_DEVCFG && !WITH_THRESHOLD_SIMPLE - case SR_CONF_LOGIC_THRESHOLD: - *data = g_variant_new_strv(ARRAY_AND_SIZE(logic_threshold)); - break; -#endif default: return SR_ERR_NA; } @@ -1116,6 +1012,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) struct drv_context *drvc; struct sr_context *ctx; struct dev_context *devc; + size_t unitsize; double voltage; int ret; @@ -1125,12 +1022,21 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc = sdi->priv; if (!devc->feed_queue) { + if (devc->model->channel_count == 32) + unitsize = sizeof(uint32_t); + else if (devc->model->channel_count == 16) + unitsize = sizeof(uint16_t); + else + return SR_ERR_ARG; devc->feed_queue = feed_queue_logic_alloc(sdi, - LA2016_CONVBUFFER_SIZE, sizeof(uint16_t)); + LA2016_CONVBUFFER_SIZE, unitsize); if (!devc->feed_queue) { sr_err("Cannot allocate buffer for session feed."); return SR_ERR_MALLOC; } + devc->packets_per_chunk = TRANSFER_PACKET_LENGTH; + devc->packets_per_chunk--; + devc->packets_per_chunk /= unitsize + sizeof(uint8_t); } sr_sw_limits_acquisition_start(&devc->sw_limits);