]> sigrok.org Git - libsigrok.git/commitdiff
baylibre-acme: Set update_interval when modifing samplerate.
authorBartosz Golaszewski <redacted>
Tue, 7 Apr 2015 14:55:24 +0000 (16:55 +0200)
committerUwe Hermann <redacted>
Sun, 12 Apr 2015 15:16:32 +0000 (17:16 +0200)
Both ina2xx and tmp401 linux drivers used by baylibre-acme expose
the standard hwmon update_interval attribute, which affects the internal
update interval of the chip.

When setting samplerate for data acquisition try to modify this
attribute accordingly.

Signed-off-by: Bartosz Golaszewski <redacted>
src/hardware/baylibre-acme/api.c
src/hardware/baylibre-acme/protocol.c
src/hardware/baylibre-acme/protocol.h

index 85f474cf3ca66fcda15c30aa56dbc18c74a33d09..6827a16bfe5da763756f34318856411f0f220ee8 100644 (file)
@@ -250,6 +250,7 @@ static int config_set(uint32_t key, GVariant *data,
                        break;
                }
                devc->samplerate = samplerate;
+               bl_acme_maybe_set_update_interval(sdi, samplerate);
                break;
        case SR_CONF_PROBE_FACTOR:
                if (!cg)
index ca09eba069c51a0c017f851b53b31d5779346d58..d0552553feffbebdb298cba9c1c848e0d87de1e8 100644 (file)
@@ -295,6 +295,43 @@ static int get_shunt_path(const struct sr_channel_group *cg, GString *path)
        return ret;
 }
 
+/*
+ * Try setting the update_interval sysfs attribute for each probe according
+ * to samplerate.
+ */
+SR_PRIV void bl_acme_maybe_set_update_interval(const struct sr_dev_inst *sdi,
+                                              uint64_t samplerate)
+{
+       struct sr_channel_group *cg;
+       struct channel_group_priv *cgp;
+       GString *hwmon;
+       GSList *l;
+       FILE *fd;
+
+       for (l = sdi->channel_groups; l != NULL; l = l->next) {
+               cg = l->data;
+               cgp = cg->priv;
+
+               hwmon = g_string_sized_new(64);
+               g_string_append_printf(hwmon,
+                               "/sys/class/hwmon/hwmon%d/update_interval",
+                               cgp->hwmon_num);
+
+               if (g_file_test(hwmon->str, G_FILE_TEST_EXISTS)) {
+                       fd = g_fopen(hwmon->str, "w");
+                       if (!fd) {
+                               g_string_free(hwmon, TRUE);
+                               continue;
+                       }
+
+                       g_fprintf(fd, "%" PRIu64 "\n", 1000 / samplerate);
+                       fclose(fd);
+               }
+
+               g_string_free(hwmon, TRUE);
+       }
+}
+
 SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
                              uint64_t *shunt)
 {
index baa91cac33745a251cd23a6e799ee58971d79d77..13c00fe684679b9ec3aaeae9935909f11240447e 100644 (file)
@@ -84,6 +84,9 @@ SR_PRIV gboolean bl_acme_register_probe(struct sr_dev_inst *sdi, int type,
 SR_PRIV int bl_acme_get_probe_type(const struct sr_channel_group *cg);
 SR_PRIV int bl_acme_probe_has_pws(const struct sr_channel_group *cg);
 
+SR_PRIV void bl_acme_maybe_set_update_interval(const struct sr_dev_inst *sdi,
+                                              uint64_t samplerate);
+
 SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
                              uint64_t *shunt);
 SR_PRIV int bl_acme_set_shunt(const struct sr_channel_group *cg,