]> sigrok.org Git - libsigrok.git/commitdiff
asix-sigma: Improve sample time estimation, consider hardware pipeline
authorGerhard Sittig <redacted>
Sun, 23 Apr 2017 16:20:44 +0000 (18:20 +0200)
committerUwe Hermann <redacted>
Fri, 26 May 2017 20:47:59 +0000 (22:47 +0200)
Introduce a separate routine which maps sample counts and sample period
to an elapsed sample time after which acquisition shall get stopped.
Add some more time to make sure the most recent captured data has passed
the hardware pipeline and is available for download.

This commit is based on work done by jry@.

src/hardware/asix-sigma/api.c
src/hardware/asix-sigma/protocol.c
src/hardware/asix-sigma/protocol.h

index 7345f3835c7a03edbd78ae08e4d5767433c36eea..0aebe695c3bec49308a40427746a7b37bf7491d4 100644 (file)
@@ -228,7 +228,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd
        case SR_CONF_LIMIT_SAMPLES:
                tmp = g_variant_get_uint64(data);
                devc->limit_samples = tmp;
-               devc->limit_msec = tmp * 1000 / devc->cur_samplerate;
+               devc->limit_msec = sigma_limit_samples_to_msec(devc, tmp);
                break;
        case SR_CONF_CAPTURE_RATIO:
                tmp = g_variant_get_uint64(data);
index 94d1fed607e8f3ba317cadf85819ab2c60d31c84..db89d6890a9c2d9d1f214de5d0335f297719d5b5 100644 (file)
@@ -519,6 +519,30 @@ static int upload_firmware(struct sr_context *ctx,
        return SR_OK;
 }
 
+/*
+ * Sigma doesn't support limiting the number of samples, so we have to
+ * translate the number and the samplerate to an elapsed time.
+ *
+ * In addition we need to ensure that the last data cluster has passed
+ * the hardware pipeline, and became available to the PC side. With RLE
+ * compression up to 327ms could pass before another cluster accumulates
+ * at 200kHz samplerate when input pins don't change.
+ */
+SR_PRIV uint64_t sigma_limit_samples_to_msec(const struct dev_context *devc,
+                                            uint64_t limit_samples)
+{
+       uint64_t limit_msec;
+       uint64_t worst_cluster_time_ms;
+
+       limit_msec = limit_samples * 1000 / devc->cur_samplerate;
+       worst_cluster_time_ms = 65536 * 1000 / devc->cur_samplerate;
+       /*
+        * One cluster time is not enough to flush pipeline when sampling
+        * grounded pins with 1 sample limit at 200kHz. Hence the 2* fix.
+        */
+       return limit_msec + 2 * worst_cluster_time_ms;
+}
+
 SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
 {
        struct dev_context *devc;
@@ -574,7 +598,7 @@ SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t sampler
         */
        if (ret == SR_OK && devc->limit_samples) {
                uint64_t msecs;
-               msecs = devc->limit_samples * 1000 / devc->cur_samplerate;
+               msecs = sigma_limit_samples_to_msec(devc, devc->limit_samples);
                devc->limit_msec = msecs;
        }
 
index 9f3208586c078088b7c5051c40e8eba386e203c0..3621f157d3c2b5ba73c0329010af488fd017f550 100644 (file)
@@ -230,6 +230,8 @@ SR_PRIV int sigma_write_register(uint8_t reg, uint8_t *data, size_t len,
 SR_PRIV int sigma_set_register(uint8_t reg, uint8_t value, struct dev_context *devc);
 SR_PRIV int sigma_write_trigger_lut(struct triggerlut *lut, struct dev_context *devc);
 SR_PRIV void sigma_clear_helper(void *priv);
+SR_PRIV uint64_t sigma_limit_samples_to_msec(const struct dev_context *devc,
+                                            uint64_t limit_samples);
 SR_PRIV int sigma_set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate);
 SR_PRIV int sigma_convert_trigger(const struct sr_dev_inst *sdi);
 SR_PRIV int sigma_receive_data(int fd, int revents, void *cb_data);