X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fbaylibre-acme%2Fprotocol.c;h=f8fdb595435a21a49dc18fa6dcb03fcc9e16b331;hb=aae2273b99b9155ea1b91bc65eb4c91e06e3c8e2;hp=656e89fec6c3e140a5bbb7909ce6203d64344422;hpb=d0148a506ed1007518704d72c0410d4361668fa4;p=libsigrok.git diff --git a/src/hardware/baylibre-acme/protocol.c b/src/hardware/baylibre-acme/protocol.c index 656e89fe..f8fdb595 100644 --- a/src/hardware/baylibre-acme/protocol.c +++ b/src/hardware/baylibre-acme/protocol.c @@ -245,6 +245,20 @@ SR_PRIV gboolean bl_acme_register_probe(struct sr_dev_inst *sdi, int type, return TRUE; } +SR_PRIV int bl_acme_get_probe_type(const struct sr_channel_group *cg) +{ + struct channel_group_priv *cgp = cg->priv; + + return cgp->probe_type; +} + +SR_PRIV int bl_acme_probe_has_pws(const struct sr_channel_group *cg) +{ + struct channel_group_priv *cgp = cg->priv; + + return sr_gpio_getval_export(pws_info_gpios[cgp->index]); +} + /* * Sets path to the hwmon attribute if this channel group * supports shunt resistance setting. The caller has to supply @@ -281,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) { @@ -348,8 +399,7 @@ SR_PRIV int bl_acme_read_power_state(const struct sr_channel_group *cg, cgp = cg->priv; - val = sr_gpio_getval_export(pws_info_gpios[cgp->index]); - if (val != 1) { + if (!bl_acme_probe_has_pws(cg)) { sr_err("Probe has no power-switch"); return SR_ERR_ARG; } @@ -368,13 +418,17 @@ SR_PRIV int bl_acme_set_power_off(const struct sr_channel_group *cg, cgp = cg->priv; - val = sr_gpio_getval_export(pws_info_gpios[cgp->index]); - if (val != 1) { + if (!bl_acme_probe_has_pws(cg)) { sr_err("Probe has no power-switch"); return SR_ERR_ARG; } val = sr_gpio_setval_export(pws_gpios[cgp->index], off ? 0 : 1); + if (val < 0) { + sr_err("Error setting power-off state: gpio: %d", + pws_gpios[cgp->index]); + return SR_ERR_IO; + } return SR_OK; }