SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,
SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET,
- SR_CONF_EXTERNAL_CLOCK | SR_CONF_SET,
+ SR_CONF_EXTERNAL_CLOCK | SR_CONF_GET | SR_CONF_SET,
+ SR_CONF_CLOCK_EDGE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
SR_CONF_SWAP | SR_CONF_SET,
SR_CONF_RLE | SR_CONF_GET | SR_CONF_SET,
SR_TRIGGER_ONE,
};
+static const char* external_clock_edges[] = {
+ "rising", // positive edge
+ "falling" // negative edge
+};
+
#define STR_PATTERN_NONE "None"
#define STR_PATTERN_EXTERNAL "External"
#define STR_PATTERN_INTERNAL "Internal"
case SR_CONF_RLE:
*data = g_variant_new_boolean(devc->capture_flags & CAPTURE_FLAG_RLE ? TRUE : FALSE);
break;
+ case SR_CONF_EXTERNAL_CLOCK:
+ *data = g_variant_new_boolean(
+ devc->capture_flags & CAPTURE_FLAG_CLOCK_EXTERNAL ? TRUE : FALSE);
+ break;
+ case SR_CONF_CLOCK_EDGE:
+ *data = g_variant_new_string(external_clock_edges[
+ devc->capture_flags & CAPTURE_FLAG_INVERT_EXT_CLOCK ? 1 : 0]);
+ break;
default:
return SR_ERR_NA;
}
devc->capture_flags &= ~CAPTURE_FLAG_CLOCK_EXTERNAL;
}
break;
+ case SR_CONF_CLOCK_EDGE:
+ stropt = g_variant_get_string(data, NULL);
+ if (!strcmp(stropt, external_clock_edges[1])) {
+ sr_info("Triggering on falling edge of external clock.");
+ devc->capture_flags |= CAPTURE_FLAG_INVERT_EXT_CLOCK;
+ } else {
+ sr_info("Triggering on rising edge of external clock.");
+ devc->capture_flags &= ~CAPTURE_FLAG_INVERT_EXT_CLOCK;
+ }
+ break;
case SR_CONF_PATTERN_MODE:
stropt = g_variant_get_string(data, NULL);
if (!strcmp(stropt, STR_PATTERN_NONE)) {
case SR_CONF_TRIGGER_MATCH:
*data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches));
break;
+ case SR_CONF_CLOCK_EDGE:
+ *data = std_gvar_array_str(ARRAY_AND_SIZE(external_clock_edges));
+ break;
case SR_CONF_PATTERN_MODE:
*data = g_variant_new_strv(ARRAY_AND_SIZE(patterns));
break;
return SR_OK;
}
-static int set_trigger(const struct sr_dev_inst *sdi, int stage)
+static int set_basic_trigger(const struct sr_dev_inst *sdi, int stage)
{
struct dev_context *devc;
struct sr_serial_dev_inst *serial;
devc = sdi->priv;
serial = sdi->conn;
- cmd = CMD_SET_TRIGGER_MASK + stage * 4;
+ cmd = CMD_SET_BASIC_TRIGGER_MASK0 + stage * 4;
arg[0] = devc->trigger_mask[stage] & 0xff;
arg[1] = (devc->trigger_mask[stage] >> 8) & 0xff;
arg[2] = (devc->trigger_mask[stage] >> 16) & 0xff;
if (send_longcommand(serial, cmd, arg) != SR_OK)
return SR_ERR;
- cmd = CMD_SET_TRIGGER_VALUE + stage * 4;
+ cmd = CMD_SET_BASIC_TRIGGER_VALUE0 + stage * 4;
arg[0] = devc->trigger_value[stage] & 0xff;
arg[1] = (devc->trigger_value[stage] >> 8) & 0xff;
arg[2] = (devc->trigger_value[stage] >> 16) & 0xff;
if (send_longcommand(serial, cmd, arg) != SR_OK)
return SR_ERR;
- cmd = CMD_SET_TRIGGER_CONFIG + stage * 4;
+ cmd = CMD_SET_BASIC_TRIGGER_CONFIG0 + stage * 4;
arg[0] = arg[1] = arg[3] = 0x00;
arg[2] = stage;
if (stage == devc->num_stages)
devc->trigger_at_smpl = (readcount - delaycount) * 4 - devc->num_stages;
for (i = 0; i <= devc->num_stages; i++) {
sr_dbg("Setting OLS stage %d trigger.", i);
- if ((ret = set_trigger(sdi, i)) != SR_OK)
+ if ((ret = set_basic_trigger(sdi, i)) != SR_OK)
return ret;
}
} else {
/* No triggers configured, force trigger on first stage. */
sr_dbg("Forcing trigger at stage 0.");
- if ((ret = set_trigger(sdi, 0)) != SR_OK)
+ if ((ret = set_basic_trigger(sdi, 0)) != SR_OK)
return ret;
delaycount = readcount;
}
}
/* Flag register. */
- sr_dbg("Setting intpat %s, extpat %s, RLE %s, noise_filter %s, demux %s",
+ sr_dbg("Setting intpat %s, extpat %s, RLE %s, noise_filter %s, demux %s, %s clock%s",
devc->capture_flags & CAPTURE_FLAG_INTERNAL_TEST_MODE ? "on": "off",
devc->capture_flags & CAPTURE_FLAG_EXTERNAL_TEST_MODE ? "on": "off",
devc->capture_flags & CAPTURE_FLAG_RLE ? "on" : "off",
devc->capture_flags & CAPTURE_FLAG_NOISE_FILTER ? "on": "off",
- devc->capture_flags & CAPTURE_FLAG_DEMUX ? "on" : "off");
+ devc->capture_flags & CAPTURE_FLAG_DEMUX ? "on" : "off",
+ devc->capture_flags & CAPTURE_FLAG_CLOCK_EXTERNAL ? "external" : "internal",
+ devc->capture_flags & CAPTURE_FLAG_CLOCK_EXTERNAL ? (devc->capture_flags & CAPTURE_FLAG_INVERT_EXT_CLOCK
+ ? " on falling edge" : "on rising edge") : "");
+
/*
* Enable/disable OLS channel groups in the flag register according
* to the channel mask. 1 means "disable channel".
*/
+ devc->capture_flags &= ~0x3c;
devc->capture_flags |= ~(ols_changrp_mask << 2) & 0x3c;
/* RLE mode is always zero, for now. */
return SR_ERR;
/* Start acquisition on the device. */
- if (send_shortcommand(serial, CMD_RUN) != SR_OK)
+ if (send_shortcommand(serial, CMD_ARM_BASIC_TRIGGER) != SR_OK)
return SR_ERR;
/* Reset all operational states. */