libusb1_common, ftdi: clarify libusb_open error message
[openocd.git] / 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 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)