]> sigrok.org Git - libsigrok.git/blob - src/hardware/openbench-logic-sniffer/protocol.c
Use driver name as the log prefix in standard functions
[libsigrok.git] / src / hardware / openbench-logic-sniffer / protocol.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include "protocol.h"
22
23 SR_PRIV int send_shortcommand(struct sr_serial_dev_inst *serial,
24                 uint8_t command)
25 {
26         char buf[1];
27
28         sr_dbg("Sending cmd 0x%.2x.", command);
29         buf[0] = command;
30         if (serial_write_blocking(serial, buf, 1, serial_timeout(serial, 1)) != 1)
31                 return SR_ERR;
32
33         if (serial_drain(serial) != 0)
34                 return SR_ERR;
35
36         return SR_OK;
37 }
38
39 SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial,
40                 uint8_t command, uint8_t *data)
41 {
42         char buf[5];
43
44         sr_dbg("Sending cmd 0x%.2x data 0x%.2x%.2x%.2x%.2x.", command,
45                         data[0], data[1], data[2], data[3]);
46         buf[0] = command;
47         buf[1] = data[0];
48         buf[2] = data[1];
49         buf[3] = data[2];
50         buf[4] = data[3];
51         if (serial_write_blocking(serial, buf, 5, serial_timeout(serial, 1)) != 5)
52                 return SR_ERR;
53
54         if (serial_drain(serial) != 0)
55                 return SR_ERR;
56
57         return SR_OK;
58 }
59
60 /* Configures the channel mask based on which channels are enabled. */
61 SR_PRIV void ols_channel_mask(const struct sr_dev_inst *sdi)
62 {
63         struct dev_context *devc;
64         struct sr_channel *channel;
65         const GSList *l;
66
67         devc = sdi->priv;
68
69         devc->channel_mask = 0;
70         for (l = sdi->channels; l; l = l->next) {
71                 channel = l->data;
72                 if (channel->enabled)
73                         devc->channel_mask |= 1 << channel->index;
74         }
75 }
76
77 SR_PRIV int ols_convert_trigger(const struct sr_dev_inst *sdi)
78 {
79         struct dev_context *devc;
80         struct sr_trigger *trigger;
81         struct sr_trigger_stage *stage;
82         struct sr_trigger_match *match;
83         const GSList *l, *m;
84         int i;
85
86         devc = sdi->priv;
87
88         devc->num_stages = 0;
89         for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
90                 devc->trigger_mask[i] = 0;
91                 devc->trigger_value[i] = 0;
92         }
93
94         if (!(trigger = sr_session_trigger_get(sdi->session)))
95                 return SR_OK;
96
97         devc->num_stages = g_slist_length(trigger->stages);
98         if (devc->num_stages > NUM_TRIGGER_STAGES) {
99                 sr_err("This device only supports %d trigger stages.",
100                                 NUM_TRIGGER_STAGES);
101                 return SR_ERR;
102         }
103
104         for (l = trigger->stages; l; l = l->next) {
105                 stage = l->data;
106                 for (m = stage->matches; m; m = m->next) {
107                         match = m->data;
108                         if (!match->channel->enabled)
109                                 /* Ignore disabled channels with a trigger. */
110                                 continue;
111                         devc->trigger_mask[stage->stage] |= 1 << match->channel->index;
112                         if (match->match == SR_TRIGGER_ONE)
113                                 devc->trigger_value[stage->stage] |= 1 << match->channel->index;
114                 }
115         }
116
117         return SR_OK;
118 }
119
120 SR_PRIV struct dev_context *ols_dev_new(void)
121 {
122         struct dev_context *devc;
123
124         devc = g_malloc0(sizeof(struct dev_context));
125
126         /* Device-specific settings */
127         devc->max_samples = devc->max_samplerate = devc->protocol_version = 0;
128
129         /* Acquisition settings */
130         devc->limit_samples = devc->capture_ratio = 0;
131         devc->trigger_at = -1;
132         devc->channel_mask = 0xffffffff;
133         devc->flag_reg = 0;
134
135         return devc;
136 }
137
138 SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
139 {
140         struct sr_dev_inst *sdi;
141         struct dev_context *devc;
142         uint32_t tmp_int, ui;
143         uint8_t key, type, token;
144         int delay_ms;
145         GString *tmp_str, *devname, *version;
146         guchar tmp_c;
147
148         sdi = g_malloc0(sizeof(struct sr_dev_inst));
149         sdi->status = SR_ST_INACTIVE;
150         devc = ols_dev_new();
151         sdi->priv = devc;
152
153         devname = g_string_new("");
154         version = g_string_new("");
155
156         key = 0xff;
157         while (key) {
158                 delay_ms = serial_timeout(serial, 1);
159                 if (serial_read_blocking(serial, &key, 1, delay_ms) != 1)
160                         break;
161                 if (key == 0x00) {
162                         sr_dbg("Got metadata key 0x00, metadata ends.");
163                         break;
164                 }
165                 type = key >> 5;
166                 token = key & 0x1f;
167                 switch (type) {
168                 case 0:
169                         /* NULL-terminated string */
170                         tmp_str = g_string_new("");
171                         delay_ms = serial_timeout(serial, 1);
172                         while (serial_read_blocking(serial, &tmp_c, 1, delay_ms) == 1 && tmp_c != '\0')
173                                 g_string_append_c(tmp_str, tmp_c);
174                         sr_dbg("Got metadata key 0x%.2x value '%s'.",
175                                key, tmp_str->str);
176                         switch (token) {
177                         case 0x01:
178                                 /* Device name */
179                                 devname = g_string_append(devname, tmp_str->str);
180                                 break;
181                         case 0x02:
182                                 /* FPGA firmware version */
183                                 if (version->len)
184                                         g_string_append(version, ", ");
185                                 g_string_append(version, "FPGA version ");
186                                 g_string_append(version, tmp_str->str);
187                                 break;
188                         case 0x03:
189                                 /* Ancillary version */
190                                 if (version->len)
191                                         g_string_append(version, ", ");
192                                 g_string_append(version, "Ancillary version ");
193                                 g_string_append(version, tmp_str->str);
194                                 break;
195                         default:
196                                 sr_info("ols: unknown token 0x%.2x: '%s'",
197                                         token, tmp_str->str);
198                                 break;
199                         }
200                         g_string_free(tmp_str, TRUE);
201                         break;
202                 case 1:
203                         /* 32-bit unsigned integer */
204                         delay_ms = serial_timeout(serial, 4);
205                         if (serial_read_blocking(serial, &tmp_int, 4, delay_ms) != 4)
206                                 break;
207                         tmp_int = RB32(&tmp_int);
208                         sr_dbg("Got metadata key 0x%.2x value 0x%.8x.",
209                                key, tmp_int);
210                         switch (token) {
211                         case 0x00:
212                                 /* Number of usable channels */
213                                 for (ui = 0; ui < tmp_int; ui++)
214                                         sr_channel_new(sdi, ui, SR_CHANNEL_LOGIC, TRUE,
215                                                         ols_channel_names[ui]);
216                                 break;
217                         case 0x01:
218                                 /* Amount of sample memory available (bytes) */
219                                 devc->max_samples = tmp_int;
220                                 break;
221                         case 0x02:
222                                 /* Amount of dynamic memory available (bytes) */
223                                 /* what is this for? */
224                                 break;
225                         case 0x03:
226                                 /* Maximum sample rate (Hz) */
227                                 devc->max_samplerate = tmp_int;
228                                 break;
229                         case 0x04:
230                                 /* protocol version */
231                                 devc->protocol_version = tmp_int;
232                                 break;
233                         default:
234                                 sr_info("Unknown token 0x%.2x: 0x%.8x.",
235                                         token, tmp_int);
236                                 break;
237                         }
238                         break;
239                 case 2:
240                         /* 8-bit unsigned integer */
241                         delay_ms = serial_timeout(serial, 1);
242                         if (serial_read_blocking(serial, &tmp_c, 1, delay_ms) != 1)
243                                 break;
244                         sr_dbg("Got metadata key 0x%.2x value 0x%.2x.",
245                                key, tmp_c);
246                         switch (token) {
247                         case 0x00:
248                                 /* Number of usable channels */
249                                 for (ui = 0; ui < tmp_c; ui++)
250                                         sr_channel_new(sdi, ui, SR_CHANNEL_LOGIC, TRUE,
251                                                         ols_channel_names[ui]);
252                                 break;
253                         case 0x01:
254                                 /* protocol version */
255                                 devc->protocol_version = tmp_c;
256                                 break;
257                         default:
258                                 sr_info("Unknown token 0x%.2x: 0x%.2x.",
259                                         token, tmp_c);
260                                 break;
261                         }
262                         break;
263                 default:
264                         /* unknown type */
265                         break;
266                 }
267         }
268
269         sdi->model = devname->str;
270         sdi->version = version->str;
271         g_string_free(devname, FALSE);
272         g_string_free(version, FALSE);
273
274         return sdi;
275 }
276
277 SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
278                 const uint64_t samplerate)
279 {
280         struct dev_context *devc;
281
282         devc = sdi->priv;
283         if (devc->max_samplerate && samplerate > devc->max_samplerate)
284                 return SR_ERR_SAMPLERATE;
285
286         if (samplerate > CLOCK_RATE) {
287                 sr_info("Enabling demux mode.");
288                 devc->flag_reg |= FLAG_DEMUX;
289                 devc->flag_reg &= ~FLAG_FILTER;
290                 devc->max_channels = NUM_CHANNELS / 2;
291                 devc->cur_samplerate_divider = (CLOCK_RATE * 2 / samplerate) - 1;
292         } else {
293                 sr_info("Disabling demux mode.");
294                 devc->flag_reg &= ~FLAG_DEMUX;
295                 devc->flag_reg |= FLAG_FILTER;
296                 devc->max_channels = NUM_CHANNELS;
297                 devc->cur_samplerate_divider = (CLOCK_RATE / samplerate) - 1;
298         }
299
300         /* Calculate actual samplerate used and complain if it is different
301          * from the requested.
302          */
303         devc->cur_samplerate = CLOCK_RATE / (devc->cur_samplerate_divider + 1);
304         if (devc->flag_reg & FLAG_DEMUX)
305                 devc->cur_samplerate *= 2;
306         if (devc->cur_samplerate != samplerate)
307                 sr_info("Can't match samplerate %" PRIu64 ", using %"
308                        PRIu64 ".", samplerate, devc->cur_samplerate);
309
310         return SR_OK;
311 }
312
313 SR_PRIV void abort_acquisition(const struct sr_dev_inst *sdi)
314 {
315         struct sr_serial_dev_inst *serial;
316
317         serial = sdi->conn;
318         serial_source_remove(sdi->session, serial);
319
320         std_session_send_df_end(sdi);
321 }
322
323 SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
324 {
325         struct dev_context *devc;
326         struct sr_dev_inst *sdi;
327         struct sr_serial_dev_inst *serial;
328         struct sr_datafeed_packet packet;
329         struct sr_datafeed_logic logic;
330         uint32_t sample;
331         int num_ols_changrp, offset, j;
332         unsigned int i;
333         unsigned char byte;
334
335         (void)fd;
336
337         sdi = cb_data;
338         serial = sdi->conn;
339         devc = sdi->priv;
340
341         if (devc->num_transfers == 0 && revents == 0) {
342                 /* Ignore timeouts as long as we haven't received anything */
343                 return TRUE;
344         }
345
346         if (devc->num_transfers++ == 0) {
347                 devc->raw_sample_buf = g_try_malloc(devc->limit_samples * 4);
348                 if (!devc->raw_sample_buf) {
349                         sr_err("Sample buffer malloc failed.");
350                         return FALSE;
351                 }
352                 /* fill with 1010... for debugging */
353                 memset(devc->raw_sample_buf, 0x82, devc->limit_samples * 4);
354         }
355
356         num_ols_changrp = 0;
357         for (i = NUM_CHANNELS; i > 0x02; i /= 2) {
358                 if ((devc->flag_reg & i) == 0) {
359                         num_ols_changrp++;
360                 }
361         }
362
363         if (revents == G_IO_IN && devc->num_samples < devc->limit_samples) {
364                 if (serial_read_nonblocking(serial, &byte, 1) != 1)
365                         return FALSE;
366                 devc->cnt_bytes++;
367
368                 /* Ignore it if we've read enough. */
369                 if (devc->num_samples >= devc->limit_samples)
370                         return TRUE;
371
372                 devc->sample[devc->num_bytes++] = byte;
373                 sr_spew("Received byte 0x%.2x.", byte);
374                 if (devc->num_bytes == num_ols_changrp) {
375                         devc->cnt_samples++;
376                         devc->cnt_samples_rle++;
377                         /*
378                          * Got a full sample. Convert from the OLS's little-endian
379                          * sample to the local format.
380                          */
381                         sample = devc->sample[0] | (devc->sample[1] << 8) \
382                                         | (devc->sample[2] << 16) | (devc->sample[3] << 24);
383                         sr_dbg("Received sample 0x%.*x.", devc->num_bytes * 2, sample);
384                         if (devc->flag_reg & FLAG_RLE) {
385                                 /*
386                                  * In RLE mode the high bit of the sample is the
387                                  * "count" flag, meaning this sample is the number
388                                  * of times the previous sample occurred.
389                                  */
390                                 if (devc->sample[devc->num_bytes - 1] & 0x80) {
391                                         /* Clear the high bit. */
392                                         sample &= ~(0x80 << (devc->num_bytes - 1) * 8);
393                                         devc->rle_count = sample;
394                                         devc->cnt_samples_rle += devc->rle_count;
395                                         sr_dbg("RLE count: %u.", devc->rle_count);
396                                         devc->num_bytes = 0;
397                                         return TRUE;
398                                 }
399                         }
400                         devc->num_samples += devc->rle_count + 1;
401                         if (devc->num_samples > devc->limit_samples) {
402                                 /* Save us from overrunning the buffer. */
403                                 devc->rle_count -= devc->num_samples - devc->limit_samples;
404                                 devc->num_samples = devc->limit_samples;
405                         }
406
407                         if (num_ols_changrp < 4) {
408                                 /*
409                                  * Some channel groups may have been turned
410                                  * off, to speed up transfer between the
411                                  * hardware and the PC. Expand that here before
412                                  * submitting it over the session bus --
413                                  * whatever is listening on the bus will be
414                                  * expecting a full 32-bit sample, based on
415                                  * the number of channels.
416                                  */
417                                 j = 0;
418                                 memset(devc->tmp_sample, 0, 4);
419                                 for (i = 0; i < 4; i++) {
420                                         if (((devc->flag_reg >> 2) & (1 << i)) == 0) {
421                                                 /*
422                                                  * This channel group was
423                                                  * enabled, copy from received
424                                                  * sample.
425                                                  */
426                                                 devc->tmp_sample[i] = devc->sample[j++];
427                                         } else if (devc->flag_reg & FLAG_DEMUX && (i > 2)) {
428                                                 /* group 2 & 3 get added to 0 & 1 */
429                                                 devc->tmp_sample[i - 2] = devc->sample[j++];
430                                         }
431                                 }
432                                 memcpy(devc->sample, devc->tmp_sample, 4);
433                                 sr_spew("Expanded sample: 0x%.8x.", sample);
434                         }
435
436                         /*
437                          * the OLS sends its sample buffer backwards.
438                          * store it in reverse order here, so we can dump
439                          * this on the session bus later.
440                          */
441                         offset = (devc->limit_samples - devc->num_samples) * 4;
442                         for (i = 0; i <= devc->rle_count; i++) {
443                                 memcpy(devc->raw_sample_buf + offset + (i * 4),
444                                        devc->sample, 4);
445                         }
446                         memset(devc->sample, 0, 4);
447                         devc->num_bytes = 0;
448                         devc->rle_count = 0;
449                 }
450         } else {
451                 /*
452                  * This is the main loop telling us a timeout was reached, or
453                  * we've acquired all the samples we asked for -- we're done.
454                  * Send the (properly-ordered) buffer to the frontend.
455                  */
456                 sr_dbg("Received %d bytes, %d samples, %d decompressed samples.",
457                                 devc->cnt_bytes, devc->cnt_samples,
458                                 devc->cnt_samples_rle);
459                 if (devc->trigger_at != -1) {
460                         /*
461                          * A trigger was set up, so we need to tell the frontend
462                          * about it.
463                          */
464                         if (devc->trigger_at > 0) {
465                                 /* There are pre-trigger samples, send those first. */
466                                 packet.type = SR_DF_LOGIC;
467                                 packet.payload = &logic;
468                                 logic.length = devc->trigger_at * 4;
469                                 logic.unitsize = 4;
470                                 logic.data = devc->raw_sample_buf +
471                                         (devc->limit_samples - devc->num_samples) * 4;
472                                 sr_session_send(sdi, &packet);
473                         }
474
475                         /* Send the trigger. */
476                         packet.type = SR_DF_TRIGGER;
477                         sr_session_send(sdi, &packet);
478
479                         /* Send post-trigger samples. */
480                         packet.type = SR_DF_LOGIC;
481                         packet.payload = &logic;
482                         logic.length = (devc->num_samples * 4) - (devc->trigger_at * 4);
483                         logic.unitsize = 4;
484                         logic.data = devc->raw_sample_buf + devc->trigger_at * 4 +
485                                 (devc->limit_samples - devc->num_samples) * 4;
486                         sr_session_send(sdi, &packet);
487                 } else {
488                         /* no trigger was used */
489                         packet.type = SR_DF_LOGIC;
490                         packet.payload = &logic;
491                         logic.length = devc->num_samples * 4;
492                         logic.unitsize = 4;
493                         logic.data = devc->raw_sample_buf +
494                                 (devc->limit_samples - devc->num_samples) * 4;
495                         sr_session_send(sdi, &packet);
496                 }
497                 g_free(devc->raw_sample_buf);
498
499                 serial_flush(serial);
500                 abort_acquisition(sdi);
501         }
502
503         return TRUE;
504 }