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_RESET 0x00
59 #define BITMODE_MPSSE 0x02
60
61 #define SIO_RESET_REQUEST 0x00
62 #define SIO_SET_LATENCY_TIMER_REQUEST 0x09
63 #define SIO_GET_LATENCY_TIMER_REQUEST 0x0A
64 #define SIO_SET_BITMODE_REQUEST 0x0B
65
66 #define SIO_RESET_SIO 0
67 #define SIO_RESET_PURGE_RX 1
68 #define SIO_RESET_PURGE_TX 2
69
70 struct mpsse_ctx {
71 libusb_context *usb_ctx;
72 libusb_device_handle *usb_dev;
73 unsigned int usb_write_timeout;
74 unsigned int usb_read_timeout;
75 uint8_t in_ep;
76 uint8_t out_ep;
77 uint16_t max_packet_size;
78 uint16_t index;
79 uint8_t interface;
80 enum ftdi_chip_type type;
81 uint8_t *write_buffer;
82 unsigned write_size;
83 unsigned write_count;
84 uint8_t *read_buffer;
85 unsigned read_size;
86 unsigned read_count;
87 uint8_t *read_chunk;
88 unsigned read_chunk_size;
89 struct bit_copy_queue read_queue;
90 };
91
92 /* Returns true if the string descriptor indexed by str_index in device matches string */
93 static bool string_descriptor_equal(libusb_device_handle *device, uint8_t str_index,
94 const char *string)
95 {
96 int retval;
97 char desc_string[256]; /* Max size of string descriptor */
98 retval = libusb_get_string_descriptor_ascii(device, str_index, (unsigned char *)desc_string,
99 sizeof(desc_string));
100 if (retval < 0) {
101 LOG_ERROR("libusb_get_string_descriptor_ascii() failed with %d", retval);
102 return false;
103 }
104 return strncmp(string, desc_string, sizeof(desc_string)) == 0;
105 }
106
107 /* Helper to open a libusb device that matches vid, pid, product string and/or serial string.
108 * Set any field to 0 as a wildcard. If the device is found true is returned, with ctx containing
109 * the already opened handle. ctx->interface must be set to the desired interface (channel) number
110 * prior to calling this function. */
111 static bool open_matching_device(struct mpsse_ctx *ctx, const uint16_t *vid, const uint16_t *pid,
112 const char *product, const char *serial)
113 {
114 libusb_device **list;
115 struct libusb_device_descriptor desc;
116 struct libusb_config_descriptor *config0;
117 int err;
118 bool found = false;
119 ssize_t cnt = libusb_get_device_list(ctx->usb_ctx, &list);
120 if (cnt < 0)
121 LOG_ERROR("libusb_get_device_list() failed with %zi", cnt);
122
123 for (ssize_t i = 0; i < cnt; i++) {
124 libusb_device *device = list[i];
125
126 err = libusb_get_device_descriptor(device, &desc);
127 if (err != LIBUSB_SUCCESS) {
128 LOG_ERROR("libusb_get_device_descriptor() failed with %d", err);
129 continue;
130 }
131
132 if (vid && *vid != desc.idVendor)
133 continue;
134 if (pid && *pid != desc.idProduct)
135 continue;
136
137 err = libusb_open(device, &ctx->usb_dev);
138 if (err != LIBUSB_SUCCESS) {
139 LOG_ERROR("libusb_open() failed with %d", 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_RESET << 8),
320 ctx->index,
321 NULL,
322 0,
323 ctx->usb_write_timeout);
324 if (err < 0) {
325 LOG_ERROR("unable to reset bitmode: %d", err);
326 goto error;
327 }
328
329 err = libusb_control_transfer(ctx->usb_dev,
330 FTDI_DEVICE_OUT_REQTYPE,
331 SIO_SET_BITMODE_REQUEST,
332 0x0b | (BITMODE_MPSSE << 8),
333 ctx->index,
334 NULL,
335 0,
336 ctx->usb_write_timeout);
337 if (err < 0) {
338 LOG_ERROR("unable to set MPSSE bitmode: %d", err);
339 goto error;
340 }
341
342 mpsse_purge(ctx);
343
344 return ctx;
345 error:
346 mpsse_close(ctx);
347 return 0;
348 }
349
350 void mpsse_close(struct mpsse_ctx *ctx)
351 {
352 if (ctx->usb_dev)
353 libusb_close(ctx->usb_dev);
354 if (ctx->usb_ctx)
355 libusb_exit(ctx->usb_ctx);
356 bit_copy_discard(&ctx->read_queue);
357 if (ctx->write_buffer)
358 free(ctx->write_buffer);
359 if (ctx->read_buffer)
360 free(ctx->read_buffer);
361 if (ctx->read_chunk)
362 free(ctx->read_chunk);
363
364 free(ctx);
365 }
366
367 bool mpsse_is_high_speed(struct mpsse_ctx *ctx)
368 {
369 return ctx->type != TYPE_FT2232C;
370 }
371
372 void mpsse_purge(struct mpsse_ctx *ctx)
373 {
374 int err;
375 LOG_DEBUG("-");
376 ctx->write_count = 0;
377 ctx->read_count = 0;
378 bit_copy_discard(&ctx->read_queue);
379 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
380 SIO_RESET_PURGE_RX, ctx->index, NULL, 0, ctx->usb_write_timeout);
381 if (err < 0) {
382 LOG_ERROR("unable to purge ftdi rx buffers: %d", err);
383 return;
384 }
385
386 err = libusb_control_transfer(ctx->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
387 SIO_RESET_PURGE_TX, ctx->index, NULL, 0, ctx->usb_write_timeout);
388 if (err < 0) {
389 LOG_ERROR("unable to purge ftdi tx buffers: %d", err);
390 return;
391 }
392 }
393
394 static unsigned buffer_write_space(struct mpsse_ctx *ctx)
395 {
396 /* Reserve one byte for SEND_IMMEDIATE */
397 return ctx->write_size - ctx->write_count - 1;
398 }
399
400 static unsigned buffer_read_space(struct mpsse_ctx *ctx)
401 {
402 return ctx->read_size - ctx->read_count;
403 }
404
405 static void buffer_write_byte(struct mpsse_ctx *ctx, uint8_t data)
406 {
407 DEBUG_IO("%02x", data);
408 assert(ctx->write_count < ctx->write_size);
409 ctx->write_buffer[ctx->write_count++] = data;
410 }
411
412 static unsigned buffer_write(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
413 unsigned bit_count)
414 {
415 DEBUG_IO("%d bits", bit_count);
416 assert(ctx->write_count + DIV_ROUND_UP(bit_count, 8) <= ctx->write_size);
417 bit_copy(ctx->write_buffer + ctx->write_count, 0, out, out_offset, bit_count);
418 ctx->write_count += DIV_ROUND_UP(bit_count, 8);
419 return bit_count;
420 }
421
422 static unsigned buffer_add_read(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset,
423 unsigned bit_count, unsigned offset)
424 {
425 DEBUG_IO("%d bits, offset %d", bit_count, offset);
426 assert(ctx->read_count + DIV_ROUND_UP(bit_count, 8) <= ctx->read_size);
427 bit_copy_queued(&ctx->read_queue, in, in_offset, ctx->read_buffer + ctx->read_count, offset,
428 bit_count);
429 ctx->read_count += DIV_ROUND_UP(bit_count, 8);
430 return bit_count;
431 }
432
433 int mpsse_clock_data_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
434 unsigned length, uint8_t mode)
435 {
436 return mpsse_clock_data(ctx, out, out_offset, 0, 0, length, mode);
437 }
438
439 int mpsse_clock_data_in(struct mpsse_ctx *ctx, uint8_t *in, unsigned in_offset, unsigned length,
440 uint8_t mode)
441 {
442 return mpsse_clock_data(ctx, 0, 0, in, in_offset, length, mode);
443 }
444
445 int mpsse_clock_data(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
446 unsigned in_offset, unsigned length, uint8_t mode)
447 {
448 /* TODO: Fix MSB first modes */
449 DEBUG_IO("%s%s %d bits", in ? "in" : "", out ? "out" : "", length);
450 int retval = ERROR_OK;
451
452 /* TODO: On H chips, use command 0x8E/0x8F if in and out are both 0 */
453 if (out || (!out && !in))
454 mode |= 0x10;
455 if (in)
456 mode |= 0x20;
457
458 while (length > 0) {
459 /* Guarantee buffer space enough for a minimum size transfer */
460 if (buffer_write_space(ctx) + (length < 8) < (out || (!out && !in) ? 4 : 3)
461 || (in && buffer_read_space(ctx) < 1))
462 retval = mpsse_flush(ctx);
463
464 if (length < 8) {
465 /* Transfer remaining bits in bit mode */
466 buffer_write_byte(ctx, 0x02 | mode);
467 buffer_write_byte(ctx, length - 1);
468 if (out)
469 out_offset += buffer_write(ctx, out, out_offset, length);
470 if (in)
471 in_offset += buffer_add_read(ctx, in, in_offset, length, 8 - length);
472 if (!out && !in)
473 buffer_write_byte(ctx, 0x00);
474 length = 0;
475 } else {
476 /* Byte transfer */
477 unsigned this_bytes = length / 8;
478 /* MPSSE command limit */
479 if (this_bytes > 65536)
480 this_bytes = 65536;
481 /* Buffer space limit. We already made sure there's space for the minimum
482 * transfer. */
483 if ((out || (!out && !in)) && this_bytes + 3 > buffer_write_space(ctx))
484 this_bytes = buffer_write_space(ctx) - 3;
485 if (in && this_bytes > buffer_read_space(ctx))
486 this_bytes = buffer_read_space(ctx);
487
488 if (this_bytes > 0) {
489 buffer_write_byte(ctx, mode);
490 buffer_write_byte(ctx, (this_bytes - 1) & 0xff);
491 buffer_write_byte(ctx, (this_bytes - 1) >> 8);
492 if (out)
493 out_offset += buffer_write(ctx,
494 out,
495 out_offset,
496 this_bytes * 8);
497 if (in)
498 in_offset += buffer_add_read(ctx,
499 in,
500 in_offset,
501 this_bytes * 8,
502 0);
503 if (!out && !in)
504 for (unsigned n = 0; n < this_bytes; n++)
505 buffer_write_byte(ctx, 0x00);
506 length -= this_bytes * 8;
507 }
508 }
509 }
510 return retval;
511 }
512
513 int mpsse_clock_tms_cs_out(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset,
514 unsigned length, bool tdi, uint8_t mode)
515 {
516 return mpsse_clock_tms_cs(ctx, out, out_offset, 0, 0, length, tdi, mode);
517 }
518
519 int mpsse_clock_tms_cs(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_offset, uint8_t *in,
520 unsigned in_offset, unsigned length, bool tdi, uint8_t mode)
521 {
522 DEBUG_IO("%sout %d bits, tdi=%d", in ? "in" : "", length, tdi);
523 assert(out);
524 int retval = ERROR_OK;
525
526 mode |= 0x42;
527 if (in)
528 mode |= 0x20;
529
530 while (length > 0) {
531 /* Guarantee buffer space enough for a minimum size transfer */
532 if (buffer_write_space(ctx) < 3 || (in && buffer_read_space(ctx) < 1))
533 retval = mpsse_flush(ctx);
534
535 /* Byte transfer */
536 unsigned this_bits = length;
537 /* MPSSE command limit */
538 /* NOTE: there's a report of an FT2232 bug in this area, where shifting
539 * exactly 7 bits can make problems with TMS signaling for the last
540 * clock cycle:
541 *
542 * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
543 */
544 if (this_bits > 7)
545 this_bits = 7;
546
547 if (this_bits > 0) {
548 buffer_write_byte(ctx, mode);
549 buffer_write_byte(ctx, this_bits - 1);
550 uint8_t data = 0;
551 /* TODO: Fix MSB first, if allowed in MPSSE */
552 bit_copy(&data, 0, out, out_offset, this_bits);
553 out_offset += this_bits;
554 buffer_write_byte(ctx, data | (tdi ? 0x80 : 0x00));
555 if (in)
556 in_offset += buffer_add_read(ctx,
557 in,
558 in_offset,
559 this_bits,
560 8 - this_bits);
561 length -= this_bits;
562 }
563 }
564 return retval;
565 }
566
567 int mpsse_set_data_bits_low_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
568 {
569 DEBUG_IO("-");
570 int retval = ERROR_OK;
571
572 if (buffer_write_space(ctx) < 3)
573 retval = mpsse_flush(ctx);
574
575 buffer_write_byte(ctx, 0x80);
576 buffer_write_byte(ctx, data);
577 buffer_write_byte(ctx, dir);
578
579 return retval;
580 }
581
582 int mpsse_set_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t data, uint8_t dir)
583 {
584 DEBUG_IO("-");
585 int retval = ERROR_OK;
586
587 if (buffer_write_space(ctx) < 3)
588 retval = mpsse_flush(ctx);
589
590 buffer_write_byte(ctx, 0x82);
591 buffer_write_byte(ctx, data);
592 buffer_write_byte(ctx, dir);
593
594 return retval;
595 }
596
597 int mpsse_read_data_bits_low_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, 0x81);
606 buffer_add_read(ctx, data, 0, 8, 0);
607
608 return retval;
609 }
610
611 int mpsse_read_data_bits_high_byte(struct mpsse_ctx *ctx, uint8_t *data)
612 {
613 DEBUG_IO("-");
614 int retval = ERROR_OK;
615
616 if (buffer_write_space(ctx) < 1)
617 retval = mpsse_flush(ctx);
618
619 buffer_write_byte(ctx, 0x83);
620 buffer_add_read(ctx, data, 0, 8, 0);
621
622 return retval;
623 }
624
625 static int single_byte_boolean_helper(struct mpsse_ctx *ctx, bool var, uint8_t val_if_true,
626 uint8_t val_if_false)
627 {
628 int retval = ERROR_OK;
629
630 if (buffer_write_space(ctx) < 1)
631 retval = mpsse_flush(ctx);
632
633 buffer_write_byte(ctx, var ? val_if_true : val_if_false);
634
635 return retval;
636 }
637
638 int mpsse_loopback_config(struct mpsse_ctx *ctx, bool enable)
639 {
640 LOG_DEBUG("%s", enable ? "on" : "off");
641 return single_byte_boolean_helper(ctx, enable, 0x84, 0x85);
642 }
643
644 int mpsse_set_divisor(struct mpsse_ctx *ctx, uint16_t divisor)
645 {
646 LOG_DEBUG("%d", divisor);
647 int retval = ERROR_OK;
648
649 if (buffer_write_space(ctx) < 3)
650 retval = mpsse_flush(ctx);
651
652 buffer_write_byte(ctx, 0x86);
653 buffer_write_byte(ctx, divisor & 0xff);
654 buffer_write_byte(ctx, divisor >> 8);
655
656 return retval;
657 }
658
659 int mpsse_divide_by_5_config(struct mpsse_ctx *ctx, bool enable)
660 {
661 if (!mpsse_is_high_speed(ctx))
662 return ERROR_FAIL;
663
664 LOG_DEBUG("%s", enable ? "on" : "off");
665
666 return single_byte_boolean_helper(ctx, enable, 0x8b, 0x8a);
667 }
668
669 int mpsse_rtck_config(struct mpsse_ctx *ctx, bool enable)
670 {
671 if (!mpsse_is_high_speed(ctx))
672 return ERROR_FAIL;
673
674 LOG_DEBUG("%s", enable ? "on" : "off");
675
676 return single_byte_boolean_helper(ctx, enable, 0x96, 0x97);
677 }
678
679 int mpsse_set_frequency(struct mpsse_ctx *ctx, int frequency)
680 {
681 LOG_DEBUG("target %d Hz", frequency);
682 assert(frequency >= 0);
683 int base_clock;
684
685 if (frequency == 0)
686 return mpsse_rtck_config(ctx, true);
687
688 mpsse_rtck_config(ctx, false); /* just try */
689
690 if (frequency > 60000000 / 2 / 65536 && mpsse_is_high_speed(ctx)) {
691 int retval = mpsse_divide_by_5_config(ctx, false);
692 if (retval != ERROR_OK)
693 return retval;
694 base_clock = 60000000;
695 } else {
696 mpsse_divide_by_5_config(ctx, true); /* just try */
697 base_clock = 12000000;
698 }
699
700 int divisor = (base_clock / 2 + frequency - 1) / frequency - 1;
701 if (divisor > 65535)
702 divisor = 65535;
703 assert(divisor >= 0);
704
705 int retval = mpsse_set_divisor(ctx, divisor);
706 if (retval != ERROR_OK)
707 return retval;
708
709 frequency = base_clock / 2 / (1 + divisor);
710 LOG_DEBUG("actually %d Hz", frequency);
711
712 return frequency;
713 }
714
715 /* Context needed by the callbacks */
716 struct transfer_result {
717 struct mpsse_ctx *ctx;
718 bool done;
719 unsigned transferred;
720 };
721
722 static LIBUSB_CALL void read_cb(struct libusb_transfer *transfer)
723 {
724 struct transfer_result *res = (struct transfer_result *)transfer->user_data;
725 struct mpsse_ctx *ctx = res->ctx;
726
727 unsigned packet_size = ctx->max_packet_size;
728
729 DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
730
731 /* Strip the two status bytes sent at the beginning of each USB packet
732 * while copying the chunk buffer to the read buffer */
733 unsigned num_packets = DIV_ROUND_UP(transfer->actual_length, packet_size);
734 unsigned chunk_remains = transfer->actual_length;
735 for (unsigned i = 0; i < num_packets && chunk_remains > 2; i++) {
736 unsigned this_size = packet_size - 2;
737 if (this_size > chunk_remains - 2)
738 this_size = chunk_remains - 2;
739 if (this_size > ctx->read_count - res->transferred)
740 this_size = ctx->read_count - res->transferred;
741 memcpy(ctx->read_buffer + res->transferred,
742 ctx->read_chunk + packet_size * i + 2,
743 this_size);
744 res->transferred += this_size;
745 chunk_remains -= this_size + 2;
746 if (res->transferred == ctx->read_count) {
747 res->done = true;
748 break;
749 }
750 }
751
752 DEBUG_IO("raw chunk %d, transferred %d of %d", transfer->actual_length, res->transferred,
753 ctx->read_count);
754
755 if (!res->done)
756 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
757 res->done = true;
758 }
759
760 static LIBUSB_CALL void write_cb(struct libusb_transfer *transfer)
761 {
762 struct transfer_result *res = (struct transfer_result *)transfer->user_data;
763 struct mpsse_ctx *ctx = res->ctx;
764
765 res->transferred += transfer->actual_length;
766
767 DEBUG_IO("transferred %d of %d", res->transferred, ctx->write_count);
768
769 DEBUG_PRINT_BUF(transfer->buffer, transfer->actual_length);
770
771 if (res->transferred == ctx->write_count)
772 res->done = true;
773 else {
774 transfer->length = ctx->write_count - res->transferred;
775 transfer->buffer = ctx->write_buffer + res->transferred;
776 if (libusb_submit_transfer(transfer) != LIBUSB_SUCCESS)
777 res->done = true;
778 }
779 }
780
781 int mpsse_flush(struct mpsse_ctx *ctx)
782 {
783 DEBUG_IO("write %d%s, read %d", ctx->write_count, ctx->read_count ? "+1" : "",
784 ctx->read_count);
785 assert(ctx->write_count > 0 || ctx->read_count == 0); /* No read data without write data */
786 int retval = ERROR_OK;
787
788 if (ctx->write_count == 0)
789 return retval;
790
791 struct libusb_transfer *read_transfer = 0;
792 struct transfer_result read_result = { .ctx = ctx, .done = true };
793 if (ctx->read_count) {
794 buffer_write_byte(ctx, 0x87); /* SEND_IMMEDIATE */
795 read_result.done = false;
796 read_transfer = libusb_alloc_transfer(0);
797 libusb_fill_bulk_transfer(read_transfer, ctx->usb_dev, ctx->in_ep, ctx->read_chunk,
798 ctx->read_chunk_size, read_cb, &read_result,
799 ctx->usb_read_timeout);
800 retval = libusb_submit_transfer(read_transfer);
801 }
802
803 struct transfer_result write_result = { .ctx = ctx, .done = false };
804 struct libusb_transfer *write_transfer = libusb_alloc_transfer(0);
805 libusb_fill_bulk_transfer(write_transfer, ctx->usb_dev, ctx->out_ep, ctx->write_buffer,
806 ctx->write_count, write_cb, &write_result, ctx->usb_write_timeout);
807 retval = libusb_submit_transfer(write_transfer);
808
809 /* Polling loop, more or less taken from libftdi */
810 while (!write_result.done || !read_result.done) {
811 retval = libusb_handle_events(ctx->usb_ctx);
812 keep_alive();
813 if (retval != LIBUSB_SUCCESS && retval != LIBUSB_ERROR_INTERRUPTED) {
814 libusb_cancel_transfer(write_transfer);
815 if (read_transfer)
816 libusb_cancel_transfer(read_transfer);
817 while (!write_result.done || !read_result.done)
818 if (libusb_handle_events(ctx->usb_ctx) != LIBUSB_SUCCESS)
819 break;
820 }
821 }
822
823 if (retval != LIBUSB_SUCCESS) {
824 LOG_ERROR("libusb_handle_events() failed with %d", retval);
825 retval = ERROR_FAIL;
826 } else if (write_result.transferred < ctx->write_count) {
827 LOG_ERROR("ftdi device did not accept all data: %d, tried %d",
828 write_result.transferred,
829 ctx->write_count);
830 retval = ERROR_FAIL;
831 } else if (read_result.transferred < ctx->read_count) {
832 LOG_ERROR("ftdi device did not return all data: %d, expected %d",
833 read_result.transferred,
834 ctx->read_count);
835 retval = ERROR_FAIL;
836 } else if (ctx->read_count) {
837 ctx->write_count = 0;
838 ctx->read_count = 0;
839 bit_copy_execute(&ctx->read_queue);
840 retval = ERROR_OK;
841 } else {
842 ctx->write_count = 0;
843 bit_copy_discard(&ctx->read_queue);
844 retval = ERROR_OK;
845 }
846
847 libusb_free_transfer(write_transfer);
848 if (read_transfer)
849 libusb_free_transfer(read_transfer);
850
851 if (retval != ERROR_OK)
852 mpsse_purge(ctx);
853
854 return retval;
855 }

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)