X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fkingst-la2016%2Fapi.c;h=742f3e3ae6a0a3155e2516e32903894db4770c84;hb=90ed86aa1737fd30bac4cbbeaae91d87b4c22682;hp=6eb802b2f43368166ff13d496d04cfecb56b15e0;hpb=1291ea43c191726e3425a42cafd1bfd78f54929f;p=libsigrok.git diff --git a/src/hardware/kingst-la2016/api.c b/src/hardware/kingst-la2016/api.c index 6eb802b2..742f3e3a 100644 --- a/src/hardware/kingst-la2016/api.c +++ b/src/hardware/kingst-la2016/api.c @@ -36,6 +36,7 @@ static const uint32_t scanopts[] = { SR_CONF_CONN, + SR_CONF_PROBE_NAMES, }; static const uint32_t drvopts[] = { @@ -44,7 +45,6 @@ static const uint32_t drvopts[] = { }; static const uint32_t devopts[] = { - /* TODO: SR_CONF_CONTINUOUS, */ SR_CONF_CONN | SR_CONF_GET, SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, @@ -54,6 +54,7 @@ static const uint32_t devopts[] = { #endif SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, + SR_CONF_CONTINUOUS | SR_CONF_GET | SR_CONF_SET, }; static const uint32_t devopts_cg_logic[] = { @@ -87,20 +88,23 @@ static const char *channel_names_pwm[] = { }; /* - * The hardware uses a 100/200/500MHz base clock (model dependent) and - * a 16bit divider (common across all models). The range from 10kHz to - * 100/200/500MHz should be applicable to all devices. High rates may - * suffer from coarse resolution (e.g. in the "500MHz div 2" case) and - * may not provide the desired 1/2/5 steps. Fortunately this exclusively - * affects the 500MHz model where 250MHz is used instead of 200MHz and - * the 166MHz and 125MHz rates are not presented to users. Deep memory - * of these models and hardware compression reduce the necessity to let - * users pick from a huge list of possible rates. + * The devices have an upper samplerate limit of 100/200/500 MHz each. + * But their hardware uses different base clocks (100/200/800MHz, this + * is _not_ a typo) and a 16bit divider. Which results in per-model ranges + * of supported rates which not only differ in the upper boundary, but + * also at the lower boundary. It's assumed that the 10kHz rate is not + * useful enough to provide by all means. Starting at 20kHz for all models + * simplfies the implementation of the config API routines, and eliminates + * redundancy in these samplerates tables. * + * Streaming mode is constrained by the channel count and samplerate + * product (the bits per second which need to travel the USB connection + * while the acquisition is executing). Because streaming mode does not + * compress the capture data, a later implementation may desire a finer + * resolution. For now let's just stick with the 1/2/5 steps. */ static const uint64_t rates_500mhz[] = { - SR_KHZ(10), SR_KHZ(20), SR_KHZ(50), SR_KHZ(100), @@ -113,12 +117,11 @@ static const uint64_t rates_500mhz[] = { SR_MHZ(20), SR_MHZ(50), SR_MHZ(100), - SR_MHZ(250), + SR_MHZ(200), SR_MHZ(500), }; static const uint64_t rates_200mhz[] = { - SR_KHZ(10), SR_KHZ(20), SR_KHZ(50), SR_KHZ(100), @@ -135,7 +138,6 @@ static const uint64_t rates_200mhz[] = { }; static const uint64_t rates_100mhz[] = { - SR_KHZ(10), SR_KHZ(20), SR_KHZ(50), SR_KHZ(100), @@ -429,6 +431,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) uint8_t bus, addr; uint16_t pid; const char *conn; + const char *probe_names; char conn_id[64]; int ret; size_t ch_off, ch_max; @@ -440,12 +443,16 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) conn = NULL; conn_devices = 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; } } if (conn) @@ -594,12 +601,14 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) ch_max = ARRAY_SIZE(channel_names_logic); if (ch_max > devc->model->channel_count) ch_max = devc->model->channel_count; + devc->channel_names_logic = sr_parse_probe_names(probe_names, + channel_names_logic, ch_max, ch_max, &ch_max); cg = sr_channel_group_new(sdi, "Logic", NULL); devc->cg_logic = cg; for (ch_idx = 0; ch_idx < ch_max; ch_idx++) { ch = sr_channel_new(sdi, ch_off, SR_CHANNEL_LOGIC, TRUE, - channel_names_logic[ch_idx]); + devc->channel_names_logic[ch_idx]); ch_off++; cg->channels = g_slist_append(cg->channels, ch); } @@ -627,6 +636,8 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) devc->sw_limits.limit_samples = 0; devc->capture_ratio = 50; devc->samplerate = devc->model->samplerate; + if (!devc->model->memory_bits) + devc->continuous = TRUE; devc->threshold_voltage_idx = LOGIC_THRESHOLD_IDX_DFLT; if (ARRAY_SIZE(devc->pwm_setting) >= 1) { devc->pwm_setting[0].enabled = FALSE; @@ -822,6 +833,9 @@ static int config_get(uint32_t key, GVariant **data, *data = std_gvar_tuple_double(voltage, voltage); break; #endif /* WITH_THRESHOLD_DEVCFG */ + case SR_CONF_CONTINUOUS: + *data = g_variant_new_boolean(devc->continuous); + break; default: return SR_ERR_NA; } @@ -838,6 +852,7 @@ static int config_set(uint32_t key, GVariant *data, struct pwm_setting *pwm; double value_f; int idx; + gboolean on; devc = sdi->priv; @@ -917,6 +932,12 @@ static int config_set(uint32_t key, GVariant *data, devc->threshold_voltage_idx = idx; break; #endif /* WITH_THRESHOLD_DEVCFG */ + case SR_CONF_CONTINUOUS: + on = g_variant_get_boolean(data); + if (!devc->model->memory_bits && !on) + return SR_ERR_ARG; + devc->continuous = on; + break; default: return SR_ERR_NA; }