+ uint16_t readcount, delaycount;
+ uint8_t changrp_mask;
+ int num_channels;
+ int i;
+
+ devc = sdi->priv;
+
+ if (sdi->status != SR_ST_ACTIVE)
+ return SR_ERR;
+
+ if (configure_probes(sdi) != SR_OK) {
+ sr_err("ols: failed to configured probes");
+ return SR_ERR;
+ }
+
+ /*
+ * Enable/disable channel groups in the flag register according to the
+ * probe mask. Calculate this here, because num_channels is needed
+ * to limit readcount.
+ */
+ changrp_mask = 0;
+ num_channels = 0;
+ for (i = 0; i < 4; i++) {
+ if (devc->probe_mask & (0xff << (i * 8))) {
+ changrp_mask |= (1 << i);
+ num_channels++;
+ }
+ }
+
+ /*
+ * Limit readcount to prevent reading past the end of the hardware
+ * buffer.
+ */
+ readcount = MIN(devc->max_samples / num_channels, devc->limit_samples) / 4;
+
+ memset(trigger_config, 0, 16);
+ trigger_config[devc->num_stages - 1] |= 0x08;
+ if (devc->trigger_mask[0]) {
+ delaycount = readcount * (1 - devc->capture_ratio / 100.0);
+ devc->trigger_at = (readcount - delaycount) * 4 - devc->num_stages;
+
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_MASK_0,
+ reverse32(devc->trigger_mask[0])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_VALUE_0,
+ reverse32(devc->trigger_value[0])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_CONFIG_0,
+ trigger_config[0]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_MASK_1,
+ reverse32(devc->trigger_mask[1])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_VALUE_1,
+ reverse32(devc->trigger_value[1])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_CONFIG_1,
+ trigger_config[1]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_MASK_2,
+ reverse32(devc->trigger_mask[2])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_VALUE_2,
+ reverse32(devc->trigger_value[2])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_CONFIG_2,
+ trigger_config[2]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_MASK_3,
+ reverse32(devc->trigger_mask[3])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_VALUE_3,
+ reverse32(devc->trigger_value[3])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_CONFIG_3,
+ trigger_config[3]) != SR_OK)
+ return SR_ERR;
+ } else {
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_MASK_0,
+ devc->trigger_mask[0]) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_VALUE_0,
+ devc->trigger_value[0]) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(devc->serial->fd, CMD_SET_TRIGGER_CONFIG_0,
+ 0x00000008) != SR_OK)
+ return SR_ERR;
+ delaycount = readcount;
+ }