X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fapi.c;h=50a1d489ed51fa22d03a9778f1426afed2ce0b34;hb=7e463623382e1f574fde150b3fc88a65eaebb578;hp=f939fb5af8f397595d5bb8d313a9125d1aa4c9cc;hpb=f06fb3e9f1fdfc3780bfa8cb06f76a2d630d6f1c;p=libsigrok.git diff --git a/src/hardware/asix-sigma/api.c b/src/hardware/asix-sigma/api.c index f939fb5a..50a1d489 100644 --- a/src/hardware/asix-sigma/api.c +++ b/src/hardware/asix-sigma/api.c @@ -50,13 +50,14 @@ static const uint32_t devopts[] = { #endif }; +#if ASIX_SIGMA_WITH_TRIGGER static const int32_t trigger_matches[] = { SR_TRIGGER_ZERO, SR_TRIGGER_ONE, SR_TRIGGER_RISING, SR_TRIGGER_FALLING, }; - +#endif static int dev_clear(const struct sr_dev_driver *di) { @@ -102,7 +103,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sr_info("Found ASIX SIGMA - Serial: %s", serial_txt); devc->cur_samplerate = samplerates[0]; - devc->period_ps = 0; devc->limit_msec = 0; devc->limit_samples = 0; devc->cur_firmware = -1; @@ -140,18 +140,13 @@ static int dev_open(struct sr_dev_inst *sdi) devc = sdi->priv; - /* Make sure it's an ASIX SIGMA. */ if ((ret = ftdi_usb_open_desc(&devc->ftdic, - USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) { - - sr_err("ftdi_usb_open failed: %s", - ftdi_get_error_string(&devc->ftdic)); - - return 0; + USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) { + sr_err("Failed to open device (%d): %s.", + ret, ftdi_get_error_string(&devc->ftdic)); + return SR_ERR; } - sdi->status = SR_ST_ACTIVE; - return SR_OK; } @@ -161,9 +156,7 @@ static int dev_close(struct sr_dev_inst *sdi) devc = sdi->priv; - /* TODO */ - if (sdi->status == SR_ST_ACTIVE) - ftdi_usb_close(&devc->ftdic); + ftdi_usb_close(&devc->ftdic); sdi->status = SR_ST_INACTIVE; @@ -212,9 +205,6 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd (void)cg; - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - devc = sdi->priv; ret = SR_OK; @@ -291,13 +281,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) { struct dev_context *devc; struct clockselect_50 clockselect; - int frac, triggerpin, ret; + int triggerpin, ret; uint8_t triggerselect; struct triggerinout triggerinout_conf; struct triggerlut lut; - - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; + uint8_t regval; + uint8_t clock_bytes[sizeof(clockselect)]; + size_t clock_idx; devc = sdi->priv; @@ -355,35 +345,43 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) sigma_set_register(WRITE_TRIGGER_SELECT1, triggerselect, devc); /* Set clock select register. */ - if (devc->cur_samplerate == SR_MHZ(200)) + clockselect.async = 0; + clockselect.fraction = 1 - 1; /* Divider 1. */ + clockselect.disabled_channels = 0x0000; /* All channels enabled. */ + if (devc->cur_samplerate == SR_MHZ(200)) { /* Enable 4 channels. */ - sigma_set_register(WRITE_CLOCK_SELECT, 0xf0, devc); - else if (devc->cur_samplerate == SR_MHZ(100)) + clockselect.disabled_channels = 0xf0ff; + } else if (devc->cur_samplerate == SR_MHZ(100)) { /* Enable 8 channels. */ - sigma_set_register(WRITE_CLOCK_SELECT, 0x00, devc); - else { + clockselect.disabled_channels = 0x00ff; + } else { /* - * 50 MHz mode (or fraction thereof). Any fraction down to - * 50 MHz / 256 can be used, but is not supported by sigrok API. + * 50 MHz mode, or fraction thereof. The 50MHz reference + * can get divided by any integer in the range 1 to 256. + * Divider minus 1 gets written to the hardware. + * (The driver lists a discrete set of sample rates, but + * all of them fit the above description.) */ - frac = SR_MHZ(50) / devc->cur_samplerate - 1; - - clockselect.async = 0; - clockselect.fraction = frac; - clockselect.disabled_channels = 0; - - sigma_write_register(WRITE_CLOCK_SELECT, - (uint8_t *) &clockselect, - sizeof(clockselect), devc); + clockselect.fraction = SR_MHZ(50) / devc->cur_samplerate - 1; } + clock_idx = 0; + clock_bytes[clock_idx++] = clockselect.async; + clock_bytes[clock_idx++] = clockselect.fraction; + clock_bytes[clock_idx++] = clockselect.disabled_channels & 0xff; + clock_bytes[clock_idx++] = clockselect.disabled_channels >> 8; + sigma_write_register(WRITE_CLOCK_SELECT, clock_bytes, clock_idx, devc); /* Setup maximum post trigger time. */ sigma_set_register(WRITE_POST_TRIGGER, (devc->capture_ratio * 255) / 100, devc); /* Start acqusition. */ - gettimeofday(&devc->start_tv, 0); - sigma_set_register(WRITE_MODE, 0x0d, devc); + devc->start_time = g_get_monotonic_time(); + regval = WMR_TRGRES | WMR_SDRAMWRITEEN; +#if ASIX_SIGMA_WITH_TRIGGER + regval |= WMR_TRGEN; +#endif + sigma_set_register(WRITE_MODE, regval, devc); std_session_send_df_header(sdi);