X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fapi.c;h=f1b96bb79fdd16eb489792989e7dbc486323efdc;hb=b503d24cdf56abf8c0d66d438ccac28969f01670;hp=b8d68e9a0118c433184ab7a68f0c4ae3277bcb5b;hpb=3f5f5484100ba39dafa4d90b84d25cd3d871d2f2;p=libsigrok.git diff --git a/src/hardware/asix-sigma/api.c b/src/hardware/asix-sigma/api.c index b8d68e9a..f1b96bb7 100644 --- a/src/hardware/asix-sigma/api.c +++ b/src/hardware/asix-sigma/api.c @@ -35,6 +35,7 @@ static const char *channel_names[] = { static const uint32_t scanopts[] = { SR_CONF_CONN, + SR_CONF_PROBE_NAMES, }; static const uint32_t drvopts[] = { @@ -49,10 +50,9 @@ static const uint32_t devopts[] = { SR_CONF_EXTERNAL_CLOCK | SR_CONF_GET | SR_CONF_SET, SR_CONF_EXTERNAL_CLOCK_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_CLOCK_EDGE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, -#if ASIX_SIGMA_WITH_TRIGGER SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, -#endif + /* Consider SR_CONF_TRIGGER_PATTERN (SR_T_STRING, GET/SET) support. */ }; static const char *ext_clock_edges[] = { @@ -61,14 +61,12 @@ static const char *ext_clock_edges[] = { [SIGMA_CLOCK_EDGE_EITHER] = "either", }; -#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 void clear_helper(struct dev_context *devc) { @@ -112,6 +110,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) struct drv_context *drvc; libusb_context *usbctx; const char *conn; + const char *probe_names; GSList *l, *conn_devices; struct sr_config *src; GSList *devices; @@ -123,24 +122,29 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) char conn_id[20]; char serno_txt[16]; char *end; - long serno_num, serno_pre; + unsigned long serno_num, serno_pre; enum asix_device_type dev_type; const char *dev_text; struct sr_dev_inst *sdi; struct dev_context *devc; size_t devidx, chidx; + size_t count; drvc = di->context; usbctx = drvc->sr_ctx->libusb_ctx; /* Find all devices which match an (optional) conn= spec. */ conn = NULL; + probe_names = NULL; for (l = options; l; l = l->next) { src = l->data; switch (src->key) { case SR_CONF_CONN: conn = g_variant_get_string(src->data, NULL); break; + case SR_CONF_PROBE_NAMES: + probe_names = g_variant_get_string(src->data, NULL); + break; } } conn_devices = NULL; @@ -195,7 +199,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) * All ASIX logic analyzers have a serial number, which * reads as a hex number, and tells the device type. */ - ret = sr_atol_base(serno_txt, &serno_num, &end, 16); + ret = sr_atoul_base(serno_txt, &serno_num, &end, 16); if (ret != SR_OK || !end || *end) { sr_warn("Cannot interpret serial number %s.", serno_txt); continue; @@ -237,12 +241,14 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sdi->model = g_strdup(dev_text); sdi->serial_num = g_strdup(serno_txt); sdi->connection_id = g_strdup(conn_id); - for (chidx = 0; chidx < ARRAY_SIZE(channel_names); chidx++) - sr_channel_new(sdi, chidx, SR_CHANNEL_LOGIC, - TRUE, channel_names[chidx]); - devc = g_malloc0(sizeof(*devc)); sdi->priv = devc; + devc->channel_names = sr_parse_probe_names(probe_names, + channel_names, ARRAY_SIZE(channel_names), + ARRAY_SIZE(channel_names), &count); + for (chidx = 0; chidx < count; chidx++) + sr_channel_new(sdi, chidx, SR_CHANNEL_LOGIC, + TRUE, devc->channel_names[chidx]); devc->id.vid = des.idVendor; devc->id.pid = des.idProduct; devc->id.serno = serno_num; @@ -307,7 +313,7 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_boolean(devc->clock.use_ext_clock); break; case SR_CONF_EXTERNAL_CLOCK_SOURCE: - clock_text = channel_names[devc->clock.clock_pin]; + clock_text = devc->channel_names[devc->clock.clock_pin]; *data = g_variant_new_string(clock_text); break; case SR_CONF_CLOCK_EDGE: @@ -317,11 +323,9 @@ static int config_get(uint32_t key, GVariant **data, case SR_CONF_LIMIT_MSEC: case SR_CONF_LIMIT_SAMPLES: return sr_sw_limits_config_get(&devc->limit.config, key, data); -#if ASIX_SIGMA_WITH_TRIGGER case SR_CONF_CAPTURE_RATIO: *data = g_variant_new_uint64(devc->capture_ratio); break; -#endif default: return SR_ERR_NA; } @@ -335,6 +339,8 @@ static int config_set(uint32_t key, GVariant *data, struct dev_context *devc; int ret; uint64_t want_rate, have_rate; + const char **names; + size_t count; int idx; (void)cg; @@ -362,7 +368,9 @@ static int config_set(uint32_t key, GVariant *data, devc->clock.use_ext_clock = g_variant_get_boolean(data); break; case SR_CONF_EXTERNAL_CLOCK_SOURCE: - idx = std_str_idx(data, ARRAY_AND_SIZE(channel_names)); + names = (const char **)devc->channel_names; + count = g_strv_length(devc->channel_names); + idx = std_str_idx(data, names, count); if (idx < 0) return SR_ERR_ARG; devc->clock.clock_pin = idx; @@ -376,11 +384,9 @@ static int config_set(uint32_t key, GVariant *data, case SR_CONF_LIMIT_MSEC: case SR_CONF_LIMIT_SAMPLES: return sr_sw_limits_config_set(&devc->limit.config, key, data); -#if ASIX_SIGMA_WITH_TRIGGER case SR_CONF_CAPTURE_RATIO: devc->capture_ratio = g_variant_get_uint64(data); break; -#endif default: return SR_ERR_NA; } @@ -391,6 +397,11 @@ static int config_set(uint32_t key, GVariant *data, static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { + struct dev_context *devc; + const char **names; + size_t count; + + devc = sdi ? sdi->priv : NULL; switch (key) { case SR_CONF_SCAN_OPTIONS: case SR_CONF_DEVICE_OPTIONS: @@ -402,16 +413,18 @@ static int config_list(uint32_t key, GVariant **data, *data = sigma_get_samplerates_list(); break; case SR_CONF_EXTERNAL_CLOCK_SOURCE: - *data = g_variant_new_strv(ARRAY_AND_SIZE(channel_names)); + if (!devc) + return SR_ERR_ARG; + names = (const char **)devc->channel_names; + count = g_strv_length(devc->channel_names); + *data = g_variant_new_strv(names, count); break; case SR_CONF_CLOCK_EDGE: *data = g_variant_new_strv(ARRAY_AND_SIZE(ext_clock_edges)); break; -#if ASIX_SIGMA_WITH_TRIGGER case SR_CONF_TRIGGER_MATCH: *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches)); break; -#endif default: return SR_ERR_NA; } @@ -433,6 +446,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc = sdi->priv; + /* Convert caller's trigger spec to driver's internal format. */ + ret = sigma_convert_trigger(sdi); + if (ret != SR_OK) { + sr_err("Could not configure triggers."); + return ret; + } + /* * Setup the device's samplerate from the value which up to now * just got checked and stored. As a byproduct this can pick and @@ -455,12 +475,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) if (ret != SR_OK) return ret; - ret = sigma_convert_trigger(sdi); - if (ret != SR_OK) { - sr_err("Could not configure triggers."); - return ret; - } - /* Enter trigger programming mode. */ trigsel2 = TRGSEL2_RESET; ret = sigma_set_register(devc, WRITE_TRIGGER_SELECT2, trigsel2); @@ -550,7 +564,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) * Derive a mask where bits are set for unavailable channels. * Either send the single byte, or the full byte sequence. */ - pindis_mask = ~BITS_MASK(devc->num_channels); + pindis_mask = ~BITS_MASK(devc->interp.num_channels); if (devc->clock.samplerate > SR_MHZ(50)) { ret = sigma_set_register(devc, WRITE_CLOCK_SELECT, pindis_mask & 0xff); @@ -592,7 +606,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) /* Start acqusition. */ regval = WMR_TRGRES | WMR_SDRAMWRITEEN; - if (devc->use_triggers && ASIX_SIGMA_WITH_TRIGGER) + if (devc->use_triggers) regval |= WMR_TRGEN; ret = sigma_set_register(devc, WRITE_MODE, regval); if (ret != SR_OK) @@ -608,7 +622,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) if (ret != SR_OK) return ret; - devc->state.state = SIGMA_CAPTURE; + devc->state = SIGMA_CAPTURE; return SR_OK; } @@ -626,10 +640,10 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) * already. The detour is required to have sample data retrieved * for forced acquisition stops. */ - if (devc->state.state == SIGMA_CAPTURE) { - devc->state.state = SIGMA_STOPPING; + if (devc->state == SIGMA_CAPTURE) { + devc->state = SIGMA_STOPPING; } else { - devc->state.state = SIGMA_IDLE; + devc->state = SIGMA_IDLE; (void)sr_session_source_remove(sdi->session, -1); }