From: Bartosz Golaszewski Date: Tue, 7 Apr 2015 14:55:24 +0000 (+0200) Subject: baylibre-acme: Set update_interval when modifing samplerate. X-Git-Tag: libsigrok-0.4.0~531 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=7c91c22a31a5017117116fa1fe6c2addbac813f1;p=libsigrok.git baylibre-acme: Set update_interval when modifing samplerate. 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 --- diff --git a/src/hardware/baylibre-acme/api.c b/src/hardware/baylibre-acme/api.c index 85f474cf..6827a16b 100644 --- a/src/hardware/baylibre-acme/api.c +++ b/src/hardware/baylibre-acme/api.c @@ -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) diff --git a/src/hardware/baylibre-acme/protocol.c b/src/hardware/baylibre-acme/protocol.c index ca09eba0..d0552553 100644 --- a/src/hardware/baylibre-acme/protocol.c +++ b/src/hardware/baylibre-acme/protocol.c @@ -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) { diff --git a/src/hardware/baylibre-acme/protocol.h b/src/hardware/baylibre-acme/protocol.h index baa91cac..13c00fe6 100644 --- a/src/hardware/baylibre-acme/protocol.h +++ b/src/hardware/baylibre-acme/protocol.h @@ -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,