]> sigrok.org Git - libsigrok.git/blob - hardware/chronovu-la8/chronovu-la8.c
sr: don't free driver-specific per-device struct in drivers
[libsigrok.git] / hardware / chronovu-la8 / chronovu-la8.c
1 /*
2  * This file is part of the sigrok project.
3  *
4  * Copyright (C) 2011 Uwe Hermann <uwe@hermann-uwe.de>
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 2 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, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include <ftdi.h>
22 #include <glib.h>
23 #include <string.h>
24 #include <stdlib.h>
25 #include "sigrok.h"
26 #include "sigrok-internal.h"
27
28 #define USB_VENDOR_ID                   0x0403
29 #define USB_PRODUCT_ID                  0x6001
30 #define USB_DESCRIPTION                 "ChronoVu LA8"
31 #define USB_VENDOR_NAME                 "ChronoVu"
32 #define USB_MODEL_NAME                  "LA8"
33 #define USB_MODEL_VERSION               ""
34
35 #define NUM_PROBES                      8
36 #define TRIGGER_TYPES                   "01"
37 #define SDRAM_SIZE                      (8 * 1024 * 1024)
38 #define MIN_NUM_SAMPLES                 1
39
40 #define BS                              4096 /* Block size */
41 #define NUM_BLOCKS                      2048 /* Number of blocks */
42
43 static GSList *device_instances = NULL;
44
45 static const char *probe_names[NUM_PROBES + 1] = {
46         "0",
47         "1",
48         "2",
49         "3",
50         "4",
51         "5",
52         "6",
53         "7",
54         NULL,
55 };
56
57 struct la8 {
58         /** FTDI device context (used by libftdi). */
59         struct ftdi_context *ftdic;
60
61         /** The currently configured samplerate of the device. */
62         uint64_t cur_samplerate;
63
64         /** The current sampling limit (in ms). */
65         uint64_t limit_msec;
66
67         /** The current sampling limit (in number of samples). */
68         uint64_t limit_samples;
69
70         /** TODO */
71         gpointer session_id;
72
73         /**
74          * A buffer containing some (mangled) samples from the device.
75          * Format: Pretty mangled-up (due to hardware reasons), see code.
76          */
77         uint8_t mangled_buf[BS];
78
79         /**
80          * An 8MB buffer where we'll store the de-mangled samples.
81          * Format: Each sample is 1 byte, MSB is channel 7, LSB is channel 0.
82          */
83         uint8_t *final_buf;
84
85         /**
86          * Trigger pattern (MSB = channel 7, LSB = channel 0).
87          * A 1 bit matches a high signal, 0 matches a low signal on a probe.
88          * Only low/high triggers (but not e.g. rising/falling) are supported.
89          */
90         uint8_t trigger_pattern;
91
92         /**
93          * Trigger mask (MSB = channel 7, LSB = channel 0).
94          * A 1 bit means "must match trigger_pattern", 0 means "don't care".
95          */
96         uint8_t trigger_mask;
97
98         /** Time (in seconds) before the trigger times out. */
99         uint64_t trigger_timeout;
100
101         /** Tells us whether an SR_DF_TRIGGER packet was already sent. */
102         int trigger_found;
103
104         /** TODO */
105         time_t done;
106
107         /** Counter/index for the data block to be read. */
108         int block_counter;
109
110         /** The divcount value (determines the sample period) for the LA8. */
111         uint8_t divcount;
112 };
113
114 /* This will be initialized via hw_get_device_info()/SR_DI_SAMPLERATES. */
115 static uint64_t supported_samplerates[255 + 1] = { 0 };
116
117 /*
118  * Min: 1 sample per 0.01us -> sample time is 0.084s, samplerate 100MHz
119  * Max: 1 sample per 2.55us -> sample time is 21.391s, samplerate 392.15kHz
120  */
121 static struct sr_samplerates samplerates = {
122         .low  = 0,
123         .high = 0,
124         .step = 0,
125         .list = supported_samplerates,
126 };
127
128 /* Note: Continuous sampling is not supported by the hardware. */
129 static int capabilities[] = {
130         SR_HWCAP_LOGIC_ANALYZER,
131         SR_HWCAP_SAMPLERATE,
132         SR_HWCAP_LIMIT_MSEC, /* TODO: Not yet implemented. */
133         SR_HWCAP_LIMIT_SAMPLES, /* TODO: Not yet implemented. */
134         0,
135 };
136
137 /* Function prototypes. */
138 static int la8_close_usb_reset_sequencer(struct la8 *la8);
139 static int hw_stop_acquisition(int device_index, gpointer session_data);
140 static int la8_reset(struct la8 *la8);
141
142 static void fill_supported_samplerates_if_needed(void)
143 {
144         int i;
145
146         /* Do nothing if supported_samplerates[] is already filled. */
147         if (supported_samplerates[0] != 0)
148                 return;
149
150         /* Fill supported_samplerates[] with the proper values. */
151         for (i = 0; i < 255; i++)
152                 supported_samplerates[254 - i] = SR_MHZ(100) / (i + 1);
153         supported_samplerates[255] = 0;
154 }
155
156 /**
157  * Check if the given samplerate is supported by the LA8 hardware.
158  *
159  * @param samplerate The samplerate (in Hz) to check.
160  * @return 1 if the samplerate is supported/valid, 0 otherwise.
161  */
162 static int is_valid_samplerate(uint64_t samplerate)
163 {
164         int i;
165
166         fill_supported_samplerates_if_needed();
167
168         for (i = 0; i < 255; i++) {
169                 if (supported_samplerates[i] == samplerate)
170                         return 1;
171         }
172
173         sr_err("la8: %s: invalid samplerate (%" PRIu64 "Hz)",
174                __func__, samplerate);
175
176         return 0;
177 }
178
179 /**
180  * Convert a samplerate (in Hz) to the 'divcount' value the LA8 wants.
181  *
182  * LA8 hardware: sample period = (divcount + 1) * 10ns.
183  * Min. value for divcount: 0x00 (10ns sample period, 100MHz samplerate).
184  * Max. value for divcount: 0xfe (2550ns sample period, 392.15kHz samplerate).
185  *
186  * @param samplerate The samplerate in Hz.
187  * @return The divcount value as needed by the hardware, or 0xff upon errors.
188  */
189 static uint8_t samplerate_to_divcount(uint64_t samplerate)
190 {
191         if (samplerate == 0) {
192                 sr_err("la8: %s: samplerate was 0", __func__);
193                 return 0xff;
194         }
195
196         if (!is_valid_samplerate(samplerate)) {
197                 sr_err("la8: %s: can't get divcount, samplerate invalid",
198                        __func__);
199                 return 0xff;
200         }
201
202         return (SR_MHZ(100) / samplerate) - 1;
203 }
204
205 /**
206  * Write data of a certain length to the LA8's FTDI device.
207  *
208  * @param la8 The LA8 struct containing private per-device-instance data.
209  * @param buf The buffer containing the data to write.
210  * @param size The number of bytes to write.
211  * @return The number of bytes written, or a negative value upon errors.
212  */
213 static int la8_write(struct la8 *la8, uint8_t *buf, int size)
214 {
215         int bytes_written;
216
217         if (!la8) {
218                 sr_err("la8: %s: la8 was NULL", __func__);
219                 return SR_ERR_ARG;
220         }
221
222         if (!la8->ftdic) {
223                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
224                 return SR_ERR_ARG;
225         }
226
227         if (!buf) {
228                 sr_err("la8: %s: buf was NULL", __func__);
229                 return SR_ERR_ARG;
230         }
231
232         if (size < 0) {
233                 sr_err("la8: %s: size was < 0", __func__);
234                 return SR_ERR_ARG;
235         }
236
237         bytes_written = ftdi_write_data(la8->ftdic, buf, size);
238
239         if (bytes_written < 0) {
240                 sr_err("la8: %s: ftdi_write_data: (%d) %s", __func__,
241                        bytes_written, ftdi_get_error_string(la8->ftdic));
242                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
243         } else if (bytes_written != size) {
244                 sr_err("la8: %s: bytes to write: %d, bytes written: %d",
245                        __func__, size, bytes_written);
246                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
247         }
248
249         return bytes_written;
250 }
251
252 /**
253  * Read a certain amount of bytes from the LA8's FTDI device.
254  *
255  * @param la8 The LA8 struct containing private per-device-instance data.
256  * @param buf The buffer where the received data will be stored.
257  * @param size The number of bytes to read.
258  * @return The number of bytes read, or a negative value upon errors.
259  */
260 static int la8_read(struct la8 *la8, uint8_t *buf, int size)
261 {
262         int bytes_read;
263
264         if (!la8) {
265                 sr_err("la8: %s: la8 was NULL", __func__);
266                 return SR_ERR_ARG;
267         }
268
269         if (!la8->ftdic) {
270                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
271                 return SR_ERR_ARG;
272         }
273
274         if (!buf) {
275                 sr_err("la8: %s: buf was NULL", __func__);
276                 return SR_ERR_ARG;
277         }
278
279         if (size <= 0) {
280                 sr_err("la8: %s: size was <= 0", __func__);
281                 return SR_ERR_ARG;
282         }
283
284         bytes_read = ftdi_read_data(la8->ftdic, buf, size);
285
286         if (bytes_read < 0) {
287                 sr_err("la8: %s: ftdi_read_data: (%d) %s", __func__,
288                        bytes_read, ftdi_get_error_string(la8->ftdic));
289         } else if (bytes_read != size) {
290                 // sr_err("la8: %s: bytes to read: %d, bytes read: %d",
291                 //        __func__, size, bytes_read);
292         }
293
294         return bytes_read;
295 }
296
297 static int la8_close(struct la8 *la8)
298 {
299         int ret;
300
301         if (!la8) {
302                 sr_err("la8: %s: la8 was NULL", __func__);
303                 return SR_ERR_ARG;
304         }
305
306         if (!la8->ftdic) {
307                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
308                 return SR_ERR_ARG;
309         }
310
311         if ((ret = ftdi_usb_close(la8->ftdic)) < 0) {
312                 sr_err("la8: %s: ftdi_usb_close: (%d) %s",
313                        __func__, ret, ftdi_get_error_string(la8->ftdic));
314         }
315
316         return ret;
317 }
318
319 /**
320  * Close the ChronoVu LA8 USB port and reset the LA8 sequencer logic.
321  *
322  * @param la8 The LA8 struct containing private per-device-instance data.
323  * @return SR_OK upon success, SR_ERR upon failure.
324  */
325 static int la8_close_usb_reset_sequencer(struct la8 *la8)
326 {
327         /* Magic sequence of bytes for resetting the LA8 sequencer logic. */
328         uint8_t buf[8] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
329         int ret;
330
331         sr_spew("la8: entering %s", __func__);
332
333         if (!la8) {
334                 sr_err("la8: %s: la8 was NULL", __func__);
335                 return SR_ERR_ARG;
336         }
337
338         if (!la8->ftdic) {
339                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
340                 return SR_ERR_ARG;
341         }
342
343         if (la8->ftdic->usb_dev) {
344                 /* Reset the LA8 sequencer logic, then wait 100ms. */
345                 sr_dbg("la8: resetting sequencer logic");
346                 (void) la8_write(la8, buf, 8); /* Ignore errors. */
347                 g_usleep(100 * 1000);
348
349                 /* Purge FTDI buffers, then reset and close the FTDI device. */
350                 sr_dbg("la8: purging buffers, resetting+closing FTDI device");
351
352                 /* Log errors, but ignore them (i.e., don't abort). */
353                 if ((ret = ftdi_usb_purge_buffers(la8->ftdic)) < 0)
354                         sr_err("la8: %s: ftdi_usb_purge_buffers: (%d) %s",
355                             __func__, ret, ftdi_get_error_string(la8->ftdic));
356                 if ((ret = ftdi_usb_reset(la8->ftdic)) < 0)
357                         sr_err("la8: %s: ftdi_usb_reset: (%d) %s", __func__,
358                                ret, ftdi_get_error_string(la8->ftdic));
359                 if ((ret = ftdi_usb_close(la8->ftdic)) < 0)
360                         sr_err("la8: %s: ftdi_usb_close: (%d) %s", __func__,
361                                ret, ftdi_get_error_string(la8->ftdic));
362         } else {
363                 sr_spew("la8: %s: usb_dev was NULL, nothing to do", __func__);
364         }
365
366         ftdi_free(la8->ftdic); /* Returns void. */
367         la8->ftdic = NULL;
368
369         return SR_OK;
370 }
371
372 /**
373  * Reset the ChronoVu LA8.
374  *
375  * The LA8 must be reset after a failed read/write operation or upon timeouts.
376  *
377  * @param la8 The LA8 struct containing private per-device-instance data.
378  * @return SR_OK upon success, SR_ERR upon failure.
379  */
380 static int la8_reset(struct la8 *la8)
381 {
382         uint8_t buf[BS];
383         time_t done, now;
384         int bytes_read;
385
386         if (!la8) {
387                 sr_err("la8: %s: la8 was NULL", __func__);
388                 return SR_ERR_ARG;
389         }
390
391         if (!la8->ftdic) {
392                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
393                 return SR_ERR_ARG;
394         }
395
396         sr_dbg("la8: resetting the device");
397
398         /*
399          * Purge pending read data from the FTDI hardware FIFO until
400          * no more data is left, or a timeout occurs (after 20s).
401          */
402         done = 20 + time(NULL);
403         do {
404                 /* TODO: Ignore errors? Check for < 0 at least! */
405                 bytes_read = la8_read(la8, (uint8_t *)&buf, BS);
406                 now = time(NULL);
407         } while ((done > now) && (bytes_read > 0));
408
409         /* Reset the LA8 sequencer logic and close the USB port. */
410         (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
411
412         sr_dbg("la8: device reset finished");
413
414         return SR_OK;
415 }
416
417 static int configure_probes(struct la8 *la8, GSList *probes)
418 {
419         struct sr_probe *probe;
420         GSList *l;
421         uint8_t probe_bit;
422         char *tc;
423
424         la8->trigger_pattern = 0;
425         la8->trigger_mask = 0; /* Default to "don't care" for all probes. */
426
427         for (l = probes; l; l = l->next) {
428                 probe = (struct sr_probe *)l->data;
429
430                 if (!probe) {
431                         sr_err("la8: %s: probe was NULL", __func__);
432                         return SR_ERR;
433                 }
434
435                 /* Skip disabled probes. */
436                 if (!probe->enabled)
437                         continue;
438
439                 /* Skip (enabled) probes with no configured trigger. */
440                 if (!probe->trigger)
441                         continue;
442
443                 /* Note: Must only be run if probe->trigger != NULL. */
444                 if (probe->index < 0 || probe->index > 7) {
445                         sr_err("la8: %s: invalid probe index %d, must be "
446                                "between 0 and 7", __func__, probe->index);
447                         return SR_ERR;
448                 }
449
450                 probe_bit = (1 << (probe->index - 1));
451
452                 /* Configure the probe's trigger mask and trigger pattern. */
453                 for (tc = probe->trigger; tc && *tc; tc++) {
454                         la8->trigger_mask |= probe_bit;
455
456                         /* Sanity check, LA8 only supports low/high trigger. */
457                         if (*tc != '0' && *tc != '1') {
458                                 sr_err("la8: %s: invalid trigger '%c', only "
459                                        "'0'/'1' supported", __func__, *tc);
460                                 return SR_ERR;
461                         }
462
463                         if (*tc == '1')
464                                 la8->trigger_pattern |= probe_bit;
465                 }
466         }
467
468         sr_dbg("la8: %s: trigger_mask = 0x%x, trigger_pattern = 0x%x",
469                __func__, la8->trigger_mask, la8->trigger_pattern);
470
471         return SR_OK;
472 }
473
474 static int hw_init(const char *deviceinfo)
475 {
476         int ret;
477         struct sr_device_instance *sdi;
478         struct la8 *la8;
479
480         sr_spew("la8: entering %s", __func__);
481
482         /* Avoid compiler errors. */
483         (void)deviceinfo;
484
485         /* Allocate memory for our private driver context. */
486         if (!(la8 = g_try_malloc(sizeof(struct la8)))) {
487                 sr_err("la8: %s: struct la8 malloc failed", __func__);
488                 goto err_free_nothing;
489         }
490
491         /* Set some sane defaults. */
492         la8->ftdic = NULL;
493         la8->cur_samplerate = SR_MHZ(100); /* 100MHz == max. samplerate */
494         la8->limit_msec = 0;
495         la8->limit_samples = 0;
496         la8->session_id = NULL;
497         memset(la8->mangled_buf, 0, BS);
498         la8->final_buf = NULL;
499         la8->trigger_pattern = 0x00; /* Value irrelevant, see trigger_mask. */
500         la8->trigger_mask = 0x00; /* All probes are "don't care". */
501         la8->trigger_timeout = 10; /* Default to 10s trigger timeout. */
502         la8->trigger_found = 0;
503         la8->done = 0;
504         la8->block_counter = 0;
505         la8->divcount = 0; /* 10ns sample period == 100MHz samplerate */
506
507         /* Allocate memory where we'll store the de-mangled data. */
508         if (!(la8->final_buf = g_try_malloc(SDRAM_SIZE))) {
509                 sr_err("la8: %s: final_buf malloc failed", __func__);
510                 goto err_free_la8;
511         }
512
513         /* Allocate memory for the FTDI context (ftdic) and initialize it. */
514         if (!(la8->ftdic = ftdi_new())) {
515                 sr_err("la8: %s: ftdi_new failed", __func__);
516                 goto err_free_final_buf;
517         }
518
519         /* Check for the device and temporarily open it. */
520         if ((ret = ftdi_usb_open_desc(la8->ftdic, USB_VENDOR_ID,
521                         USB_PRODUCT_ID, USB_DESCRIPTION, NULL)) < 0) {
522                 sr_dbg("la8: %s: ftdi_usb_open_desc: (%d) %s",
523                        __func__, ret, ftdi_get_error_string(la8->ftdic));
524                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
525                 goto err_free_ftdic;
526         }
527         sr_dbg("la8: found device");
528
529         /* Register the device with libsigrok. */
530         sdi = sr_dev_inst_new(0, SR_ST_INITIALIZING,
531                         USB_VENDOR_NAME, USB_MODEL_NAME, USB_MODEL_VERSION);
532         if (!sdi) {
533                 sr_err("la8: %s: sr_device_instance_new failed", __func__);
534                 goto err_close_ftdic;
535         }
536
537         sdi->priv = la8;
538
539         device_instances = g_slist_append(device_instances, sdi);
540
541         sr_spew("la8: %s finished successfully", __func__);
542
543         /* Close device. We'll reopen it again when we need it. */
544         (void) la8_close(la8); /* Log, but ignore errors. */
545
546         return 1;
547
548 err_close_ftdic:
549         (void) la8_close(la8); /* Log, but ignore errors. */
550 err_free_ftdic:
551         free(la8->ftdic); /* NOT g_free()! */
552 err_free_final_buf:
553         g_free(la8->final_buf);
554 err_free_la8:
555         g_free(la8);
556 err_free_nothing:
557
558         return 0;
559 }
560
561 static int hw_opendev(int device_index)
562 {
563         int ret;
564         struct sr_device_instance *sdi;
565         struct la8 *la8;
566
567         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
568                 sr_err("la8: %s: sdi was NULL", __func__);
569                 return SR_ERR; /* TODO: SR_ERR_ARG? */
570         }
571
572         if (!(la8 = sdi->priv)) {
573                 sr_err("la8: %s: sdi->priv was NULL", __func__);
574                 return SR_ERR; /* TODO: SR_ERR_ARG? */
575         }
576
577         sr_dbg("la8: opening device");
578
579         /* Open the device. */
580         if ((ret = ftdi_usb_open_desc(la8->ftdic, USB_VENDOR_ID,
581                         USB_PRODUCT_ID, USB_DESCRIPTION, NULL)) < 0) {
582                 sr_err("la8: %s: ftdi_usb_open_desc: (%d) %s",
583                        __func__, ret, ftdi_get_error_string(la8->ftdic));
584                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
585                 return SR_ERR;
586         }
587         sr_dbg("la8: device opened successfully");
588
589         /* Purge RX/TX buffers in the FTDI chip. */
590         if ((ret = ftdi_usb_purge_buffers(la8->ftdic)) < 0) {
591                 sr_err("la8: %s: ftdi_usb_purge_buffers: (%d) %s",
592                        __func__, ret, ftdi_get_error_string(la8->ftdic));
593                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
594                 goto err_opendev_close_ftdic;
595         }
596         sr_dbg("la8: FTDI buffers purged successfully");
597
598         /* Enable flow control in the FTDI chip. */
599         if ((ret = ftdi_setflowctrl(la8->ftdic, SIO_RTS_CTS_HS)) < 0) {
600                 sr_err("la8: %s: ftdi_setflowcontrol: (%d) %s",
601                        __func__, ret, ftdi_get_error_string(la8->ftdic));
602                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
603                 goto err_opendev_close_ftdic;
604         }
605         sr_dbg("la8: FTDI flow control enabled successfully");
606
607         /* Wait 100ms. */
608         g_usleep(100 * 1000);
609
610         sdi->status = SR_ST_ACTIVE;
611
612         return SR_OK;
613
614 err_opendev_close_ftdic:
615         (void) la8_close(la8); /* Log, but ignore errors. */
616         return SR_ERR;
617 }
618
619 static int set_samplerate(struct sr_device_instance *sdi, uint64_t samplerate)
620 {
621         struct la8 *la8;
622
623         if (!sdi) {
624                 sr_err("la8: %s: sdi was NULL", __func__);
625                 return SR_ERR_ARG;
626         }
627
628         if (!(la8 = sdi->priv)) {
629                 sr_err("la8: %s: sdi->priv was NULL", __func__);
630                 return SR_ERR_ARG;
631         }
632
633         sr_spew("la8: setting samplerate");
634
635         fill_supported_samplerates_if_needed();
636
637         /* Check if this is a samplerate supported by the hardware. */
638         if (!is_valid_samplerate(samplerate))
639                 return SR_ERR;
640
641         /* Set the new samplerate. */
642         la8->cur_samplerate = samplerate;
643
644         sr_dbg("la8: samplerate set to %" PRIu64 "Hz", la8->cur_samplerate);
645
646         return SR_OK;
647 }
648
649 static int hw_closedev(int device_index)
650 {
651         struct sr_device_instance *sdi;
652         struct la8 *la8;
653
654         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
655                 sr_err("la8: %s: sdi was NULL", __func__);
656                 return SR_ERR; /* TODO: SR_ERR_ARG? */
657         }
658
659         if (!(la8 = sdi->priv)) {
660                 sr_err("la8: %s: sdi->priv was NULL", __func__);
661                 return SR_ERR; /* TODO: SR_ERR_ARG? */
662         }
663
664         sr_dbg("la8: closing device");
665
666         if (sdi->status == SR_ST_ACTIVE) {
667                 sr_dbg("la8: %s: status ACTIVE, closing device", __func__);
668                 /* TODO: Really ignore errors here, or return SR_ERR? */
669                 (void) la8_close_usb_reset_sequencer(la8); /* Ignore errors. */
670         } else {
671                 sr_spew("la8: %s: status not ACTIVE, nothing to do", __func__);
672         }
673
674         sdi->status = SR_ST_INACTIVE;
675
676         sr_dbg("la8: %s: freeing sample buffers", __func__);
677         g_free(la8->final_buf);
678
679         return SR_OK;
680 }
681
682 static int hw_cleanup(void)
683 {
684         GSList *l;
685         struct sr_device_instance *sdi;
686         int ret = SR_OK;
687
688         sr_spew("la8: entering %s", __func__);
689
690         /* Properly close all devices. */
691         for (l = device_instances; l; l = l->next) {
692                 if (!(sdi = l->data)) {
693                         /* Log error, but continue cleaning up the rest. */
694                         sr_err("la8: %s: sdi was NULL, continuing", __func__);
695                         ret = SR_ERR_BUG;
696                         continue;
697                 }
698                 sr_dev_inst_free(sdi); /* Returns void. */
699         }
700         g_slist_free(device_instances); /* Returns void. */
701         device_instances = NULL;
702
703         return ret;
704 }
705
706 static void *hw_get_device_info(int device_index, int device_info_id)
707 {
708         struct sr_device_instance *sdi;
709         struct la8 *la8;
710         void *info;
711
712         sr_spew("la8: entering %s", __func__);
713
714         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
715                 sr_err("la8: %s: sdi was NULL", __func__);
716                 return NULL;
717         }
718
719         if (!(la8 = sdi->priv)) {
720                 sr_err("la8: %s: sdi->priv was NULL", __func__);
721                 return NULL;
722         }
723
724         switch (device_info_id) {
725         case SR_DI_INSTANCE:
726                 info = sdi;
727                 break;
728         case SR_DI_NUM_PROBES:
729                 info = GINT_TO_POINTER(NUM_PROBES);
730                 break;
731         case SR_DI_PROBE_NAMES:
732                 info = probe_names;
733                 break;
734         case SR_DI_SAMPLERATES:
735                 fill_supported_samplerates_if_needed();
736                 info = &samplerates;
737                 break;
738         case SR_DI_TRIGGER_TYPES:
739                 info = (char *)TRIGGER_TYPES;
740                 break;
741         case SR_DI_CUR_SAMPLERATE:
742                 info = &la8->cur_samplerate;
743                 break;
744         default:
745                 /* Unknown device info ID, return NULL. */
746                 sr_err("la8: %s: Unknown device info ID", __func__);
747                 info = NULL;
748                 break;
749         }
750
751         return info;
752 }
753
754 static int hw_get_status(int device_index)
755 {
756         struct sr_device_instance *sdi;
757
758         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
759                 sr_err("la8: %s: sdi was NULL, device not found", __func__);
760                 return SR_ST_NOT_FOUND;
761         }
762
763         sr_dbg("la8: %s: returning status %d", __func__, sdi->status);
764
765         return sdi->status;
766 }
767
768 static int *hw_get_capabilities(void)
769 {
770         sr_spew("la8: entering %s", __func__);
771
772         return capabilities;
773 }
774
775 static int hw_set_configuration(int device_index, int capability, void *value)
776 {
777         struct sr_device_instance *sdi;
778         struct la8 *la8;
779
780         sr_spew("la8: entering %s", __func__);
781
782         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
783                 sr_err("la8: %s: sdi was NULL", __func__);
784                 return SR_ERR; /* TODO: SR_ERR_ARG? */
785         }
786
787         if (!(la8 = sdi->priv)) {
788                 sr_err("la8: %s: sdi->priv was NULL", __func__);
789                 return SR_ERR; /* TODO: SR_ERR_ARG? */
790         }
791
792         switch (capability) {
793         case SR_HWCAP_SAMPLERATE:
794                 if (set_samplerate(sdi, *(uint64_t *)value) == SR_ERR)
795                         return SR_ERR;
796                 sr_dbg("la8: SAMPLERATE = %" PRIu64, la8->cur_samplerate);
797                 break;
798         case SR_HWCAP_PROBECONFIG:
799                 if (configure_probes(la8, (GSList *)value) != SR_OK) {
800                         sr_err("la8: %s: probe config failed", __func__);
801                         return SR_ERR;
802                 }
803                 break;
804         case SR_HWCAP_LIMIT_MSEC:
805                 if (*(uint64_t *)value == 0) {
806                         sr_err("la8: %s: LIMIT_MSEC can't be 0", __func__);
807                         return SR_ERR;
808                 }
809                 la8->limit_msec = *(uint64_t *)value;
810                 sr_dbg("la8: LIMIT_MSEC = %" PRIu64, la8->limit_msec);
811                 break;
812         case SR_HWCAP_LIMIT_SAMPLES:
813                 if (*(uint64_t *)value < MIN_NUM_SAMPLES) {
814                         sr_err("la8: %s: LIMIT_SAMPLES too small", __func__);
815                         return SR_ERR;
816                 }
817                 la8->limit_samples = *(uint64_t *)value;
818                 sr_dbg("la8: LIMIT_SAMPLES = %" PRIu64, la8->limit_samples);
819                 break;
820         default:
821                 /* Unknown capability, return SR_ERR. */
822                 sr_err("la8: %s: Unknown capability", __func__);
823                 return SR_ERR;
824                 break;
825         }
826
827         return SR_OK;
828 }
829
830 /**
831  * Get a block of data from the LA8.
832  *
833  * @param la8 The LA8 struct containing private per-device-instance data.
834  * @return SR_OK upon success, or SR_ERR upon errors.
835  */
836 static int la8_read_block(struct la8 *la8)
837 {
838         int i, byte_offset, m, mi, p, index, bytes_read;
839         time_t now;
840
841         if (!la8) {
842                 sr_err("la8: %s: la8 was NULL", __func__);
843                 return SR_ERR_ARG;
844         }
845
846         if (!la8->ftdic) {
847                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
848                 return SR_ERR_ARG;
849         }
850
851         sr_spew("la8: %s: reading block %d", __func__, la8->block_counter);
852
853         bytes_read = la8_read(la8, la8->mangled_buf, BS);
854
855         /* If first block read got 0 bytes, retry until success or timeout. */
856         if ((bytes_read == 0) && (la8->block_counter == 0)) {
857                 do {
858                         sr_spew("la8: %s: reading block 0 again", __func__);
859                         bytes_read = la8_read(la8, la8->mangled_buf, BS);
860                         /* TODO: How to handle read errors here? */
861                         now = time(NULL);
862                 } while ((la8->done > now) && (bytes_read == 0));
863         }
864
865         /* Check if block read was successful or a timeout occured. */
866         if (bytes_read != BS) {
867                 sr_err("la8: %s: trigger timed out", __func__);
868                 (void) la8_reset(la8); /* Ignore errors. */
869                 return SR_ERR;
870         }
871
872         /* De-mangle the data. */
873         sr_spew("la8: de-mangling samples of block %d", la8->block_counter);
874         byte_offset = la8->block_counter * BS;
875         m = byte_offset / (1024 * 1024);
876         mi = m * (1024 * 1024);
877         for (i = 0; i < BS; i++) {
878                 p = i & (1 << 0);
879                 index = m * 2 + (((byte_offset + i) - mi) / 2) * 16;
880                 index += (la8->divcount == 0) ? p : (1 - p);
881                 la8->final_buf[index] = la8->mangled_buf[i];
882         }
883
884         return SR_OK;
885 }
886
887 static void send_block_to_session_bus(struct la8 *la8, int block)
888 {
889         int i;
890         uint8_t sample, expected_sample;
891         struct sr_datafeed_packet packet;
892         struct sr_datafeed_logic logic;
893         int trigger_point; /* Relative trigger point (in this block). */
894
895         /* Note: No sanity checks on la8/block, caller is responsible. */
896
897         /* Check if we can find the trigger condition in this block. */
898         trigger_point = -1;
899         expected_sample = la8->trigger_pattern & la8->trigger_mask;
900         for (i = 0; i < BS; i++) {
901                 /* Don't continue if the trigger was found previously. */
902                 if (la8->trigger_found)
903                         break;
904
905                 /*
906                  * Also, don't continue if triggers are "don't care", i.e. if
907                  * no trigger conditions were specified by the user. In that
908                  * case we don't want to send an SR_DF_TRIGGER packet at all.
909                  */
910                 if (la8->trigger_mask == 0x00)
911                         break;
912
913                 sample = *(la8->final_buf + (block * BS) + i);
914
915                 if ((sample & la8->trigger_mask) == expected_sample) {
916                         trigger_point = i;
917                         la8->trigger_found = 1;
918                         break;
919                 }
920         }
921
922         /* If no trigger was found, send one SR_DF_LOGIC packet. */
923         if (trigger_point == -1) {
924                 /* Send an SR_DF_LOGIC packet to the session bus. */
925                 sr_spew("la8: sending SR_DF_LOGIC packet (%d bytes) for "
926                         "block %d", BS, block);
927                 packet.type = SR_DF_LOGIC;
928                 packet.payload = &logic;
929                 logic.length = BS;
930                 logic.unitsize = 1;
931                 logic.data = la8->final_buf + (block * BS);
932                 sr_session_bus(la8->session_id, &packet);
933                 return;
934         }
935
936         /*
937          * We found the trigger, so some special handling is needed. We have
938          * to send an SR_DF_LOGIC packet with the samples before the trigger
939          * (if any), then the SD_DF_TRIGGER packet itself, then another
940          * SR_DF_LOGIC packet with the samples after the trigger (if any).
941          */
942
943         /* TODO: Send SR_DF_TRIGGER packet before or after the actual sample? */
944
945         /* If at least one sample is located before the trigger... */
946         if (trigger_point > 0) {
947                 /* Send pre-trigger SR_DF_LOGIC packet to the session bus. */
948                 sr_spew("la8: sending pre-trigger SR_DF_LOGIC packet, "
949                         "start = %d, length = %d", block * BS, trigger_point);
950                 packet.type = SR_DF_LOGIC;
951                 packet.payload = &logic;
952                 logic.length = trigger_point;
953                 logic.unitsize = 1;
954                 logic.data = la8->final_buf + (block * BS);
955                 sr_session_bus(la8->session_id, &packet);
956         }
957
958         /* Send the SR_DF_TRIGGER packet to the session bus. */
959         sr_spew("la8: sending SR_DF_TRIGGER packet, sample = %d",
960                 (block * BS) + trigger_point);
961         packet.type = SR_DF_TRIGGER;
962         packet.payload = NULL;
963         sr_session_bus(la8->session_id, &packet);
964
965         /* If at least one sample is located after the trigger... */
966         if (trigger_point < (BS - 1)) {
967                 /* Send post-trigger SR_DF_LOGIC packet to the session bus. */
968                 sr_spew("la8: sending post-trigger SR_DF_LOGIC packet, "
969                         "start = %d, length = %d",
970                         (block * BS) + trigger_point, BS - trigger_point);
971                 packet.type = SR_DF_LOGIC;
972                 packet.payload = &logic;
973                 logic.length = BS - trigger_point;
974                 logic.unitsize = 1;
975                 logic.data = la8->final_buf + (block * BS) + trigger_point;
976                 sr_session_bus(la8->session_id, &packet);
977         }
978 }
979
980 static int receive_data(int fd, int revents, void *session_data)
981 {
982         int i, ret;
983         struct sr_device_instance *sdi;
984         struct la8 *la8;
985
986         /* Avoid compiler errors. */
987         (void)fd;
988         (void)revents;
989
990         if (!(sdi = session_data)) {
991                 sr_err("la8: %s: session_data was NULL", __func__);
992                 return FALSE;
993         }
994
995         if (!(la8 = sdi->priv)) {
996                 sr_err("la8: %s: sdi->priv was NULL", __func__);
997                 return FALSE;
998         }
999
1000         /* Get one block of data. */
1001         if ((ret = la8_read_block(la8)) < 0) {
1002                 sr_err("la8: %s: la8_read_block error: %d", __func__, ret);
1003                 hw_stop_acquisition(sdi->index, session_data);
1004                 return FALSE;
1005         }
1006
1007         /* We need to get exactly NUM_BLOCKS blocks (i.e. 8MB) of data. */
1008         if (la8->block_counter != (NUM_BLOCKS - 1)) {
1009                 la8->block_counter++;
1010                 return TRUE;
1011         }
1012
1013         sr_dbg("la8: sampling finished, sending data to session bus now");
1014
1015         /* All data was received and demangled, send it to the session bus. */
1016         for (i = 0; i < NUM_BLOCKS; i++)
1017                 send_block_to_session_bus(la8, i);
1018
1019         hw_stop_acquisition(sdi->index, session_data);
1020
1021         // return FALSE; /* FIXME? */
1022         return TRUE;
1023 }
1024
1025 static int hw_start_acquisition(int device_index, gpointer session_data)
1026 {
1027         struct sr_device_instance *sdi;
1028         struct la8 *la8;
1029         struct sr_datafeed_packet packet;
1030         struct sr_datafeed_header header;
1031         uint8_t buf[4];
1032         int bytes_written;
1033
1034         sr_spew("la8: entering %s", __func__);
1035
1036         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
1037                 sr_err("la8: %s: sdi was NULL", __func__);
1038                 return SR_ERR; /* TODO: SR_ERR_ARG? */
1039         }
1040
1041         if (!(la8 = sdi->priv)) {
1042                 sr_err("la8: %s: sdi->priv was NULL", __func__);
1043                 return SR_ERR; /* TODO: SR_ERR_ARG? */
1044         }
1045
1046         if (!la8->ftdic) {
1047                 sr_err("la8: %s: la8->ftdic was NULL", __func__);
1048                 return SR_ERR_ARG;
1049         }
1050
1051         la8->divcount = samplerate_to_divcount(la8->cur_samplerate);
1052         if (la8->divcount == 0xff) {
1053                 sr_err("la8: %s: invalid divcount/samplerate", __func__);
1054                 return SR_ERR;
1055         }
1056
1057         /* Fill acquisition parameters into buf[]. */
1058         buf[0] = la8->divcount;
1059         buf[1] = 0xff; /* This byte must always be 0xff. */
1060         buf[2] = la8->trigger_pattern;
1061         buf[3] = la8->trigger_mask;
1062
1063         /* Start acquisition. */
1064         bytes_written = la8_write(la8, buf, 4);
1065
1066         if (bytes_written < 0) {
1067                 sr_err("la8: acquisition failed to start");
1068                 return SR_ERR;
1069         } else if (bytes_written != 4) {
1070                 sr_err("la8: acquisition failed to start");
1071                 return SR_ERR; /* TODO: Other error and return code? */
1072         }
1073
1074         sr_dbg("la8: acquisition started successfully");
1075
1076         la8->session_id = session_data;
1077
1078         /* Send header packet to the session bus. */
1079         sr_dbg("la8: %s: sending SR_DF_HEADER", __func__);
1080         packet.type = SR_DF_HEADER;
1081         packet.payload = &header;
1082         header.feed_version = 1;
1083         gettimeofday(&header.starttime, NULL);
1084         header.samplerate = la8->cur_samplerate;
1085         header.num_logic_probes = NUM_PROBES;
1086         sr_session_bus(session_data, &packet);
1087
1088         /* Time when we should be done (for detecting trigger timeouts). */
1089         la8->done = (la8->divcount + 1) * 0.08388608 + time(NULL)
1090                         + la8->trigger_timeout;
1091         la8->block_counter = 0;
1092         la8->trigger_found = 0;
1093
1094         /* Hook up a dummy handler to receive data from the LA8. */
1095         sr_source_add(-1, G_IO_IN, 0, receive_data, sdi);
1096
1097         return SR_OK;
1098 }
1099
1100 static int hw_stop_acquisition(int device_index, gpointer session_data)
1101 {
1102         struct sr_device_instance *sdi;
1103         struct la8 *la8;
1104         struct sr_datafeed_packet packet;
1105
1106         sr_dbg("la8: stopping acquisition");
1107
1108         if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
1109                 sr_err("la8: %s: sdi was NULL", __func__);
1110                 return SR_ERR_BUG;
1111         }
1112
1113         if (!(la8 = sdi->priv)) {
1114                 sr_err("la8: %s: sdi->priv was NULL", __func__);
1115                 return SR_ERR_BUG;
1116         }
1117
1118         /* Send end packet to the session bus. */
1119         sr_dbg("la8: %s: sending SR_DF_END", __func__);
1120         packet.type = SR_DF_END;
1121         sr_session_bus(session_data, &packet);
1122
1123         return SR_OK;
1124 }
1125
1126 SR_PRIV struct sr_device_plugin chronovu_la8_plugin_info = {
1127         .name = "chronovu-la8",
1128         .longname = "ChronoVu LA8",
1129         .api_version = 1,
1130         .init = hw_init,
1131         .cleanup = hw_cleanup,
1132         .opendev = hw_opendev,
1133         .closedev = hw_closedev,
1134         .get_device_info = hw_get_device_info,
1135         .get_status = hw_get_status,
1136         .get_capabilities = hw_get_capabilities,
1137         .set_configuration = hw_set_configuration,
1138         .start_acquisition = hw_start_acquisition,
1139         .stop_acquisition = hw_stop_acquisition,
1140 };