+SR_API char *sr_voltage_string(uint64_t v_p, uint64_t v_q)
+{
+ int r;
+ char *o;
+
+ if (!(o = g_try_malloc0(30 + 1))) {
+ sr_err("%s: o malloc failed", __func__);
+ return NULL;
+ }
+
+ if (v_q == 1000)
+ r = snprintf(o, 30, "%" PRIu64 "mV", v_p);
+ else if (v_q == 1)
+ r = snprintf(o, 30, "%" PRIu64 "V", v_p);
+ else
+ r = snprintf(o, 30, "%gV", (float)v_p / (float)v_q);
+
+ if (r < 0) {
+ /* Something went wrong... */
+ g_free(o);
+ return NULL;
+ }
+
+ return o;
+}
+
+/**
+ * Parse a trigger specification string.
+ *
+ * @param sdi The device instance for which the trigger specification is
+ * intended. Must not be NULL. Also, sdi->driver and
+ * sdi->driver->info_get must not be NULL.
+ * @param triggerstring The string containing the trigger specification for
+ * one or more probes of this device. Entries for multiple probes are
+ * comma-separated. Triggers are specified in the form key=value,
+ * where the key is a probe number (or probe name) and the value is
+ * the requested trigger type. Valid trigger types currently
+ * include 'r' (rising edge), 'f' (falling edge), 'c' (any pin value
+ * change), '0' (low value), or '1' (high value).
+ * Example: "1=r,sck=f,miso=0,7=c"
+ *
+ * @return Pointer to a list of trigger types (strings), or NULL upon errors.
+ * The pointer list (if non-NULL) has as many entries as the
+ * respective device has probes (all physically available probes,
+ * not just enabled ones). Entries of the list which don't have
+ * a trigger value set in 'triggerstring' are NULL, the other entries
+ * contain the respective trigger type which is requested for the
+ * respective probe (e.g. "r", "c", and so on).
+ */
+SR_API char **sr_parse_triggerstring(const struct sr_dev_inst *sdi,
+ const char *triggerstring)