+ /* Setup trigger in and out pins to default values. */
+ memset(&triggerinout_conf, 0, sizeof(struct triggerinout));
+ triggerinout_conf.trgout_bytrigger = 1;
+ triggerinout_conf.trgout_enable = 1;
+
+ sigma_write_register(WRITE_TRIGGER_OPTION,
+ (uint8_t *) &triggerinout_conf,
+ sizeof(struct triggerinout), ctx);
+
+ /* Go back to normal mode. */
+ sigma_set_register(WRITE_TRIGGER_SELECT1, triggerselect, ctx);
+
+ /* Set clock select register. */
+ if (ctx->cur_samplerate == SR_MHZ(200))
+ /* Enable 4 probes. */
+ sigma_set_register(WRITE_CLOCK_SELECT, 0xf0, ctx);
+ else if (ctx->cur_samplerate == SR_MHZ(100))
+ /* Enable 8 probes. */
+ sigma_set_register(WRITE_CLOCK_SELECT, 0x00, ctx);
+ else {
+ /*
+ * 50 MHz mode (or fraction thereof). Any fraction down to
+ * 50 MHz / 256 can be used, but is not supported by sigrok API.
+ */
+ frac = SR_MHZ(50) / ctx->cur_samplerate - 1;
+
+ clockselect.async = 0;
+ clockselect.fraction = frac;
+ clockselect.disabled_probes = 0;
+
+ sigma_write_register(WRITE_CLOCK_SELECT,
+ (uint8_t *) &clockselect,
+ sizeof(clockselect), ctx);
+ }
+
+ /* Setup maximum post trigger time. */
+ sigma_set_register(WRITE_POST_TRIGGER,
+ (ctx->capture_ratio * 255) / 100, ctx);
+
+ /* Start acqusition. */
+ gettimeofday(&ctx->start_tv, 0);
+ sigma_set_register(WRITE_MODE, 0x0d, ctx);
+
+ ctx->session_dev_id = cb_data;
+
+ if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
+ sr_err("sigma: %s: packet malloc failed.", __func__);
+ return SR_ERR_MALLOC;
+ }
+
+ if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
+ sr_err("sigma: %s: header malloc failed.", __func__);
+ return SR_ERR_MALLOC;
+ }
+
+ /* Send header packet to the session bus. */
+ packet->type = SR_DF_HEADER;
+ packet->payload = header;
+ header->feed_version = 1;
+ gettimeofday(&header->starttime, NULL);
+ sr_session_send(ctx->session_dev_id, packet);
+
+ /* Send metadata about the SR_DF_LOGIC packets to come. */
+ packet->type = SR_DF_META_LOGIC;
+ packet->payload = &meta;
+ meta.samplerate = ctx->cur_samplerate;
+ meta.num_probes = ctx->num_probes;
+ sr_session_send(ctx->session_dev_id, packet);
+
+ /* Add capture source. */
+ sr_source_add(0, G_IO_IN, 10, receive_data, sdi);
+
+ g_free(header);
+ g_free(packet);
+
+ ctx->state.state = SIGMA_CAPTURE;
+
+ return SR_OK;