From: Gerhard Sittig Date: Sun, 16 Oct 2016 16:25:20 +0000 (+0200) Subject: asix-sigma: store "limit samples" value, re-determine "limit msecs" period X-Git-Tag: libsigrok-0.5.0~208 X-Git-Url: http://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=2f7e529ce64c45508adf616b4b48a7a154aa7798 asix-sigma: store "limit samples" value, re-determine "limit msecs" period The driver internally implements the "limit samples" feature by means of the "limit sample period" approach. Determination of the corresponding period of time for captures depends on the sample rate as well as the maximum sample count, and thus needs to be re-done when either setting changes. Introduce a "limit_samples" variable so that the value is available when needed later. As a byproduct the parameter can be retrieved now (get). Add comments to the sigma_set_samplerate() routine's sections, since quite a bit is happening there, and interacts with other locations. Signed-off-by: Gerhard Sittig --- diff --git a/src/hardware/asix-sigma/api.c b/src/hardware/asix-sigma/api.c index c4e4027c..7345f383 100644 --- a/src/hardware/asix-sigma/api.c +++ b/src/hardware/asix-sigma/api.c @@ -42,7 +42,7 @@ static const uint32_t drvopts[] = { static const uint32_t devopts[] = { SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET, - SR_CONF_LIMIT_SAMPLES | SR_CONF_SET, + SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET, SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, @@ -102,6 +102,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) devc->cur_samplerate = samplerates[0]; devc->period_ps = 0; devc->limit_msec = 0; + devc->limit_samples = 0; devc->cur_firmware = -1; devc->num_channels = 0; devc->samples_per_event = 0; @@ -185,6 +186,9 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s case SR_CONF_LIMIT_MSEC: *data = g_variant_new_uint64(devc->limit_msec); break; + case SR_CONF_LIMIT_SAMPLES: + *data = g_variant_new_uint64(devc->limit_samples); + break; case SR_CONF_CAPTURE_RATIO: *data = g_variant_new_uint64(devc->capture_ratio); break; @@ -223,6 +227,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd break; case SR_CONF_LIMIT_SAMPLES: tmp = g_variant_get_uint64(data); + devc->limit_samples = tmp; devc->limit_msec = tmp * 1000 / devc->cur_samplerate; break; case SR_CONF_CAPTURE_RATIO: diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index b23b26ff..49163da9 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -530,6 +530,7 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler drvc = sdi->driver->context; ret = SR_OK; + /* Reject rates that are not in the list of supported rates. */ for (i = 0; i < samplerates_count; i++) { if (samplerates[i] == samplerate) break; @@ -537,6 +538,11 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler if (i >= samplerates_count || samplerates[i] == 0) return SR_ERR_SAMPLERATE; + /* + * Depending on the samplerates of 200/100/50- MHz, specific + * firmware is required and higher rates might limit the set + * of available channels. + */ if (samplerate <= SR_MHZ(50)) { ret = upload_firmware(drvc->sr_ctx, 0, devc); devc->num_channels = 16; @@ -548,6 +554,11 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler devc->num_channels = 4; } + /* + * Derive the sample period from the sample rate as well as the + * number of samples that the device will communicate within + * an "event" (memory organization internal to the device). + */ if (ret == SR_OK) { devc->cur_samplerate = samplerate; devc->period_ps = 1000000000000ULL / samplerate; @@ -555,6 +566,18 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler devc->state.state = SIGMA_IDLE; } + /* + * Support for "limit_samples" is implemented by stopping + * acquisition after a corresponding period of time. + * Re-calculate that period of time, in case the limit is + * set first and the samplerate gets (re-)configured later. + */ + if (ret == SR_OK && devc->limit_samples) { + uint64_t msecs; + msecs = devc->limit_samples * 1000 / devc->cur_samplerate; + devc->limit_msec = msecs; + } + return ret; } diff --git a/src/hardware/asix-sigma/protocol.h b/src/hardware/asix-sigma/protocol.h index cbacb671..9f320858 100644 --- a/src/hardware/asix-sigma/protocol.h +++ b/src/hardware/asix-sigma/protocol.h @@ -210,6 +210,7 @@ struct dev_context { uint64_t cur_samplerate; uint64_t period_ps; uint64_t limit_msec; + uint64_t limit_samples; struct timeval start_tv; int cur_firmware; int num_channels;