libusb1_common, ftdi: clarify libusb_open error message
[fw/openocd] / src / jtag / drivers / mpsse.c
1 /**************************************************************************
2  *   Copyright (C) 2012 by Andreas Fritiofson                              *
3  *   andreas.fritiofson@gmail.com                                          *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
19  ***************************************************************************/
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "mpsse.h"
26 #include "helper/log.h"
27 #include <libusb-1.0/libusb.h>
28
29 /* Compatibility define for older libusb-1.0 */
30 #ifndef LIBUSB_CALL
31 #define LIBUSB_CALL
32 #endif
33
34 #ifdef _DEBUG_JTAG_IO_
35 #define DEBUG_IO(expr...) LOG_DEBUG(expr)
36 #define DEBUG_PRINT_BUF(buf, len) \
37         do { \
38                 char buf_string[32 * 3 + 1]; \
39                 int buf_string_pos = 0; \
40                 for (int i = 0; i < len; i++) { \
41                         buf_string_pos += sprintf(buf_string + buf_string_pos, " %02x", buf[i]); \
42                         if (i % 32 == 32 - 1) { \
43                                 LOG_DEBUG("%s", buf_string); \
44                                 buf_string_pos = 0; \
45                         } \
46                 } \
47                 if (buf_string_pos > 0) \
48                         LOG_DEBUG("%s", buf_string);\
49         } while (0)
50 #else
51 #define DEBUG_IO(expr...) do {} while (0)
52 #define DEBUG_PRINT_BUF(buf, len) do {} while (0)
53 #endif
54
55 #define FTDI_DEVICE_OUT_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
56 #define FTDI_DEVICE_IN_REQTYPE (0x80 | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
57
58 #define BITMODE_MPSSE 0x02
59
60 #define SIO_RESET_REQUEST             0x00
61 #define SIO_SET_LATENCY_TIMER_REQUEST 0x09
62 #define SIO_GET_LATENCY_TIMER_REQUEST 0x0A
63 #define SIO_SET_BITMODE_REQUEST       0x0B
64
65 #define SIO_RESET_SIO 0
66 #define SIO_RESET_PURGE_RX 1
67 #define SIO_RESET_PURGE_TX 2
68
69 struct mpsse_ctx {
70         libusb_context *usb_ctx;
71         libusb_device_handle *usb_dev;
72         unsigned int usb_write_timeout;
73         unsigned int usb_read_timeout;
74         uint8_t in_ep;
75         uint8_t out_ep;
76         uint16_t max_packet_size;
77         uint16_t index;
78         uint8_t interface;
79         enum ftdi_chip_type type;
80         uint8_t *write_buffer;
81         unsigned write_size;
82         unsigned write_count;
83         uint8_t *read_buffer;
84         unsigned read_size;
85         unsigned read_count;
86         uint8_t *read_chunk;
87         unsigned read_chunk_size;
88         struct bit_copy_queue read_queue;
89 };
90
91 /* Returns true if the string descriptor indexed by str_index in device matches string */
92 static bool string_descriptor_equal(libusb_device_handle *device, uint8_t str_index,
93         const char *string)
94 {
95         int retval;
96         char desc_string[256]; /* Max size of string descriptor */
97         retval = libusb_get_string_descriptor_ascii(device, str_index, (unsigned char *)desc_string,
98                         sizeof(desc_string));
99         if (retval < 0) {
100                 LOG_ERROR("libusb_get_string_descriptor_ascii() failed with %d", retval);
101                 return false;
102         }
103         return strncmp(string, desc_string, sizeof(desc_string)) == 0;
104 }
105
106 /* Helper to open a libusb device that matches vid, pid, product string and/or serial string.
107  * Set any field to 0 as a wildcard. If the device is found true is returned, with ctx containing
108  * the already opened handle. ctx->interface must be set to the desired interface (channel) number
109  * prior to calling this function. */
110 static bool open_matching_device(struct mpsse_ctx *ctx, const uint16_t *vid, const uint16_t *pid,
111         const char *product, const char *serial)
112 {
113         libusb_device **list;
114         struct libusb_device_descriptor desc;
115         struct libusb_config_descriptor *config0;
116         int err;
117         bool found = false;
118         ssize_t cnt = libusb_get_device_list(ctx->usb_ctx, &list);
119         if (cnt < 0)
120                 LOG_ERROR("libusb_get_device_list() failed with %zi", cnt);
121
122         for (ssize_t i = 0; i < cnt; i++) {
123                 libusb_device *device = list[i];
124
125                 err = libusb_get_device_descriptor(device, &desc);
126                 if (err != LIBUSB_SUCCESS) {
127                         LOG_ERROR("libusb_get_device_descriptor() failed with %d", err);
128                         continue;
129                 }
130
131                 if (vid && *vid != desc.idVendor)
132                         continue;
133                 if (pid && *pid != desc.idProduct)
134                         continue;
135
136                 err = libusb_open(device, &ctx->usb_dev);
137                 if (err != LIBUSB_SUCCESS) {
138                         LOG_ERROR("libusb_open() failed with %s",
139                                   libusb_error_name(err));
140                         continue;
141                 }
142
143                 if (product && !string_descriptor_equal(ctx->usb_dev, desc.iProduct, product)) {
144                         libusb_close(ctx->usb_dev);
145                         continue;
146                 }
147
148                 if (serial && !string_descriptor_equal(ctx->usb_dev, desc.iSerialNumber, serial)) {
149                         libusb_close(ctx->usb_dev);
150                         continue;
151                 }
152
153                 found = true;
154                 break;
155         }
156
157         libusb_free_device_list(list, 1);
158
159         if (!found) {
160                 LOG_ERROR("no device found");
161                 return false;
162         }
163
164         err = libusb_get_config_descriptor(libusb_get_device(ctx->usb_dev), 0, &config0);
165         if (err != LIBUSB_SUCCESS) {
166                 LOG_ERROR("libusb_get_config_descriptor() failed with %d", err);
167                 libusb_close(ctx->usb_dev);
168                 return false;
169         }
170
171         /* Make sure the first configuration is selected */
172         int cfg;
173         err = libusb_get_configuration(ctx->usb_dev, &cfg);
174         if (err != LIBUSB_SUCCESS) {
175                 LOG_ERROR("libusb_get_configuration() failed with %d", err);
176                 goto error;
177         }
178
179         if (desc.bNumConfigurations > 0 && cfg != config0->bConfigurationValue) {
180                 err = libusb_set_configuration(ctx->usb_dev, config0->bConfigurationValue);
181                 if (err != LIBUSB_SUCCESS) {
182                         LOG_ERROR("libusb_set_configuration() failed with %d", err);
183                         goto error;
184                 }
185         }
186
187         /* Try to detach ftdi_sio kernel module */
188         err = libusb_detach_kernel_driver(ctx->usb_dev, ctx->interface);
189         if (err != LIBUSB_SUCCESS && err != LIBUSB_ERROR_NOT_FOUND
190                         && err != LIBUSB_ERROR_NOT_SUPPORTED) {
191                 LOG_ERROR("libusb_detach_kernel_driver() failed with %d", err);
192                 goto error;
193         }
194
195         err = libusb_claim_interface(ctx->usb_dev, ctx->interface);
196         if (err != LIBUSB_SUCCESS) {
197                 LOG_ERROR("libusb_claim_interface() failed with %d", err);
198                 goto error;
199         }
200
201         /* Reset FTDI device */
202         err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
203                         SIO_RESET_REQUEST, SIO_RESET_SIO,
204                         ctx->index, NULL, 0, ctx->usb_write_timeout);
205         if (err < 0) {
206                 LOG_ERROR("failed to reset FTDI device: %d", err);
207                 goto error;
208         }
209
210         switch (desc.bcdDevice) {
211         case 0x500:
212                 ctx->type = TYPE_FT2232C;
213                 break;
214         case 0x700:
215                 ctx->type = TYPE_FT2232H;
216                 break;
217         case 0x800:
218                 ctx->type = TYPE_FT4232H;
219                 break;
220         case 0x900:
221                 ctx->type = TYPE_FT232H;
222                 break;
223         default:
224                 LOG_ERROR("unsupported FTDI chip type: 0x%04x", desc.bcdDevice);
225                 goto error;
226         }
227
228         /* Determine maximum packet size and endpoint addresses */
229         if (!(desc.bNumConfigurations > 0 && ctx->interface < config0->bNumInterfaces
230                         && config0->interface[ctx->interface].num_altsetting > 0))
231                 goto desc_error;
232
233         const struct libusb_interface_descriptor *descriptor;
234         descriptor = &config0->interface[ctx->interface].altsetting[0];
235         if (descriptor->bNumEndpoints != 2)
236                 goto desc_error;
237
238         ctx->in_ep = 0;
239         ctx->out_ep = 0;
240         for (int i = 0; i < descriptor->bNumEndpoints; i++) {
241                 if (descriptor->endpoint[i].bEndpointAddress & 0x80) {
242                         ctx->in_ep = descriptor->endpoint[i].bEndpointAddress;
243                         ctx->max_packet_size =
244                                         descriptor->endpoint[i].wMaxPacketSize;
245                 } else {
246                         ctx->out_ep = descriptor->endpoint[i].bEndpointAddress;
247                 }
248         }
249
250         if (ctx->in_ep == 0 || ctx->out_ep == 0)
251                 goto desc_error;
252
253         libusb_free_config_descriptor(config0);
254         return true;
255
256 desc_error:
257         LOG_ERROR("unrecognized USB device descriptor");
258 error:
259         libusb_free_config_descriptor(config0);
260         libusb_close(ctx->usb_dev);
261         return false;
262 }
263
264 struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, const char *description,
265         const char *serial, int channel)
266 {
267         struct mpsse_ctx *ctx = calloc(1, sizeof(*ctx));
268         int err;
269
270         if (!ctx)
271                 return 0;
272
273         bit_copy_queue_init(&ctx->read_queue);
274         ctx->read_chunk_size = 16384;
275         ctx->read_size = 16384;
276         ctx->write_size = 16384;
277         ctx->read_chunk = malloc(ctx->read_chunk_size);
278         ctx->read_buffer = malloc(ctx->read_size);
279         ctx->write_buffer = malloc(ctx->write_size);
280         if (!ctx->read_chunk || !ctx->read_buffer || !ctx->write_buffer)
281                 goto error;
282
283         ctx->interface = channel;
284         ctx->index = channel + 1;
285         ctx->usb_read_timeout = 5000;
286         ctx->usb_write_timeout = 5000;
287
288         err = libusb_init(&ctx->usb_ctx);
289         if (err != LIBUSB_SUCCESS) {
290                 LOG_ERROR("libusb_init() failed with %d", err);
291                 goto error;
292         }
293
294         if (!open_matching_device(ctx, vid, pid, description, serial)) {
295                 /* Four hex digits plus terminating zero each */
296                 char vidstr[5];
297                 char pidstr[5];
298                 LOG_ERROR("unable to open ftdi device with vid %s, pid %s, description '%s' and "
299                                 "serial '%s'",
300                                 vid ? sprintf(vidstr, "%04x", *vid), vidstr : "*",
301                                 pid ? sprintf(pidstr, "%04x", *pid), pidstr : "*",
302                                 description ? description : "*",
303                                 serial ? serial : "*");
304                 ctx->usb_dev = 0;
305                 goto error;
306         }
307
308         err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
309                         SIO_SET_LATENCY_TIMER_REQUEST, 255, ctx->index, NULL, 0,
310                         ctx->usb_write_timeout);
311         if (err < 0) {
312                 LOG_ERROR("unable to set latency timer: %d", err);
313                 goto error;
314         }
315
316         err = libusb_control_transfer(ctx->usb_dev,
317                         FTDI_DEVICE_OUT_REQTYPE,
318                         SIO_SET_BITMODE_REQUEST,
319                         0x0b | (BITMODE_MPSSE << 8),
320                         ctx->index,
321                         NULL,
322                         0,
323                         ctx->usb_write_timeout);
324         if (err < 0) {
325                 LOG_ERROR("unable to set MPSSE bitmode: %d", err);
326                 goto error;
327         }
328
329         mpsse_purge(ctx);
330
331         return ctx;
332 error:
333         mpsse_close(ctx);
334         return 0;
335 }
336
337 void mpsse_close(struct mpsse_ctx *ctx)
338 {
339         if (ctx->usb_dev)
340                 libusb_close(ctx->usb_dev);
341         if (ctx->usb_ctx)
342                 libusb_exit(ctx->usb_ctx);
343         bit_copy_discard(&ctx->read_queue);
344         if (ctx->write_buffer)
345                 free(ctx->write_buffer);
346         if (ctx->read_buffer)
347                 free(ctx->read_buffer);
348         if (ctx->read_chunk)
349                 free(ctx->read_chunk);
350
351         free(ctx);
352 }
353
354 bool mpsse_is_high_speed(struct mpsse_ctx *ctx)
355 {
356         return ctx->type != TYPE_FT2232C;
357 }
358
359 void mpsse_purge(struct mpsse_ctx *ctx)
360 {
361         int err;
362         LOG_DEBUG("-");
363         ctx->write_count = 0;
364         ctx->read_count = 0;
365         bit_copy_discard(&ctx->read_queue);
366         err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
367                         SIO_RESET_PURGE_RX, ctx->index, NULL, 0, ctx->usb_write_timeout);
368         if (err < 0) {
369                 LOG_ERROR("unable to purge ftdi rx buffers: %d", err);
370                 return;
371         }
372
373         err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
374                         SIO_RESET_PURGE_TX, ctx->index, NULL, 0, ctx->usb_write_timeout);
375         if (err < 0) {
376                 LOG_ERROR("unable to purge ftdi tx buffers: %d", err);
377                 return;
378         }
379 }
380
381 static unsigned buffer_write_space(struct mpsse_ctx *ctx)
382 {
383         /* Reserve one byte for SEND_IMMEDIATE */
384         return ctx->write_size - ctx->write_count - 1;
385 }
386
387 static unsigned buffer_read_space(struct mpsse_ctx *ctx)
388 {
389         return ctx->read_size - ctx->read_count;
390 }
391
392 static void buffer_write_byte(struct mpsse_ctx *ctx, uint8_t data)
393 {
394         DEBUG_IO("%02x", data);
395         assert(ctx->write_count < ctx->write_size);
396         ctx->write_buffer[ctx->write_count++] = data;
397 }
398
399 static unsigned buffer_write(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
400         unsigned bit_count)
401 {
402         DEBUG_IO("%d bits", bit_count);
403         assert(ctx->write_count + DIV_ROUND_UP(bit_count, 8) <= ctx->write_size);
404         bit_copy(ctx->write_buffer + ctx->write_count, 0, out, out_offset, bit_count);
405         ctx->write_count += DIV_ROUND_UP(bit_count, 8);
406         return bit_count;
407 }
408
409 static unsigned buffer_add_read(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset,
410         unsigned bit_count, unsigned offset)
411 {
412         DEBUG_IO("%d bits, offset %d", bit_count, offset);
413         assert(ctx->read_count + DIV_ROUND_UP(bit_count, 8) <= ctx->read_size);
414         bit_copy_queued(&ctx->read_queue, in, in_offset, ctx->read_buffer + ctx->read_count, offset,
415                 bit_count);
416         ctx->read_count += DIV_ROUND_UP(bit_count, 8);
417         return bit_count;
418 }
419
420 int mpsse_clock_data_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
421         unsigned length, uint8_t mode)
422 {
423         return mpsse_clock_data(ctx, out, out_offset, 0, 0, length, mode);
424 }
425
426 int mpsse_clock_data_in(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset, unsigned length,
427         uint8_t mode)
428 {
429         return mpsse_clock_data(ctx, 0, 0, in, in_offset, length, mode);
430 }
431
432 int mpsse_clock_data(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
433         unsigned in_offset, unsigned length, uint8_t mode)
434 {
435         /* TODO: Fix MSB first modes */
436         DEBUG_IO("%s%s %d bits", in ? "in" : "", out ? "out" : "", length);
437         int retval = ERROR_OK;
438
439         /* TODO: On H chips, use command 0x8E/0x8F if in and out are both 0 */
440         if (out || (!out && !in))
441                 mode |= 0x10;
442         if (in)
443                 mode |= 0x20;
444
445         while (length > 0) {
446                 /* Guarantee buffer space enough for a minimum size transfer */
447                 if (buffer_write_space(ctx) + (length < 8) < (out || (!out && !in) ? 4 : 3)
448                                 || (in && buffer_read_space(ctx) < 1))
449                         retval = mpsse_flush(ctx);
450
451                 if (length < 8) {
452                         /* Transfer remaining bits in bit mode */
453                         buffer_write_byte(ctx, 0x02 | mode);
454                         buffer_write_byte(ctx, length - 1);
455                         if (out)
456                                 out_offset += buffer_write(ctx, out, out_offset, length);
457                         if (in)
458                                 in_offset += buffer_add_read(ctx, in, in_offset, length, 8 - length);
459                         if (!out && !in)
460                                 buffer_write_byte(ctx, 0x00);
461                         length = 0;
462                 } else {
463                         /* Byte transfer */
464                         unsigned this_bytes = length / 8;
465                         /* MPSSE command limit */
466                         if (this_bytes > 65536)
467                                 this_bytes = 65536;
468                         /* Buffer space limit. We already made sure there's space for the minimum
469                          * transfer. */
470                         if ((out || (!out && !in)) && this_bytes + 3 > buffer_write_space(ctx))
471                                 this_bytes = buffer_write_space(ctx) - 3;
472                         if (in && this_bytes > buffer_read_space(ctx))
473                                 this_bytes = buffer_read_space(ctx);
474
475                         if (this_bytes > 0) {
476                                 buffer_write_byte(ctx, mode);
477                                 buffer_write_byte(ctx, (this_bytes - 1) & 0xff);
478                                 buffer_write_byte(ctx, (this_bytes - 1) >> 8);
479                                 if (out)
480                                         out_offset += buffer_write(ctx,
481                                                         out,
482                                                         out_offset,
483                                                         this_bytes * 8);
484                                 if (in)
485                                         in_offset += buffer_add_read(ctx,
486                                                         in,
487                                                         in_offset,
488                                                         this_bytes * 8,
489                                                         0);
490                                 if (!out && !in)
491                                         for (unsigned n = 0; n < this_bytes; n++)
492                                                 buffer_write_byte(ctx, 0x00);
493                                 length -= this_bytes * 8;
494                         }
495                 }
496         }
497         return retval;
498 }
499
500 int mpsse_clock_tms_cs_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
501         unsigned length, bool tdi, uint8_t mode)
502 {
503         return mpsse_clock_tms_cs(ctx, out, out_offset, 0, 0, length, tdi, mode);
504 }
505
506 int mpsse_clock_tms_cs(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
507         unsigned in_offset, unsigned length, bool tdi, uint8_t mode)
508 {
509         DEBUG_IO("%sout %d bits, tdi=%d", in ? "in" : "", length, tdi);
510         assert(out);
511         int retval = ERROR_OK;
512
513         mode |= 0x42;
514         if (in)
515                 mode |= 0x20;
516
517         while (length > 0) {
518                 /* Guarantee buffer space enough for a minimum size transfer */
519                 if (buffer_write_space(ctx) < 3 || (in && buffer_read_space(ctx) < 1))
520                         retval = mpsse_flush(ctx);
521
522                 /* Byte transfer */
523                 unsigned this_bits = length;
524                 /* MPSSE command limit */
525                 /* NOTE: there's a report of an FT2232 bug in this area, where shifting
526                  * exactly 7 bits can make problems with TMS signaling for the last
527                  * clock cycle:
528                  *
529                  * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
530                  */
531                 if (this_bits > 7)
532                         this_bits = 7;
533
534                 if (this_bits > 0) {
535                         buffer_write_byte(ctx, mode);
536                         buffer_write_byte(ctx, this_bits - 1);
537                         uint8_t data = 0;
538                         /* TODO: Fix MSB first, if allowed in MPSSE */
539                         bit_copy(&data, 0, out, out_offset, this_bits);
540                         out_offset += this_bits;
541                         buffer_write_byte(ctx, data | (tdi ? 0x80 : 0x00));
542                         if (in)
543                                 in_offset += buffer_add_read(ctx,
544                                                 in,
545                                                 in_offset,
546                                                 this_bits,
547                                                 8 - this_bits);
548                         length -= this_bits;
549                 }
550         }
551         return retval;
552 }
553
554 int mpsse_set_data_bits_low_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
555 {
556         DEBUG_IO("-");
557         int retval = ERROR_OK;
558
559         if (buffer_write_space(ctx) < 3)
560                 retval = mpsse_flush(ctx);
561
562         buffer_write_byte(ctx, 0x80);
563         buffer_write_byte(ctx, data);
564         buffer_write_byte(ctx, dir);
565
566         return retval;
567 }
568
569 int mpsse_set_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
570 {
571         DEBUG_IO("-");
572         int retval = ERROR_OK;
573
574         if (buffer_write_space(ctx) < 3)
575                 retval = mpsse_flush(ctx);
576
577         buffer_write_byte(ctx, 0x82);
578         buffer_write_byte(ctx, data);
579         buffer_write_byte(ctx, dir);
580
581         return retval;
582 }
583
584 int mpsse_read_data_bits_low_byte(struct mpsse_ctx *ctx, uint8_t *data)
585 {
586         DEBUG_IO("-");
587         int retval = ERROR_OK;
588
589         if (buffer_write_space(ctx) < 1)
590                 retval = mpsse_flush(ctx);
591
592         buffer_write_byte(ctx, 0x81);
593         buffer_add_read(ctx, data, 0, 8, 0);
594
595         return retval;
596 }
597
598 int mpsse_read_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t *data)
599 {
600         DEBUG_IO("-");
601         int retval = ERROR_OK;
602
603         if (buffer_write_space(ctx) < 1)
604                 retval = mpsse_flush(ctx);
605
606         buffer_write_byte(ctx, 0x83);
607         buffer_add_read(ctx, data, 0, 8, 0);
608
609         return retval;
610 }
611
612 static int single_byte_boolean_helper(struct mpsse_ctx *ctx, bool var, uint8_t val_if_true,
613         uint8_t val_if_false)
614 {
615         int retval = ERROR_OK;
616
617         if (buffer_write_space(ctx) < 1)
618                 retval = mpsse_flush(ctx);
619
620         buffer_write_byte(ctx, var ? val_if_true : val_if_false);
621
622         return retval;
623 }
624
625 int mpsse_loopback_config(struct mpsse_ctx *ctx, bool enable)
626 {
627         LOG_DEBUG("%s", enable ? "on" : "off");
628         return single_byte_boolean_helper(ctx, enable, 0x84, 0x85);
629 }
630
631 int mpsse_set_divisor(struct mpsse_ctx *ctx, uint16_t divisor)
632 {
633         LOG_DEBUG("%d", divisor);
634         int retval = ERROR_OK;
635
636         if (buffer_write_space(ctx) < 3)
637                 retval = mpsse_flush(ctx);
638
639         buffer_write_byte(ctx, 0x86);
640         buffer_write_byte(ctx, divisor & 0xff);
641         buffer_write_byte(ctx, divisor >> 8);
642
643         return retval;
644 }
645
646 int mpsse_divide_by_5_config(struct mpsse_ctx *ctx, bool enable)
647 {
648         if (!mpsse_is_high_speed(ctx))
649                 return ERROR_FAIL;
650
651         LOG_DEBUG("%s", enable ? "on" : "off");
652
653         return single_byte_boolean_helper(ctx, enable, 0x8b, 0x8a);
654 }
655
656 int mpsse_rtck_config(struct mpsse_ctx *ctx, bool enable)
657 {
658         if (!mpsse_is_high_speed(ctx))
659                 return ERROR_FAIL;
660
661         LOG_DEBUG("%s", enable ? "on" : "off");
662
663         return single_byte_boolean_helper(ctx, enable, 0x96, 0x97);
664 }
665
666 int mpsse_set_frequency(struct mpsse_ctx *ctx, int frequency)
667 {
668         LOG_DEBUG("target %d Hz", frequency);
669         assert(frequency >= 0);
670         int base_clock;
671
672         if (frequency == 0)
673                 return mpsse_rtck_config(ctx, true);
674
675         mpsse_rtck_config(ctx, false); /* just try */
676
677         if (frequency > 60000000 / 2 / 65536 && mpsse_is_high_speed(ctx)) {
678                 int retval = mpsse_divide_by_5_config(ctx, false);
679                 if (retval != ERROR_OK)
680                         return retval;
681                 base_clock = 60000000;
682         } else {
683                 mpsse_divide_by_5_config(ctx, true); /* just try */
684                 base_clock = 12000000;
685         }
686
687         int divisor = (base_clock / 2 + frequency - 1) / frequency - 1;
688         if (divisor > 65535)
689                 divisor = 65535;
690         assert(divisor >= 0);
691
692         int retval = mpsse_set_divisor(ctx, divisor);
693         if (retval != ERROR_OK)
694                 return retval;
695
696         frequency = base_clock / 2 / (1 + divisor);
697         LOG_DEBUG("actually %d Hz", frequency);
698
699         return frequency;
700 }
701
702 /* Context needed by the callbacks */
703 struct transfer_result {
704         struct mpsse_ctx *ctx;
705         bool done;
706         unsigned transferred;
707 };
708
709 static LIBUSB_CALL void read_cb(struct libusb_transfer *transfer)
710 {
711         struct transfer_result *res = (struct transfer_result *)transfer->user_data;
712         struct mpsse_ctx *ctx = res->ctx;
713
714         unsigned packet_size = ctx->max_packet_size;
715
716         DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
717
718         /* Strip the two status bytes sent at the beginning of each USB packet
719          * while copying the chunk buffer to the read buffer */
720         unsigned num_packets = DIV_ROUND_UP(transfer->actual_length, packet_size);
721         unsigned chunk_remains = transfer->actual_length;
722         for (unsigned i = 0; i < num_packets && chunk_remains > 2; i++) {
723                 unsigned this_size = packet_size - 2;
724                 if (this_size > chunk_remains - 2)
725                         this_size = chunk_remains - 2;
726                 if (this_size > ctx->read_count - res->transferred)
727                         this_size = ctx->read_count - res->transferred;
728                 memcpy(ctx->read_buffer + res->transferred,
729                         ctx->read_chunk + packet_size * i + 2,
730                         this_size);
731                 res->transferred += this_size;
732                 chunk_remains -= this_size + 2;
733                 if (res->transferred == ctx->read_count) {
734                         res->done = true;
735                         break;
736                 }
737         }
738
739         DEBUG_IO("raw chunk %d, transferred %d of %d", transfer->actual_length, res->transferred,
740                 ctx->read_count);
741
742         if (!res->done)
743                 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
744                         res->done = true;
745 }
746
747 static LIBUSB_CALL void write_cb(struct libusb_transfer *transfer)
748 {
749         struct transfer_result *res = (struct transfer_result *)transfer->user_data;
750         struct mpsse_ctx *ctx = res->ctx;
751
752         res->transferred += transfer->actual_length;
753
754         DEBUG_IO("transferred %d of %d", res->transferred, ctx->write_count);
755
756         DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
757
758         if (res->transferred == ctx->write_count)
759                 res->done = true;
760         else {
761                 transfer->length = ctx->write_count - res->transferred;
762                 transfer->buffer = ctx->write_buffer + res->transferred;
763                 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
764                         res->done = true;
765         }
766 }
767
768 int mpsse_flush(struct mpsse_ctx *ctx)
769 {
770         DEBUG_IO("write %d%s, read %d", ctx->write_count, ctx->read_count ? "+1" : "",
771                         ctx->read_count);
772         assert(ctx->write_count > 0 || ctx->read_count == 0); /* No read data without write data */
773         int retval = ERROR_OK;
774
775         if (ctx->write_count == 0)
776                 return retval;
777
778         struct libusb_transfer *read_transfer = 0;
779         struct transfer_result read_result = { .ctx = ctx, .done = true };
780         if (ctx->read_count) {
781                 buffer_write_byte(ctx, 0x87); /* SEND_IMMEDIATE */
782                 read_result.done = false;
783                 /* delay read transaction to ensure the FTDI chip can support us with data
784                    immediately after processing the MPSSE commands in the write transaction */
785         }
786
787         struct transfer_result write_result = { .ctx = ctx, .done = false };
788         struct libusb_transfer *write_transfer = libusb_alloc_transfer(0);
789         libusb_fill_bulk_transfer(write_transfer, ctx->usb_dev, ctx->out_ep, ctx->write_buffer,
790                 ctx->write_count, write_cb, &write_result, ctx->usb_write_timeout);
791         retval = libusb_submit_transfer(write_transfer);
792
793         if (ctx->read_count) {
794                 read_transfer = libusb_alloc_transfer(0);
795                 libusb_fill_bulk_transfer(read_transfer, ctx->usb_dev, ctx->in_ep, ctx->read_chunk,
796                         ctx->read_chunk_size, read_cb, &read_result,
797                         ctx->usb_read_timeout);
798                 retval = libusb_submit_transfer(read_transfer);
799         }
800
801         /* Polling loop, more or less taken from libftdi */
802         while (!write_result.done || !read_result.done) {
803                 retval = libusb_handle_events(ctx->usb_ctx);
804                 keep_alive();
805                 if (retval != LIBUSB_SUCCESS && retval != LIBUSB_ERROR_INTERRUPTED) {
806                         libusb_cancel_transfer(write_transfer);
807                         if (read_transfer)
808                                 libusb_cancel_transfer(read_transfer);
809                         while (!write_result.done || !read_result.done)
810                                 if (libusb_handle_events(ctx->usb_ctx) != LIBUSB_SUCCESS)
811                                         break;
812                 }
813         }
814
815         if (retval != LIBUSB_SUCCESS) {
816                 LOG_ERROR("libusb_handle_events() failed with %d", retval);
817                 retval = ERROR_FAIL;
818         } else if (write_result.transferred < ctx->write_count) {
819                 LOG_ERROR("ftdi device did not accept all data: %d, tried %d",
820                         write_result.transferred,
821                         ctx->write_count);
822                 retval = ERROR_FAIL;
823         } else if (read_result.transferred < ctx->read_count) {
824                 LOG_ERROR("ftdi device did not return all data: %d, expected %d",
825                         read_result.transferred,
826                         ctx->read_count);
827                 retval = ERROR_FAIL;
828         } else if (ctx->read_count) {
829                 ctx->write_count = 0;
830                 ctx->read_count = 0;
831                 bit_copy_execute(&ctx->read_queue);
832                 retval = ERROR_OK;
833         } else {
834                 ctx->write_count = 0;
835                 bit_copy_discard(&ctx->read_queue);
836                 retval = ERROR_OK;
837         }
838
839         libusb_free_transfer(write_transfer);
840         if (read_transfer)
841                 libusb_free_transfer(read_transfer);
842
843         if (retval != ERROR_OK)
844                 mpsse_purge(ctx);
845
846         return retval;
847 }