Revert "mpsse: Always perform a general reset of the MPSSE in mpsse_open()"
[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 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 %d", err);
139 continue;
140 }
141
142 if (product && !string_descriptor_equal(ctx->usb_dev, desc.iProduct, product)) {
143 libusb_close(ctx->usb_dev);
144 continue;
145 }
146
147 if (serial && !string_descriptor_equal(ctx->usb_dev, desc.iSerialNumber, serial)) {
148 libusb_close(ctx->usb_dev);
149 continue;
150 }
151
152 found = true;
153 break;
154 }
155
156 libusb_free_device_list(list, 1);
157
158 if (!found) {
159 LOG_ERROR("no device found");
160 return false;
161 }
162
163 err = libusb_get_config_descriptor(libusb_get_device(ctx->usb_dev), 0, &config0);
164 if (err != LIBUSB_SUCCESS) {
165 LOG_ERROR("libusb_get_config_descriptor() failed with %d", err);
166 libusb_close(ctx->usb_dev);
167 return false;
168 }
169
170 /* Make sure the first configuration is selected */
171 int cfg;
172 err = libusb_get_configuration(ctx->usb_dev, &cfg);
173 if (err != LIBUSB_SUCCESS) {
174 LOG_ERROR("libusb_get_configuration() failed with %d", err);
175 goto error;
176 }
177
178 if (desc.bNumConfigurations > 0 && cfg != config0->bConfigurationValue) {
179 err = libusb_set_configuration(ctx->usb_dev, config0->bConfigurationValue);
180 if (err != LIBUSB_SUCCESS) {
181 LOG_ERROR("libusb_set_configuration() failed with %d", err);
182 goto error;
183 }
184 }
185
186 /* Try to detach ftdi_sio kernel module */
187 err = libusb_detach_kernel_driver(ctx->usb_dev, ctx->interface);
188 if (err != LIBUSB_SUCCESS && err != LIBUSB_ERROR_NOT_FOUND
189 && err != LIBUSB_ERROR_NOT_SUPPORTED) {
190 LOG_ERROR("libusb_detach_kernel_driver() failed with %d", err);
191 goto error;
192 }
193
194 err = libusb_claim_interface(ctx->usb_dev, ctx->interface);
195 if (err != LIBUSB_SUCCESS) {
196 LOG_ERROR("libusb_claim_interface() failed with %d", err);
197 goto error;
198 }
199
200 /* Reset FTDI device */
201 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
202 SIO_RESET_REQUEST, SIO_RESET_SIO,
203 ctx->index, NULL, 0, ctx->usb_write_timeout);
204 if (err < 0) {
205 LOG_ERROR("failed to reset FTDI device: %d", err);
206 goto error;
207 }
208
209 switch (desc.bcdDevice) {
210 case 0x500:
211 ctx->type = TYPE_FT2232C;
212 break;
213 case 0x700:
214 ctx->type = TYPE_FT2232H;
215 break;
216 case 0x800:
217 ctx->type = TYPE_FT4232H;
218 break;
219 case 0x900:
220 ctx->type = TYPE_FT232H;
221 break;
222 default:
223 LOG_ERROR("unsupported FTDI chip type: 0x%04x", desc.bcdDevice);
224 goto error;
225 }
226
227 /* Determine maximum packet size and endpoint addresses */
228 if (!(desc.bNumConfigurations > 0 && ctx->interface < config0->bNumInterfaces
229 && config0->interface[ctx->interface].num_altsetting > 0))
230 goto desc_error;
231
232 const struct libusb_interface_descriptor *descriptor;
233 descriptor = &config0->interface[ctx->interface].altsetting[0];
234 if (descriptor->bNumEndpoints != 2)
235 goto desc_error;
236
237 ctx->in_ep = 0;
238 ctx->out_ep = 0;
239 for (int i = 0; i < descriptor->bNumEndpoints; i++) {
240 if (descriptor->endpoint[i].bEndpointAddress & 0x80) {
241 ctx->in_ep = descriptor->endpoint[i].bEndpointAddress;
242 ctx->max_packet_size =
243 descriptor->endpoint[i].wMaxPacketSize;
244 } else {
245 ctx->out_ep = descriptor->endpoint[i].bEndpointAddress;
246 }
247 }
248
249 if (ctx->in_ep == 0 || ctx->out_ep == 0)
250 goto desc_error;
251
252 libusb_free_config_descriptor(config0);
253 return true;
254
255 desc_error:
256 LOG_ERROR("unrecognized USB device descriptor");
257 error:
258 libusb_free_config_descriptor(config0);
259 libusb_close(ctx->usb_dev);
260 return false;
261 }
262
263 struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, const char *description,
264 const char *serial, int channel)
265 {
266 struct mpsse_ctx *ctx = calloc(1, sizeof(*ctx));
267 int err;
268
269 if (!ctx)
270 return 0;
271
272 bit_copy_queue_init(&ctx->read_queue);
273 ctx->read_chunk_size = 16384;
274 ctx->read_size = 16384;
275 ctx->write_size = 16384;
276 ctx->read_chunk = malloc(ctx->read_chunk_size);
277 ctx->read_buffer = malloc(ctx->read_size);
278 ctx->write_buffer = malloc(ctx->write_size);
279 if (!ctx->read_chunk || !ctx->read_buffer || !ctx->write_buffer)
280 goto error;
281
282 ctx->interface = channel;
283 ctx->index = channel + 1;
284 ctx->usb_read_timeout = 5000;
285 ctx->usb_write_timeout = 5000;
286
287 err = libusb_init(&ctx->usb_ctx);
288 if (err != LIBUSB_SUCCESS) {
289 LOG_ERROR("libusb_init() failed with %d", err);
290 goto error;
291 }
292
293 if (!open_matching_device(ctx, vid, pid, description, serial)) {
294 /* Four hex digits plus terminating zero each */
295 char vidstr[5];
296 char pidstr[5];
297 LOG_ERROR("unable to open ftdi device with vid %s, pid %s, description '%s' and "
298 "serial '%s'",
299 vid ? sprintf(vidstr, "%04x", *vid), vidstr : "*",
300 pid ? sprintf(pidstr, "%04x", *pid), pidstr : "*",
301 description ? description : "*",
302 serial ? serial : "*");
303 ctx->usb_dev = 0;
304 goto error;
305 }
306
307 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
308 SIO_SET_LATENCY_TIMER_REQUEST, 255, ctx->index, NULL, 0,
309 ctx->usb_write_timeout);
310 if (err < 0) {
311 LOG_ERROR("unable to set latency timer: %d", err);
312 goto error;
313 }
314
315 err = libusb_control_transfer(ctx->usb_dev,
316 FTDI_DEVICE_OUT_REQTYPE,
317 SIO_SET_BITMODE_REQUEST,
318 0x0b | (BITMODE_MPSSE << 8),
319 ctx->index,
320 NULL,
321 0,
322 ctx->usb_write_timeout);
323 if (err < 0) {
324 LOG_ERROR("unable to set MPSSE bitmode: %d", err);
325 goto error;
326 }
327
328 mpsse_purge(ctx);
329
330 return ctx;
331 error:
332 mpsse_close(ctx);
333 return 0;
334 }
335
336 void mpsse_close(struct mpsse_ctx *ctx)
337 {
338 if (ctx->usb_dev)
339 libusb_close(ctx->usb_dev);
340 if (ctx->usb_ctx)
341 libusb_exit(ctx->usb_ctx);
342 bit_copy_discard(&ctx->read_queue);
343 if (ctx->write_buffer)
344 free(ctx->write_buffer);
345 if (ctx->read_buffer)
346 free(ctx->read_buffer);
347 if (ctx->read_chunk)
348 free(ctx->read_chunk);
349
350 free(ctx);
351 }
352
353 bool mpsse_is_high_speed(struct mpsse_ctx *ctx)
354 {
355 return ctx->type != TYPE_FT2232C;
356 }
357
358 void mpsse_purge(struct mpsse_ctx *ctx)
359 {
360 int err;
361 LOG_DEBUG("-");
362 ctx->write_count = 0;
363 ctx->read_count = 0;
364 bit_copy_discard(&ctx->read_queue);
365 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
366 SIO_RESET_PURGE_RX, ctx->index, NULL, 0, ctx->usb_write_timeout);
367 if (err < 0) {
368 LOG_ERROR("unable to purge ftdi rx buffers: %d", err);
369 return;
370 }
371
372 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
373 SIO_RESET_PURGE_TX, ctx->index, NULL, 0, ctx->usb_write_timeout);
374 if (err < 0) {
375 LOG_ERROR("unable to purge ftdi tx buffers: %d", err);
376 return;
377 }
378 }
379
380 static unsigned buffer_write_space(struct mpsse_ctx *ctx)
381 {
382 /* Reserve one byte for SEND_IMMEDIATE */
383 return ctx->write_size - ctx->write_count - 1;
384 }
385
386 static unsigned buffer_read_space(struct mpsse_ctx *ctx)
387 {
388 return ctx->read_size - ctx->read_count;
389 }
390
391 static void buffer_write_byte(struct mpsse_ctx *ctx, uint8_t data)
392 {
393 DEBUG_IO("%02x", data);
394 assert(ctx->write_count < ctx->write_size);
395 ctx->write_buffer[ctx->write_count++] = data;
396 }
397
398 static unsigned buffer_write(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
399 unsigned bit_count)
400 {
401 DEBUG_IO("%d bits", bit_count);
402 assert(ctx->write_count + DIV_ROUND_UP(bit_count, 8) <= ctx->write_size);
403 bit_copy(ctx->write_buffer + ctx->write_count, 0, out, out_offset, bit_count);
404 ctx->write_count += DIV_ROUND_UP(bit_count, 8);
405 return bit_count;
406 }
407
408 static unsigned buffer_add_read(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset,
409 unsigned bit_count, unsigned offset)
410 {
411 DEBUG_IO("%d bits, offset %d", bit_count, offset);
412 assert(ctx->read_count + DIV_ROUND_UP(bit_count, 8) <= ctx->read_size);
413 bit_copy_queued(&ctx->read_queue, in, in_offset, ctx->read_buffer + ctx->read_count, offset,
414 bit_count);
415 ctx->read_count += DIV_ROUND_UP(bit_count, 8);
416 return bit_count;
417 }
418
419 int mpsse_clock_data_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
420 unsigned length, uint8_t mode)
421 {
422 return mpsse_clock_data(ctx, out, out_offset, 0, 0, length, mode);
423 }
424
425 int mpsse_clock_data_in(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset, unsigned length,
426 uint8_t mode)
427 {
428 return mpsse_clock_data(ctx, 0, 0, in, in_offset, length, mode);
429 }
430
431 int mpsse_clock_data(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
432 unsigned in_offset, unsigned length, uint8_t mode)
433 {
434 /* TODO: Fix MSB first modes */
435 DEBUG_IO("%s%s %d bits", in ? "in" : "", out ? "out" : "", length);
436 int retval = ERROR_OK;
437
438 /* TODO: On H chips, use command 0x8E/0x8F if in and out are both 0 */
439 if (out || (!out && !in))
440 mode |= 0x10;
441 if (in)
442 mode |= 0x20;
443
444 while (length > 0) {
445 /* Guarantee buffer space enough for a minimum size transfer */
446 if (buffer_write_space(ctx) + (length < 8) < (out || (!out && !in) ? 4 : 3)
447 || (in && buffer_read_space(ctx) < 1))
448 retval = mpsse_flush(ctx);
449
450 if (length < 8) {
451 /* Transfer remaining bits in bit mode */
452 buffer_write_byte(ctx, 0x02 | mode);
453 buffer_write_byte(ctx, length - 1);
454 if (out)
455 out_offset += buffer_write(ctx, out, out_offset, length);
456 if (in)
457 in_offset += buffer_add_read(ctx, in, in_offset, length, 8 - length);
458 if (!out && !in)
459 buffer_write_byte(ctx, 0x00);
460 length = 0;
461 } else {
462 /* Byte transfer */
463 unsigned this_bytes = length / 8;
464 /* MPSSE command limit */
465 if (this_bytes > 65536)
466 this_bytes = 65536;
467 /* Buffer space limit. We already made sure there's space for the minimum
468 * transfer. */
469 if ((out || (!out && !in)) && this_bytes + 3 > buffer_write_space(ctx))
470 this_bytes = buffer_write_space(ctx) - 3;
471 if (in && this_bytes > buffer_read_space(ctx))
472 this_bytes = buffer_read_space(ctx);
473
474 if (this_bytes > 0) {
475 buffer_write_byte(ctx, mode);
476 buffer_write_byte(ctx, (this_bytes - 1) & 0xff);
477 buffer_write_byte(ctx, (this_bytes - 1) >> 8);
478 if (out)
479 out_offset += buffer_write(ctx,
480 out,
481 out_offset,
482 this_bytes * 8);
483 if (in)
484 in_offset += buffer_add_read(ctx,
485 in,
486 in_offset,
487 this_bytes * 8,
488 0);
489 if (!out && !in)
490 for (unsigned n = 0; n < this_bytes; n++)
491 buffer_write_byte(ctx, 0x00);
492 length -= this_bytes * 8;
493 }
494 }
495 }
496 return retval;
497 }
498
499 int mpsse_clock_tms_cs_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
500 unsigned length, bool tdi, uint8_t mode)
501 {
502 return mpsse_clock_tms_cs(ctx, out, out_offset, 0, 0, length, tdi, mode);
503 }
504
505 int mpsse_clock_tms_cs(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
506 unsigned in_offset, unsigned length, bool tdi, uint8_t mode)
507 {
508 DEBUG_IO("%sout %d bits, tdi=%d", in ? "in" : "", length, tdi);
509 assert(out);
510 int retval = ERROR_OK;
511
512 mode |= 0x42;
513 if (in)
514 mode |= 0x20;
515
516 while (length > 0) {
517 /* Guarantee buffer space enough for a minimum size transfer */
518 if (buffer_write_space(ctx) < 3 || (in && buffer_read_space(ctx) < 1))
519 retval = mpsse_flush(ctx);
520
521 /* Byte transfer */
522 unsigned this_bits = length;
523 /* MPSSE command limit */
524 /* NOTE: there's a report of an FT2232 bug in this area, where shifting
525 * exactly 7 bits can make problems with TMS signaling for the last
526 * clock cycle:
527 *
528 * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
529 */
530 if (this_bits > 7)
531 this_bits = 7;
532
533 if (this_bits > 0) {
534 buffer_write_byte(ctx, mode);
535 buffer_write_byte(ctx, this_bits - 1);
536 uint8_t data = 0;
537 /* TODO: Fix MSB first, if allowed in MPSSE */
538 bit_copy(&data, 0, out, out_offset, this_bits);
539 out_offset += this_bits;
540 buffer_write_byte(ctx, data | (tdi ? 0x80 : 0x00));
541 if (in)
542 in_offset += buffer_add_read(ctx,
543 in,
544 in_offset,
545 this_bits,
546 8 - this_bits);
547 length -= this_bits;
548 }
549 }
550 return retval;
551 }
552
553 int mpsse_set_data_bits_low_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
554 {
555 DEBUG_IO("-");
556 int retval = ERROR_OK;
557
558 if (buffer_write_space(ctx) < 3)
559 retval = mpsse_flush(ctx);
560
561 buffer_write_byte(ctx, 0x80);
562 buffer_write_byte(ctx, data);
563 buffer_write_byte(ctx, dir);
564
565 return retval;
566 }
567
568 int mpsse_set_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
569 {
570 DEBUG_IO("-");
571 int retval = ERROR_OK;
572
573 if (buffer_write_space(ctx) < 3)
574 retval = mpsse_flush(ctx);
575
576 buffer_write_byte(ctx, 0x82);
577 buffer_write_byte(ctx, data);
578 buffer_write_byte(ctx, dir);
579
580 return retval;
581 }
582
583 int mpsse_read_data_bits_low_byte(struct mpsse_ctx *ctx, uint8_t *data)
584 {
585 DEBUG_IO("-");
586 int retval = ERROR_OK;
587
588 if (buffer_write_space(ctx) < 1)
589 retval = mpsse_flush(ctx);
590
591 buffer_write_byte(ctx, 0x81);
592 buffer_add_read(ctx, data, 0, 8, 0);
593
594 return retval;
595 }
596
597 int mpsse_read_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t *data)
598 {
599 DEBUG_IO("-");
600 int retval = ERROR_OK;
601
602 if (buffer_write_space(ctx) < 1)
603 retval = mpsse_flush(ctx);
604
605 buffer_write_byte(ctx, 0x83);
606 buffer_add_read(ctx, data, 0, 8, 0);
607
608 return retval;
609 }
610
611 static int single_byte_boolean_helper(struct mpsse_ctx *ctx, bool var, uint8_t val_if_true,
612 uint8_t val_if_false)
613 {
614 int retval = ERROR_OK;
615
616 if (buffer_write_space(ctx) < 1)
617 retval = mpsse_flush(ctx);
618
619 buffer_write_byte(ctx, var ? val_if_true : val_if_false);
620
621 return retval;
622 }
623
624 int mpsse_loopback_config(struct mpsse_ctx *ctx, bool enable)
625 {
626 LOG_DEBUG("%s", enable ? "on" : "off");
627 return single_byte_boolean_helper(ctx, enable, 0x84, 0x85);
628 }
629
630 int mpsse_set_divisor(struct mpsse_ctx *ctx, uint16_t divisor)
631 {
632 LOG_DEBUG("%d", divisor);
633 int retval = ERROR_OK;
634
635 if (buffer_write_space(ctx) < 3)
636 retval = mpsse_flush(ctx);
637
638 buffer_write_byte(ctx, 0x86);
639 buffer_write_byte(ctx, divisor & 0xff);
640 buffer_write_byte(ctx, divisor >> 8);
641
642 return retval;
643 }
644
645 int mpsse_divide_by_5_config(struct mpsse_ctx *ctx, bool enable)
646 {
647 if (!mpsse_is_high_speed(ctx))
648 return ERROR_FAIL;
649
650 LOG_DEBUG("%s", enable ? "on" : "off");
651
652 return single_byte_boolean_helper(ctx, enable, 0x8b, 0x8a);
653 }
654
655 int mpsse_rtck_config(struct mpsse_ctx *ctx, bool enable)
656 {
657 if (!mpsse_is_high_speed(ctx))
658 return ERROR_FAIL;
659
660 LOG_DEBUG("%s", enable ? "on" : "off");
661
662 return single_byte_boolean_helper(ctx, enable, 0x96, 0x97);
663 }
664
665 int mpsse_set_frequency(struct mpsse_ctx *ctx, int frequency)
666 {
667 LOG_DEBUG("target %d Hz", frequency);
668 assert(frequency >= 0);
669 int base_clock;
670
671 if (frequency == 0)
672 return mpsse_rtck_config(ctx, true);
673
674 mpsse_rtck_config(ctx, false); /* just try */
675
676 if (frequency > 60000000 / 2 / 65536 && mpsse_is_high_speed(ctx)) {
677 int retval = mpsse_divide_by_5_config(ctx, false);
678 if (retval != ERROR_OK)
679 return retval;
680 base_clock = 60000000;
681 } else {
682 mpsse_divide_by_5_config(ctx, true); /* just try */
683 base_clock = 12000000;
684 }
685
686 int divisor = (base_clock / 2 + frequency - 1) / frequency - 1;
687 if (divisor > 65535)
688 divisor = 65535;
689 assert(divisor >= 0);
690
691 int retval = mpsse_set_divisor(ctx, divisor);
692 if (retval != ERROR_OK)
693 return retval;
694
695 frequency = base_clock / 2 / (1 + divisor);
696 LOG_DEBUG("actually %d Hz", frequency);
697
698 return frequency;
699 }
700
701 /* Context needed by the callbacks */
702 struct transfer_result {
703 struct mpsse_ctx *ctx;
704 bool done;
705 unsigned transferred;
706 };
707
708 static LIBUSB_CALL void read_cb(struct libusb_transfer *transfer)
709 {
710 struct transfer_result *res = (struct transfer_result *)transfer->user_data;
711 struct mpsse_ctx *ctx = res->ctx;
712
713 unsigned packet_size = ctx->max_packet_size;
714
715 DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
716
717 /* Strip the two status bytes sent at the beginning of each USB packet
718 * while copying the chunk buffer to the read buffer */
719 unsigned num_packets = DIV_ROUND_UP(transfer->actual_length, packet_size);
720 unsigned chunk_remains = transfer->actual_length;
721 for (unsigned i = 0; i < num_packets && chunk_remains > 2; i++) {
722 unsigned this_size = packet_size - 2;
723 if (this_size > chunk_remains - 2)
724 this_size = chunk_remains - 2;
725 if (this_size > ctx->read_count - res->transferred)
726 this_size = ctx->read_count - res->transferred;
727 memcpy(ctx->read_buffer + res->transferred,
728 ctx->read_chunk + packet_size * i + 2,
729 this_size);
730 res->transferred += this_size;
731 chunk_remains -= this_size + 2;
732 if (res->transferred == ctx->read_count) {
733 res->done = true;
734 break;
735 }
736 }
737
738 DEBUG_IO("raw chunk %d, transferred %d of %d", transfer->actual_length, res->transferred,
739 ctx->read_count);
740
741 if (!res->done)
742 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
743 res->done = true;
744 }
745
746 static LIBUSB_CALL void write_cb(struct libusb_transfer *transfer)
747 {
748 struct transfer_result *res = (struct transfer_result *)transfer->user_data;
749 struct mpsse_ctx *ctx = res->ctx;
750
751 res->transferred += transfer->actual_length;
752
753 DEBUG_IO("transferred %d of %d", res->transferred, ctx->write_count);
754
755 DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
756
757 if (res->transferred == ctx->write_count)
758 res->done = true;
759 else {
760 transfer->length = ctx->write_count - res->transferred;
761 transfer->buffer = ctx->write_buffer + res->transferred;
762 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
763 res->done = true;
764 }
765 }
766
767 int mpsse_flush(struct mpsse_ctx *ctx)
768 {
769 DEBUG_IO("write %d%s, read %d", ctx->write_count, ctx->read_count ? "+1" : "",
770 ctx->read_count);
771 assert(ctx->write_count > 0 || ctx->read_count == 0); /* No read data without write data */
772 int retval = ERROR_OK;
773
774 if (ctx->write_count == 0)
775 return retval;
776
777 struct libusb_transfer *read_transfer = 0;
778 struct transfer_result read_result = { .ctx = ctx, .done = true };
779 if (ctx->read_count) {
780 buffer_write_byte(ctx, 0x87); /* SEND_IMMEDIATE */
781 read_result.done = false;
782 read_transfer = libusb_alloc_transfer(0);
783 libusb_fill_bulk_transfer(read_transfer, ctx->usb_dev, ctx->in_ep, ctx->read_chunk,
784 ctx->read_chunk_size, read_cb, &read_result,
785 ctx->usb_read_timeout);
786 retval = libusb_submit_transfer(read_transfer);
787 }
788
789 struct transfer_result write_result = { .ctx = ctx, .done = false };
790 struct libusb_transfer *write_transfer = libusb_alloc_transfer(0);
791 libusb_fill_bulk_transfer(write_transfer, ctx->usb_dev, ctx->out_ep, ctx->write_buffer,
792 ctx->write_count, write_cb, &write_result, ctx->usb_write_timeout);
793 retval = libusb_submit_transfer(write_transfer);
794
795 /* Polling loop, more or less taken from libftdi */
796 while (!write_result.done || !read_result.done) {
797 retval = libusb_handle_events(ctx->usb_ctx);
798 keep_alive();
799 if (retval != LIBUSB_SUCCESS && retval != LIBUSB_ERROR_INTERRUPTED) {
800 libusb_cancel_transfer(write_transfer);
801 if (read_transfer)
802 libusb_cancel_transfer(read_transfer);
803 while (!write_result.done || !read_result.done)
804 if (libusb_handle_events(ctx->usb_ctx) != LIBUSB_SUCCESS)
805 break;
806 }
807 }
808
809 if (retval != LIBUSB_SUCCESS) {
810 LOG_ERROR("libusb_handle_events() failed with %d", retval);
811 retval = ERROR_FAIL;
812 } else if (write_result.transferred < ctx->write_count) {
813 LOG_ERROR("ftdi device did not accept all data: %d, tried %d",
814 write_result.transferred,
815 ctx->write_count);
816 retval = ERROR_FAIL;
817 } else if (read_result.transferred < ctx->read_count) {
818 LOG_ERROR("ftdi device did not return all data: %d, expected %d",
819 read_result.transferred,
820 ctx->read_count);
821 retval = ERROR_FAIL;
822 } else if (ctx->read_count) {
823 ctx->write_count = 0;
824 ctx->read_count = 0;
825 bit_copy_execute(&ctx->read_queue);
826 retval = ERROR_OK;
827 } else {
828 ctx->write_count = 0;
829 bit_copy_discard(&ctx->read_queue);
830 retval = ERROR_OK;
831 }
832
833 libusb_free_transfer(write_transfer);
834 if (read_transfer)
835 libusb_free_transfer(read_transfer);
836
837 if (retval != ERROR_OK)
838 mpsse_purge(ctx);
839
840 return retval;
841 }

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)