+static int config_probe_set(const struct sr_dev_inst *sdi,
+ struct sr_probe *probe, unsigned int changes)
+{
+ uint64_t probe_bit;
+ uint64_t trigger_mask;
+ uint64_t trigger_values;
+ uint64_t trigger_edge_mask;
+ struct dev_context *devc;
+
+ devc = sdi->priv;
+ if (!devc)
+ return SR_ERR_DEV_CLOSED;
+
+ if (probe->index < 0 || probe->index >= NUM_PROBES) {
+ sr_err("Probe index %d out of range.", probe->index);
+ return SR_ERR_BUG;
+ }
+ probe_bit = (uint64_t)1 << probe->index;
+
+ if ((changes & SR_PROBE_SET_ENABLED) != 0) {
+ /* Enable or disable input channel for this probe. */
+ if (probe->enabled)
+ devc->channel_mask |= probe_bit;
+ else
+ devc->channel_mask &= ~probe_bit;
+ }
+
+ if ((changes & SR_PROBE_SET_TRIGGER) != 0) {
+ trigger_mask = devc->trigger_mask & ~probe_bit;
+ trigger_values = devc->trigger_values & ~probe_bit;
+ trigger_edge_mask = devc->trigger_edge_mask & ~probe_bit;
+
+ if (probe->trigger && probe->trigger[0] != '\0') {
+ if (probe->trigger[1] != '\0') {
+ sr_warn("Trigger configuration \"%s\" with "
+ "multiple stages is not supported.",
+ probe->trigger);
+ return SR_ERR_ARG;
+ }
+ /* Enable trigger for this probe. */
+ trigger_mask |= probe_bit;
+
+ /* Configure edge mask and trigger value. */
+ switch (probe->trigger[0]) {
+ case '1': trigger_values |= probe_bit;
+ case '0': break;
+
+ case 'r': trigger_values |= probe_bit;
+ case 'f': trigger_edge_mask |= probe_bit;
+ break;
+ default:
+ sr_warn("Trigger type '%c' is not supported.",
+ probe->trigger[0]);
+ return SR_ERR_ARG;
+ }
+ }
+ /* Store validated trigger setup. */
+ devc->trigger_mask = trigger_mask;
+ devc->trigger_values = trigger_values;
+ devc->trigger_edge_mask = trigger_edge_mask;
+ }
+
+ return SR_OK;
+}
+