X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fkingst-la2016%2Fapi.c;h=5f536933fe6d8b49d9120a7c19454f8fb724595d;hb=8817bd6f5d9a92fcc582e3b51ea4cda3abc13b2a;hp=ab44d3b380a26b7974d15aca2529a8f066a8c4d2;hpb=cafcfe6374241f4e057802f6e496b469d0de67da;p=libsigrok.git diff --git a/src/hardware/kingst-la2016/api.c b/src/hardware/kingst-la2016/api.c index ab44d3b3..5f536933 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[] = { @@ -430,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; @@ -441,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) @@ -595,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); } @@ -1027,7 +1035,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) struct drv_context *drvc; struct sr_context *ctx; struct dev_context *devc; - size_t unitsize; + size_t unitsize, xfersize, repsize, seqsize; double voltage; int ret; @@ -1037,21 +1045,35 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc = sdi->priv; if (!devc->feed_queue) { - if (devc->model->channel_count == 32) + /* + * TODO + * Move this into protocol.c which concentrates the + * wire format. The api.c source should not bother. + */ + if (devc->model->channel_count == 32) { unitsize = sizeof(uint32_t); - else if (devc->model->channel_count == 16) + repsize = sizeof(uint8_t); + seqsize = 2 * sizeof(uint8_t); + xfersize = 32; + } else if (devc->model->channel_count == 16) { unitsize = sizeof(uint16_t); - else + repsize = sizeof(uint8_t); + seqsize = 1 * sizeof(uint8_t); + xfersize = 16; + } else { return SR_ERR_ARG; + } devc->feed_queue = feed_queue_logic_alloc(sdi, LA2016_CONVBUFFER_SIZE, unitsize); if (!devc->feed_queue) { sr_err("Cannot allocate buffer for session feed."); return SR_ERR_MALLOC; } - devc->packets_per_chunk = TRANSFER_PACKET_LENGTH; - devc->packets_per_chunk--; - devc->packets_per_chunk /= unitsize + sizeof(uint8_t); + devc->transfer_size = xfersize; + devc->sequence_size = seqsize; + devc->packets_per_chunk = xfersize; + devc->packets_per_chunk -= seqsize; + devc->packets_per_chunk /= unitsize + repsize; } sr_sw_limits_acquisition_start(&devc->sw_limits);