jtag/drivers/ftdi: Use adapter_khz value for initial clock speed (was default 1kHz)
[openocd.git] / src / jtag / drivers / ftdi.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 /**
22 * @file
23 * JTAG adapters based on the FT2232 full and high speed USB parts are
24 * popular low cost JTAG debug solutions. Many FT2232 based JTAG adapters
25 * are discrete, but development boards may integrate them as alternatives
26 * to more capable (and expensive) third party JTAG pods.
27 *
28 * JTAG uses only one of the two communications channels ("MPSSE engines")
29 * on these devices. Adapters based on FT4232 parts have four ports/channels
30 * (A/B/C/D), instead of just two (A/B).
31 *
32 * Especially on development boards integrating one of these chips (as
33 * opposed to discrete pods/dongles), the additional channels can be used
34 * for a variety of purposes, but OpenOCD only uses one channel at a time.
35 *
36 * - As a USB-to-serial adapter for the target's console UART ...
37 * which may be able to support ROM boot loaders that load initial
38 * firmware images to flash (or SRAM).
39 *
40 * - On systems which support ARM's SWD in addition to JTAG, or instead
41 * of it, that second port can be used for reading SWV/SWO trace data.
42 *
43 * - Additional JTAG links, e.g. to a CPLD or * FPGA.
44 *
45 * FT2232 based JTAG adapters are "dumb" not "smart", because most JTAG
46 * request/response interactions involve round trips over the USB link.
47 * A "smart" JTAG adapter has intelligence close to the scan chain, so it
48 * can for example poll quickly for a status change (usually taking on the
49 * order of microseconds not milliseconds) before beginning a queued
50 * transaction which require the previous one to have completed.
51 *
52 * There are dozens of adapters of this type, differing in details which
53 * this driver needs to understand. Those "layout" details are required
54 * as part of FT2232 driver configuration.
55 *
56 * This code uses information contained in the MPSSE specification which was
57 * found here:
58 * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
59 * Hereafter this is called the "MPSSE Spec".
60 *
61 * The datasheet for the ftdichip.com's FT2232D part is here:
62 * http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
63 *
64 * Also note the issue with code 0x4b (clock data to TMS) noted in
65 * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
66 * which can affect longer JTAG state paths.
67 */
68
69 #ifdef HAVE_CONFIG_H
70 #include "config.h"
71 #endif
72
73 /* project specific includes */
74 #include <jtag/interface.h>
75 #include <jtag/swd.h>
76 #include <transport/transport.h>
77 #include <helper/time_support.h>
78
79 #if IS_CYGWIN == 1
80 #include <windows.h>
81 #endif
82
83 #include <assert.h>
84
85 /* FTDI access library includes */
86 #include "mpsse.h"
87
88 #define JTAG_MODE (LSB_FIRST | POS_EDGE_IN | NEG_EDGE_OUT)
89 #define SWD_MODE (LSB_FIRST | POS_EDGE_IN | NEG_EDGE_OUT)
90
91 static char *ftdi_device_desc;
92 static char *ftdi_serial;
93 static uint8_t ftdi_channel;
94
95 static bool swd_mode;
96
97 #define MAX_USB_IDS 8
98 /* vid = pid = 0 marks the end of the list */
99 static uint16_t ftdi_vid[MAX_USB_IDS + 1] = { 0 };
100 static uint16_t ftdi_pid[MAX_USB_IDS + 1] = { 0 };
101
102 static struct mpsse_ctx *mpsse_ctx;
103
104 struct signal {
105 const char *name;
106 uint16_t data_mask;
107 uint16_t oe_mask;
108 bool invert_data;
109 bool invert_oe;
110 struct signal *next;
111 };
112
113 static struct signal *signals;
114
115 /* FIXME: Where to store per-instance data? We need an SWD context. */
116 static struct swd_cmd_queue_entry {
117 uint8_t cmd;
118 uint32_t *dst;
119 uint8_t trn_ack_data_parity_trn[DIV_ROUND_UP(4 + 3 + 32 + 1 + 4, 8)];
120 } *swd_cmd_queue;
121 static size_t swd_cmd_queue_length;
122 static size_t swd_cmd_queue_alloced;
123 static int queued_retval;
124 static int freq;
125
126 static uint16_t output;
127 static uint16_t direction;
128 static uint16_t jtag_output_init;
129 static uint16_t jtag_direction_init;
130
131 static int ftdi_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq);
132
133 static struct signal *find_signal_by_name(const char *name)
134 {
135 for (struct signal *sig = signals; sig; sig = sig->next) {
136 if (strcmp(name, sig->name) == 0)
137 return sig;
138 }
139 return NULL;
140 }
141
142 static struct signal *create_signal(const char *name)
143 {
144 struct signal **psig = &signals;
145 while (*psig)
146 psig = &(*psig)->next;
147
148 *psig = calloc(1, sizeof(**psig));
149 if (*psig == NULL)
150 return NULL;
151
152 (*psig)->name = strdup(name);
153 if ((*psig)->name == NULL) {
154 free(*psig);
155 *psig = NULL;
156 }
157 return *psig;
158 }
159
160 static int ftdi_set_signal(const struct signal *s, char value)
161 {
162 bool data;
163 bool oe;
164
165 if (s->data_mask == 0 && s->oe_mask == 0) {
166 LOG_ERROR("interface doesn't provide signal '%s'", s->name);
167 return ERROR_FAIL;
168 }
169 switch (value) {
170 case '0':
171 data = s->invert_data;
172 oe = !s->invert_oe;
173 break;
174 case '1':
175 if (s->data_mask == 0) {
176 LOG_ERROR("interface can't drive '%s' high", s->name);
177 return ERROR_FAIL;
178 }
179 data = !s->invert_data;
180 oe = !s->invert_oe;
181 break;
182 case 'z':
183 case 'Z':
184 if (s->oe_mask == 0) {
185 LOG_ERROR("interface can't tri-state '%s'", s->name);
186 return ERROR_FAIL;
187 }
188 data = s->invert_data;
189 oe = s->invert_oe;
190 break;
191 default:
192 assert(0 && "invalid signal level specifier");
193 return ERROR_FAIL;
194 }
195
196 uint16_t old_output = output;
197 uint16_t old_direction = direction;
198
199 output = data ? output | s->data_mask : output & ~s->data_mask;
200 if (s->oe_mask == s->data_mask)
201 direction = oe ? direction | s->oe_mask : direction & ~s->oe_mask;
202 else
203 output = oe ? output | s->oe_mask : output & ~s->oe_mask;
204
205 if ((output & 0xff) != (old_output & 0xff) || (direction & 0xff) != (old_direction & 0xff))
206 mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
207 if ((output >> 8 != old_output >> 8) || (direction >> 8 != old_direction >> 8))
208 mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
209
210 return ERROR_OK;
211 }
212
213
214 /**
215 * Function move_to_state
216 * moves the TAP controller from the current state to a
217 * \a goal_state through a path given by tap_get_tms_path(). State transition
218 * logging is performed by delegation to clock_tms().
219 *
220 * @param goal_state is the destination state for the move.
221 */
222 static void move_to_state(tap_state_t goal_state)
223 {
224 tap_state_t start_state = tap_get_state();
225
226 /* goal_state is 1/2 of a tuple/pair of states which allow convenient
227 lookup of the required TMS pattern to move to this state from the
228 start state.
229 */
230
231 /* do the 2 lookups */
232 uint8_t tms_bits = tap_get_tms_path(start_state, goal_state);
233 int tms_count = tap_get_tms_path_len(start_state, goal_state);
234 assert(tms_count <= 8);
235
236 DEBUG_JTAG_IO("start=%s goal=%s", tap_state_name(start_state), tap_state_name(goal_state));
237
238 /* Track state transitions step by step */
239 for (int i = 0; i < tms_count; i++)
240 tap_set_state(tap_state_transition(tap_get_state(), (tms_bits >> i) & 1));
241
242 mpsse_clock_tms_cs_out(mpsse_ctx,
243 &tms_bits,
244 0,
245 tms_count,
246 false,
247 JTAG_MODE);
248 }
249
250 static int ftdi_speed(int speed)
251 {
252 int retval;
253 retval = mpsse_set_frequency(mpsse_ctx, speed);
254
255 if (retval < 0) {
256 LOG_ERROR("couldn't set FTDI TCK speed");
257 return retval;
258 }
259
260 return ERROR_OK;
261 }
262
263 static int ftdi_speed_div(int speed, int *khz)
264 {
265 *khz = speed / 1000;
266 return ERROR_OK;
267 }
268
269 static int ftdi_khz(int khz, int *jtag_speed)
270 {
271 if (khz == 0 && !mpsse_is_high_speed(mpsse_ctx)) {
272 LOG_DEBUG("RCLK not supported");
273 return ERROR_FAIL;
274 }
275
276 *jtag_speed = khz * 1000;
277 return ERROR_OK;
278 }
279
280 static void ftdi_end_state(tap_state_t state)
281 {
282 if (tap_is_state_stable(state))
283 tap_set_end_state(state);
284 else {
285 LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state));
286 exit(-1);
287 }
288 }
289
290 static void ftdi_execute_runtest(struct jtag_command *cmd)
291 {
292 int i;
293 uint8_t zero = 0;
294
295 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
296 cmd->cmd.runtest->num_cycles,
297 tap_state_name(cmd->cmd.runtest->end_state));
298
299 if (tap_get_state() != TAP_IDLE)
300 move_to_state(TAP_IDLE);
301
302 /* TODO: Reuse ftdi_execute_stableclocks */
303 i = cmd->cmd.runtest->num_cycles;
304 while (i > 0) {
305 /* there are no state transitions in this code, so omit state tracking */
306 unsigned this_len = i > 7 ? 7 : i;
307 mpsse_clock_tms_cs_out(mpsse_ctx, &zero, 0, this_len, false, JTAG_MODE);
308 i -= this_len;
309 }
310
311 ftdi_end_state(cmd->cmd.runtest->end_state);
312
313 if (tap_get_state() != tap_get_end_state())
314 move_to_state(tap_get_end_state());
315
316 DEBUG_JTAG_IO("runtest: %i, end in %s",
317 cmd->cmd.runtest->num_cycles,
318 tap_state_name(tap_get_end_state()));
319 }
320
321 static void ftdi_execute_statemove(struct jtag_command *cmd)
322 {
323 DEBUG_JTAG_IO("statemove end in %s",
324 tap_state_name(cmd->cmd.statemove->end_state));
325
326 ftdi_end_state(cmd->cmd.statemove->end_state);
327
328 /* shortest-path move to desired end state */
329 if (tap_get_state() != tap_get_end_state() || tap_get_end_state() == TAP_RESET)
330 move_to_state(tap_get_end_state());
331 }
332
333 /**
334 * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG
335 * (or SWD) state machine. REVISIT: Not the best method, perhaps.
336 */
337 static void ftdi_execute_tms(struct jtag_command *cmd)
338 {
339 DEBUG_JTAG_IO("TMS: %d bits", cmd->cmd.tms->num_bits);
340
341 /* TODO: Missing tap state tracking, also missing from ft2232.c! */
342 mpsse_clock_tms_cs_out(mpsse_ctx,
343 cmd->cmd.tms->bits,
344 0,
345 cmd->cmd.tms->num_bits,
346 false,
347 JTAG_MODE);
348 }
349
350 static void ftdi_execute_pathmove(struct jtag_command *cmd)
351 {
352 tap_state_t *path = cmd->cmd.pathmove->path;
353 int num_states = cmd->cmd.pathmove->num_states;
354
355 DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
356 tap_state_name(tap_get_state()),
357 tap_state_name(path[num_states-1]));
358
359 int state_count = 0;
360 unsigned bit_count = 0;
361 uint8_t tms_byte = 0;
362
363 DEBUG_JTAG_IO("-");
364
365 /* this loop verifies that the path is legal and logs each state in the path */
366 while (num_states--) {
367
368 /* either TMS=0 or TMS=1 must work ... */
369 if (tap_state_transition(tap_get_state(), false)
370 == path[state_count])
371 buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
372 else if (tap_state_transition(tap_get_state(), true)
373 == path[state_count]) {
374 buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
375
376 /* ... or else the caller goofed BADLY */
377 } else {
378 LOG_ERROR("BUG: %s -> %s isn't a valid "
379 "TAP state transition",
380 tap_state_name(tap_get_state()),
381 tap_state_name(path[state_count]));
382 exit(-1);
383 }
384
385 tap_set_state(path[state_count]);
386 state_count++;
387
388 if (bit_count == 7 || num_states == 0) {
389 mpsse_clock_tms_cs_out(mpsse_ctx,
390 &tms_byte,
391 0,
392 bit_count,
393 false,
394 JTAG_MODE);
395 bit_count = 0;
396 }
397 }
398 tap_set_end_state(tap_get_state());
399 }
400
401 static void ftdi_execute_scan(struct jtag_command *cmd)
402 {
403 DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN",
404 jtag_scan_type(cmd->cmd.scan));
405
406 /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
407 while (cmd->cmd.scan->num_fields > 0
408 && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 1].num_bits == 0) {
409 cmd->cmd.scan->num_fields--;
410 LOG_DEBUG("discarding trailing empty field");
411 }
412
413 if (cmd->cmd.scan->num_fields == 0) {
414 LOG_DEBUG("empty scan, doing nothing");
415 return;
416 }
417
418 if (cmd->cmd.scan->ir_scan) {
419 if (tap_get_state() != TAP_IRSHIFT)
420 move_to_state(TAP_IRSHIFT);
421 } else {
422 if (tap_get_state() != TAP_DRSHIFT)
423 move_to_state(TAP_DRSHIFT);
424 }
425
426 ftdi_end_state(cmd->cmd.scan->end_state);
427
428 struct scan_field *field = cmd->cmd.scan->fields;
429 unsigned scan_size = 0;
430
431 for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
432 scan_size += field->num_bits;
433 DEBUG_JTAG_IO("%s%s field %d/%d %d bits",
434 field->in_value ? "in" : "",
435 field->out_value ? "out" : "",
436 i,
437 cmd->cmd.scan->num_fields,
438 field->num_bits);
439
440 if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != tap_get_end_state()) {
441 /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
442 * movement. This last field can't have length zero, it was checked above. */
443 mpsse_clock_data(mpsse_ctx,
444 field->out_value,
445 0,
446 field->in_value,
447 0,
448 field->num_bits - 1,
449 JTAG_MODE);
450 uint8_t last_bit = 0;
451 if (field->out_value)
452 bit_copy(&last_bit, 0, field->out_value, field->num_bits - 1, 1);
453 uint8_t tms_bits = 0x01;
454 mpsse_clock_tms_cs(mpsse_ctx,
455 &tms_bits,
456 0,
457 field->in_value,
458 field->num_bits - 1,
459 1,
460 last_bit,
461 JTAG_MODE);
462 tap_set_state(tap_state_transition(tap_get_state(), 1));
463 mpsse_clock_tms_cs_out(mpsse_ctx,
464 &tms_bits,
465 1,
466 1,
467 last_bit,
468 JTAG_MODE);
469 tap_set_state(tap_state_transition(tap_get_state(), 0));
470 } else
471 mpsse_clock_data(mpsse_ctx,
472 field->out_value,
473 0,
474 field->in_value,
475 0,
476 field->num_bits,
477 JTAG_MODE);
478 }
479
480 if (tap_get_state() != tap_get_end_state())
481 move_to_state(tap_get_end_state());
482
483 DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
484 (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
485 tap_state_name(tap_get_end_state()));
486 }
487
488 static void ftdi_execute_reset(struct jtag_command *cmd)
489 {
490 DEBUG_JTAG_IO("reset trst: %i srst %i",
491 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
492
493 if (cmd->cmd.reset->trst == 1
494 || (cmd->cmd.reset->srst
495 && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
496 tap_set_state(TAP_RESET);
497
498 struct signal *trst = find_signal_by_name("nTRST");
499 if (cmd->cmd.reset->trst == 1) {
500 if (trst)
501 ftdi_set_signal(trst, '0');
502 else
503 LOG_ERROR("Can't assert TRST: nTRST signal is not defined");
504 } else if (trst && jtag_get_reset_config() & RESET_HAS_TRST &&
505 cmd->cmd.reset->trst == 0) {
506 if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN)
507 ftdi_set_signal(trst, 'z');
508 else
509 ftdi_set_signal(trst, '1');
510 }
511
512 struct signal *srst = find_signal_by_name("nSRST");
513 if (cmd->cmd.reset->srst == 1) {
514 if (srst)
515 ftdi_set_signal(srst, '0');
516 else
517 LOG_ERROR("Can't assert SRST: nSRST signal is not defined");
518 } else if (srst && jtag_get_reset_config() & RESET_HAS_SRST &&
519 cmd->cmd.reset->srst == 0) {
520 if (jtag_get_reset_config() & RESET_SRST_PUSH_PULL)
521 ftdi_set_signal(srst, '1');
522 else
523 ftdi_set_signal(srst, 'z');
524 }
525
526 DEBUG_JTAG_IO("trst: %i, srst: %i",
527 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
528 }
529
530 static void ftdi_execute_sleep(struct jtag_command *cmd)
531 {
532 DEBUG_JTAG_IO("sleep %" PRIi32, cmd->cmd.sleep->us);
533
534 mpsse_flush(mpsse_ctx);
535 jtag_sleep(cmd->cmd.sleep->us);
536 DEBUG_JTAG_IO("sleep %" PRIi32 " usec while in %s",
537 cmd->cmd.sleep->us,
538 tap_state_name(tap_get_state()));
539 }
540
541 static void ftdi_execute_stableclocks(struct jtag_command *cmd)
542 {
543 /* this is only allowed while in a stable state. A check for a stable
544 * state was done in jtag_add_clocks()
545 */
546 int num_cycles = cmd->cmd.stableclocks->num_cycles;
547
548 /* 7 bits of either ones or zeros. */
549 uint8_t tms = tap_get_state() == TAP_RESET ? 0x7f : 0x00;
550
551 /* TODO: Use mpsse_clock_data with in=out=0 for this, if TMS can be set to
552 * the correct level and remain there during the scan */
553 while (num_cycles > 0) {
554 /* there are no state transitions in this code, so omit state tracking */
555 unsigned this_len = num_cycles > 7 ? 7 : num_cycles;
556 mpsse_clock_tms_cs_out(mpsse_ctx, &tms, 0, this_len, false, JTAG_MODE);
557 num_cycles -= this_len;
558 }
559
560 DEBUG_JTAG_IO("clocks %i while in %s",
561 cmd->cmd.stableclocks->num_cycles,
562 tap_state_name(tap_get_state()));
563 }
564
565 static void ftdi_execute_command(struct jtag_command *cmd)
566 {
567 switch (cmd->type) {
568 case JTAG_RESET:
569 ftdi_execute_reset(cmd);
570 break;
571 case JTAG_RUNTEST:
572 ftdi_execute_runtest(cmd);
573 break;
574 case JTAG_TLR_RESET:
575 ftdi_execute_statemove(cmd);
576 break;
577 case JTAG_PATHMOVE:
578 ftdi_execute_pathmove(cmd);
579 break;
580 case JTAG_SCAN:
581 ftdi_execute_scan(cmd);
582 break;
583 case JTAG_SLEEP:
584 ftdi_execute_sleep(cmd);
585 break;
586 case JTAG_STABLECLOCKS:
587 ftdi_execute_stableclocks(cmd);
588 break;
589 case JTAG_TMS:
590 ftdi_execute_tms(cmd);
591 break;
592 default:
593 LOG_ERROR("BUG: unknown JTAG command type encountered: %d", cmd->type);
594 break;
595 }
596 }
597
598 static int ftdi_execute_queue(void)
599 {
600 /* blink, if the current layout has that feature */
601 struct signal *led = find_signal_by_name("LED");
602 if (led)
603 ftdi_set_signal(led, '1');
604
605 for (struct jtag_command *cmd = jtag_command_queue; cmd; cmd = cmd->next) {
606 /* fill the write buffer with the desired command */
607 ftdi_execute_command(cmd);
608 }
609
610 if (led)
611 ftdi_set_signal(led, '0');
612
613 int retval = mpsse_flush(mpsse_ctx);
614 if (retval != ERROR_OK)
615 LOG_ERROR("error while flushing MPSSE queue: %d", retval);
616
617 return retval;
618 }
619
620 static int ftdi_initialize(void)
621 {
622 if (tap_get_tms_path_len(TAP_IRPAUSE, TAP_IRPAUSE) == 7)
623 LOG_DEBUG("ftdi interface using 7 step jtag state transitions");
624 else
625 LOG_DEBUG("ftdi interface using shortest path jtag state transitions");
626
627 for (int i = 0; ftdi_vid[i] || ftdi_pid[i]; i++) {
628 mpsse_ctx = mpsse_open(&ftdi_vid[i], &ftdi_pid[i], ftdi_device_desc,
629 ftdi_serial, ftdi_channel);
630 if (mpsse_ctx)
631 break;
632 }
633
634 if (!mpsse_ctx)
635 return ERROR_JTAG_INIT_FAILED;
636
637 output = jtag_output_init;
638 direction = jtag_direction_init;
639
640 if (swd_mode) {
641 struct signal *sig = find_signal_by_name("SWD_EN");
642 if (!sig) {
643 LOG_ERROR("SWD mode is active but SWD_EN signal is not defined");
644 return ERROR_JTAG_INIT_FAILED;
645 }
646 /* A dummy SWD_EN would have zero mask */
647 if (sig->data_mask)
648 ftdi_set_signal(sig, '1');
649 }
650
651 mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
652 mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
653
654 mpsse_loopback_config(mpsse_ctx, false);
655
656 freq = mpsse_set_frequency(mpsse_ctx, jtag_get_speed_khz() * 1000);
657
658 if (swd_mode)
659 ftdi_swd_switch_seq(NULL, JTAG_TO_SWD);
660 else
661 ftdi_swd_switch_seq(NULL, SWD_TO_JTAG);
662
663 return mpsse_flush(mpsse_ctx);
664 }
665
666 static int ftdi_quit(void)
667 {
668 mpsse_close(mpsse_ctx);
669
670 return ERROR_OK;
671 }
672
673 COMMAND_HANDLER(ftdi_handle_device_desc_command)
674 {
675 if (CMD_ARGC == 1) {
676 if (ftdi_device_desc)
677 free(ftdi_device_desc);
678 ftdi_device_desc = strdup(CMD_ARGV[0]);
679 } else {
680 LOG_ERROR("expected exactly one argument to ftdi_device_desc <description>");
681 }
682
683 return ERROR_OK;
684 }
685
686 COMMAND_HANDLER(ftdi_handle_serial_command)
687 {
688 if (CMD_ARGC == 1) {
689 if (ftdi_serial)
690 free(ftdi_serial);
691 ftdi_serial = strdup(CMD_ARGV[0]);
692 } else {
693 return ERROR_COMMAND_SYNTAX_ERROR;
694 }
695
696 return ERROR_OK;
697 }
698
699 COMMAND_HANDLER(ftdi_handle_channel_command)
700 {
701 if (CMD_ARGC == 1)
702 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], ftdi_channel);
703 else
704 return ERROR_COMMAND_SYNTAX_ERROR;
705
706 return ERROR_OK;
707 }
708
709 COMMAND_HANDLER(ftdi_handle_layout_init_command)
710 {
711 if (CMD_ARGC != 2)
712 return ERROR_COMMAND_SYNTAX_ERROR;
713
714 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], jtag_output_init);
715 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], jtag_direction_init);
716
717 return ERROR_OK;
718 }
719
720 COMMAND_HANDLER(ftdi_handle_layout_signal_command)
721 {
722 if (CMD_ARGC < 1)
723 return ERROR_COMMAND_SYNTAX_ERROR;
724
725 bool invert_data = false;
726 uint16_t data_mask = 0;
727 bool invert_oe = false;
728 uint16_t oe_mask = 0;
729 for (unsigned i = 1; i < CMD_ARGC; i += 2) {
730 if (strcmp("-data", CMD_ARGV[i]) == 0) {
731 invert_data = false;
732 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], data_mask);
733 } else if (strcmp("-ndata", CMD_ARGV[i]) == 0) {
734 invert_data = true;
735 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], data_mask);
736 } else if (strcmp("-oe", CMD_ARGV[i]) == 0) {
737 invert_oe = false;
738 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], oe_mask);
739 } else if (strcmp("-noe", CMD_ARGV[i]) == 0) {
740 invert_oe = true;
741 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], oe_mask);
742 } else if (!strcmp("-alias", CMD_ARGV[i]) ||
743 !strcmp("-nalias", CMD_ARGV[i])) {
744 if (!strcmp("-nalias", CMD_ARGV[i]))
745 invert_data = true;
746 struct signal *sig = find_signal_by_name(CMD_ARGV[i + 1]);
747 if (!sig) {
748 LOG_ERROR("signal %s is not defined", CMD_ARGV[i + 1]);
749 return ERROR_FAIL;
750 }
751 data_mask = sig->data_mask;
752 oe_mask = sig->oe_mask;
753 invert_oe = sig->invert_oe;
754 invert_data ^= sig->invert_data;
755 } else {
756 LOG_ERROR("unknown option '%s'", CMD_ARGV[i]);
757 return ERROR_COMMAND_SYNTAX_ERROR;
758 }
759 }
760
761 struct signal *sig;
762 sig = find_signal_by_name(CMD_ARGV[0]);
763 if (!sig)
764 sig = create_signal(CMD_ARGV[0]);
765 if (!sig) {
766 LOG_ERROR("failed to create signal %s", CMD_ARGV[0]);
767 return ERROR_FAIL;
768 }
769
770 sig->invert_data = invert_data;
771 sig->data_mask = data_mask;
772 sig->invert_oe = invert_oe;
773 sig->oe_mask = oe_mask;
774
775 return ERROR_OK;
776 }
777
778 COMMAND_HANDLER(ftdi_handle_set_signal_command)
779 {
780 if (CMD_ARGC < 2)
781 return ERROR_COMMAND_SYNTAX_ERROR;
782
783 struct signal *sig;
784 sig = find_signal_by_name(CMD_ARGV[0]);
785 if (!sig) {
786 LOG_ERROR("interface configuration doesn't define signal '%s'", CMD_ARGV[0]);
787 return ERROR_FAIL;
788 }
789
790 switch (*CMD_ARGV[1]) {
791 case '0':
792 case '1':
793 case 'z':
794 case 'Z':
795 /* single character level specifier only */
796 if (CMD_ARGV[1][1] == '\0') {
797 ftdi_set_signal(sig, *CMD_ARGV[1]);
798 break;
799 }
800 default:
801 LOG_ERROR("unknown signal level '%s', use 0, 1 or z", CMD_ARGV[1]);
802 return ERROR_COMMAND_SYNTAX_ERROR;
803 }
804
805 return mpsse_flush(mpsse_ctx);
806 }
807
808 COMMAND_HANDLER(ftdi_handle_vid_pid_command)
809 {
810 if (CMD_ARGC > MAX_USB_IDS * 2) {
811 LOG_WARNING("ignoring extra IDs in ftdi_vid_pid "
812 "(maximum is %d pairs)", MAX_USB_IDS);
813 CMD_ARGC = MAX_USB_IDS * 2;
814 }
815 if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
816 LOG_WARNING("incomplete ftdi_vid_pid configuration directive");
817 if (CMD_ARGC < 2)
818 return ERROR_COMMAND_SYNTAX_ERROR;
819 /* remove the incomplete trailing id */
820 CMD_ARGC -= 1;
821 }
822
823 unsigned i;
824 for (i = 0; i < CMD_ARGC; i += 2) {
825 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], ftdi_vid[i >> 1]);
826 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], ftdi_pid[i >> 1]);
827 }
828
829 /*
830 * Explicitly terminate, in case there are multiples instances of
831 * ftdi_vid_pid.
832 */
833 ftdi_vid[i >> 1] = ftdi_pid[i >> 1] = 0;
834
835 return ERROR_OK;
836 }
837
838 static const struct command_registration ftdi_command_handlers[] = {
839 {
840 .name = "ftdi_device_desc",
841 .handler = &ftdi_handle_device_desc_command,
842 .mode = COMMAND_CONFIG,
843 .help = "set the USB device description of the FTDI device",
844 .usage = "description_string",
845 },
846 {
847 .name = "ftdi_serial",
848 .handler = &ftdi_handle_serial_command,
849 .mode = COMMAND_CONFIG,
850 .help = "set the serial number of the FTDI device",
851 .usage = "serial_string",
852 },
853 {
854 .name = "ftdi_channel",
855 .handler = &ftdi_handle_channel_command,
856 .mode = COMMAND_CONFIG,
857 .help = "set the channel of the FTDI device that is used as JTAG",
858 .usage = "(0-3)",
859 },
860 {
861 .name = "ftdi_layout_init",
862 .handler = &ftdi_handle_layout_init_command,
863 .mode = COMMAND_CONFIG,
864 .help = "initialize the FTDI GPIO signals used "
865 "to control output-enables and reset signals",
866 .usage = "data direction",
867 },
868 {
869 .name = "ftdi_layout_signal",
870 .handler = &ftdi_handle_layout_signal_command,
871 .mode = COMMAND_ANY,
872 .help = "define a signal controlled by one or more FTDI GPIO as data "
873 "and/or output enable",
874 .usage = "name [-data mask|-ndata mask] [-oe mask|-noe mask] [-alias|-nalias name]",
875 },
876 {
877 .name = "ftdi_set_signal",
878 .handler = &ftdi_handle_set_signal_command,
879 .mode = COMMAND_EXEC,
880 .help = "control a layout-specific signal",
881 .usage = "name (1|0|z)",
882 },
883 {
884 .name = "ftdi_vid_pid",
885 .handler = &ftdi_handle_vid_pid_command,
886 .mode = COMMAND_CONFIG,
887 .help = "the vendor ID and product ID of the FTDI device",
888 .usage = "(vid pid)* ",
889 },
890 COMMAND_REGISTRATION_DONE
891 };
892
893 static int create_default_signal(const char *name, uint16_t data_mask)
894 {
895 struct signal *sig = create_signal(name);
896 if (!sig) {
897 LOG_ERROR("failed to create signal %s", name);
898 return ERROR_FAIL;
899 }
900 sig->invert_data = false;
901 sig->data_mask = data_mask;
902 sig->invert_oe = false;
903 sig->oe_mask = 0;
904
905 return ERROR_OK;
906 }
907
908 static int create_signals(void)
909 {
910 if (create_default_signal("TCK", 0x01) != ERROR_OK)
911 return ERROR_FAIL;
912 if (create_default_signal("TDI", 0x02) != ERROR_OK)
913 return ERROR_FAIL;
914 if (create_default_signal("TDO", 0x04) != ERROR_OK)
915 return ERROR_FAIL;
916 if (create_default_signal("TMS", 0x08) != ERROR_OK)
917 return ERROR_FAIL;
918 return ERROR_OK;
919 }
920
921 static int ftdi_swd_init(void)
922 {
923 LOG_INFO("FTDI SWD mode enabled");
924 swd_mode = true;
925
926 if (create_signals() != ERROR_OK)
927 return ERROR_FAIL;
928
929 swd_cmd_queue_alloced = 10;
930 swd_cmd_queue = malloc(swd_cmd_queue_alloced * sizeof(*swd_cmd_queue));
931
932 return swd_cmd_queue != NULL ? ERROR_OK : ERROR_FAIL;
933 }
934
935 static void ftdi_swd_swdio_en(bool enable)
936 {
937 struct signal *oe = find_signal_by_name("SWDIO_OE");
938 if (oe)
939 ftdi_set_signal(oe, enable ? '1' : '0');
940 }
941
942 /**
943 * Flush the MPSSE queue and process the SWD transaction queue
944 * @param dap
945 * @return
946 */
947 static int ftdi_swd_run_queue(struct adiv5_dap *dap)
948 {
949 LOG_DEBUG("Executing %zu queued transactions", swd_cmd_queue_length);
950 int retval;
951 struct signal *led = find_signal_by_name("LED");
952
953 if (queued_retval != ERROR_OK) {
954 LOG_DEBUG("Skipping due to previous errors: %d", queued_retval);
955 goto skip;
956 }
957
958 /* A transaction must be followed by another transaction or at least 8 idle cycles to
959 * ensure that data is clocked through the AP. */
960 mpsse_clock_data_out(mpsse_ctx, NULL, 0, 8, SWD_MODE);
961
962 /* Terminate the "blink", if the current layout has that feature */
963 if (led)
964 ftdi_set_signal(led, '0');
965
966 queued_retval = mpsse_flush(mpsse_ctx);
967 if (queued_retval != ERROR_OK) {
968 LOG_ERROR("MPSSE failed");
969 goto skip;
970 }
971
972 for (size_t i = 0; i < swd_cmd_queue_length; i++) {
973 int ack = buf_get_u32(&swd_cmd_queue[i].trn_ack_data_parity_trn, 1, 3);
974
975 LOG_DEBUG("%s %s %s reg %X = %08"PRIx32,
976 ack == SWD_ACK_OK ? "OK" : ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK",
977 swd_cmd_queue[i].cmd & SWD_CMD_APnDP ? "AP" : "DP",
978 swd_cmd_queue[i].cmd & SWD_CMD_RnW ? "read" : "write",
979 (swd_cmd_queue[i].cmd & SWD_CMD_A32) >> 1,
980 buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn,
981 1 + 3 + (swd_cmd_queue[i].cmd & SWD_CMD_RnW ? 0 : 1), 32));
982
983 if (ack != SWD_ACK_OK) {
984 queued_retval = ack;
985 goto skip;
986
987 } else if (swd_cmd_queue[i].cmd & SWD_CMD_RnW) {
988 uint32_t data = buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3, 32);
989 int parity = buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 32, 1);
990
991 if (parity != parity_u32(data)) {
992 LOG_ERROR("SWD Read data parity mismatch");
993 queued_retval = ERROR_FAIL;
994 goto skip;
995 }
996
997 if (swd_cmd_queue[i].dst != NULL)
998 *swd_cmd_queue[i].dst = data;
999 }
1000 }
1001
1002 skip:
1003 swd_cmd_queue_length = 0;
1004 retval = queued_retval;
1005 queued_retval = ERROR_OK;
1006
1007 /* Queue a new "blink" */
1008 if (led && retval == ERROR_OK)
1009 ftdi_set_signal(led, '1');
1010
1011 return retval;
1012 }
1013
1014 static void ftdi_swd_queue_cmd(struct adiv5_dap *dap, uint8_t cmd, uint32_t *dst, uint32_t data)
1015 {
1016 if (swd_cmd_queue_length >= swd_cmd_queue_alloced) {
1017 /* Not enough room in the queue. Run the queue and increase its size for next time.
1018 * Note that it's not possible to avoid running the queue here, because mpsse contains
1019 * pointers into the queue which may be invalid after the realloc. */
1020 queued_retval = ftdi_swd_run_queue(dap);
1021 struct swd_cmd_queue_entry *q = realloc(swd_cmd_queue, swd_cmd_queue_alloced * 2 * sizeof(*swd_cmd_queue));
1022 if (q != NULL) {
1023 swd_cmd_queue = q;
1024 swd_cmd_queue_alloced *= 2;
1025 LOG_DEBUG("Increased SWD command queue to %zu elements", swd_cmd_queue_alloced);
1026 }
1027 }
1028
1029 if (queued_retval != ERROR_OK)
1030 return;
1031
1032 size_t i = swd_cmd_queue_length++;
1033 swd_cmd_queue[i].cmd = cmd | SWD_CMD_START | SWD_CMD_PARK;
1034
1035 mpsse_clock_data_out(mpsse_ctx, &swd_cmd_queue[i].cmd, 0, 8, SWD_MODE);
1036
1037 if (swd_cmd_queue[i].cmd & SWD_CMD_RnW) {
1038 /* Queue a read transaction */
1039 swd_cmd_queue[i].dst = dst;
1040
1041 ftdi_swd_swdio_en(false);
1042 mpsse_clock_data_in(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1043 0, 1 + 3 + 32 + 1 + 1, SWD_MODE);
1044 ftdi_swd_swdio_en(true);
1045 } else {
1046 /* Queue a write transaction */
1047 ftdi_swd_swdio_en(false);
1048
1049 mpsse_clock_data_in(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1050 0, 1 + 3 + 1, SWD_MODE);
1051
1052 ftdi_swd_swdio_en(true);
1053
1054 buf_set_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 1, 32, data);
1055 buf_set_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 1 + 32, 1, parity_u32(data));
1056
1057 mpsse_clock_data_out(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1058 1 + 3 + 1, 32 + 1, SWD_MODE);
1059 }
1060
1061 /* Insert idle cycles after AP accesses to avoid WAIT */
1062 if (cmd & SWD_CMD_APnDP)
1063 mpsse_clock_data_out(mpsse_ctx, NULL, 0, dap->memaccess_tck, SWD_MODE);
1064
1065 }
1066
1067 static void ftdi_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *value)
1068 {
1069 assert(cmd & SWD_CMD_RnW);
1070 ftdi_swd_queue_cmd(dap, cmd, value, 0);
1071 }
1072
1073 static void ftdi_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t value)
1074 {
1075 assert(!(cmd & SWD_CMD_RnW));
1076 ftdi_swd_queue_cmd(dap, cmd, NULL, value);
1077 }
1078
1079 static int_least32_t ftdi_swd_frequency(struct adiv5_dap *dap, int_least32_t hz)
1080 {
1081 if (hz > 0)
1082 freq = mpsse_set_frequency(mpsse_ctx, hz);
1083
1084 return freq;
1085 }
1086
1087 static int ftdi_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq)
1088 {
1089 switch (seq) {
1090 case LINE_RESET:
1091 LOG_DEBUG("SWD line reset");
1092 mpsse_clock_data_out(mpsse_ctx, swd_seq_line_reset, 0, swd_seq_line_reset_len, SWD_MODE);
1093 break;
1094 case JTAG_TO_SWD:
1095 LOG_DEBUG("JTAG-to-SWD");
1096 mpsse_clock_data_out(mpsse_ctx, swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len, SWD_MODE);
1097 break;
1098 case SWD_TO_JTAG:
1099 LOG_DEBUG("SWD-to-JTAG");
1100 mpsse_clock_data_out(mpsse_ctx, swd_seq_swd_to_jtag, 0, swd_seq_swd_to_jtag_len, SWD_MODE);
1101 break;
1102 default:
1103 LOG_ERROR("Sequence %d not supported", seq);
1104 return ERROR_FAIL;
1105 }
1106
1107 return ERROR_OK;
1108 }
1109
1110 static const struct swd_driver ftdi_swd = {
1111 .init = ftdi_swd_init,
1112 .frequency = ftdi_swd_frequency,
1113 .switch_seq = ftdi_swd_switch_seq,
1114 .read_reg = ftdi_swd_read_reg,
1115 .write_reg = ftdi_swd_write_reg,
1116 .run = ftdi_swd_run_queue,
1117 };
1118
1119 static const char * const ftdi_transports[] = { "jtag", "swd", NULL };
1120
1121 struct jtag_interface ftdi_interface = {
1122 .name = "ftdi",
1123 .supported = DEBUG_CAP_TMS_SEQ,
1124 .commands = ftdi_command_handlers,
1125 .transports = ftdi_transports,
1126 .swd = &ftdi_swd,
1127
1128 .init = ftdi_initialize,
1129 .quit = ftdi_quit,
1130 .speed = ftdi_speed,
1131 .speed_div = ftdi_speed_div,
1132 .khz = ftdi_khz,
1133 .execute_queue = ftdi_execute_queue,
1134 };

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)