]> sigrok.org Git - libsigrok.git/commitdiff
asix-sigma: store "limit samples" value, re-determine "limit msecs" period
authorGerhard Sittig <redacted>
Sun, 16 Oct 2016 16:25:20 +0000 (18:25 +0200)
committerUwe Hermann <redacted>
Mon, 17 Oct 2016 00:05:21 +0000 (02:05 +0200)
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 <redacted>
src/hardware/asix-sigma/api.c
src/hardware/asix-sigma/protocol.c
src/hardware/asix-sigma/protocol.h

index c4e4027c8a1d23663b21d5e8e4b71ce595346800..7345f3835c7a03edbd78ae08e4d5767433c36eea 100644 (file)
@@ -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:
index b23b26ff832cca1cb4d0d8aa1d938c1631512bf2..49163da990155d924ef5aff178158877ee7f0407 100644 (file)
@@ -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;
 }
 
index cbacb6715376337d03b39250f527661641446bb6..9f3208586c078088b7c5051c40e8eba386e203c0 100644 (file)
@@ -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;