jtag/drivers/ftdi: declare standard JTAG signals on SWD init
[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 static uint16_t swd_output_init;
131 static uint16_t swd_direction_init;
132
133 static int ftdi_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq);
134
135 static struct signal *find_signal_by_name(const char *name)
136 {
137 for (struct signal *sig = signals; sig; sig = sig->next) {
138 if (strcmp(name, sig->name) == 0)
139 return sig;
140 }
141 return NULL;
142 }
143
144 static struct signal *create_signal(const char *name)
145 {
146 struct signal **psig = &signals;
147 while (*psig)
148 psig = &(*psig)->next;
149
150 *psig = calloc(1, sizeof(**psig));
151 if (*psig == NULL)
152 return NULL;
153
154 (*psig)->name = strdup(name);
155 if ((*psig)->name == NULL) {
156 free(*psig);
157 *psig = NULL;
158 }
159 return *psig;
160 }
161
162 static int ftdi_set_signal(const struct signal *s, char value)
163 {
164 bool data;
165 bool oe;
166
167 if (s->data_mask == 0 && s->oe_mask == 0) {
168 LOG_ERROR("interface doesn't provide signal '%s'", s->name);
169 return ERROR_FAIL;
170 }
171 switch (value) {
172 case '0':
173 data = s->invert_data;
174 oe = !s->invert_oe;
175 break;
176 case '1':
177 if (s->data_mask == 0) {
178 LOG_ERROR("interface can't drive '%s' high", s->name);
179 return ERROR_FAIL;
180 }
181 data = !s->invert_data;
182 oe = !s->invert_oe;
183 break;
184 case 'z':
185 case 'Z':
186 if (s->oe_mask == 0) {
187 LOG_ERROR("interface can't tri-state '%s'", s->name);
188 return ERROR_FAIL;
189 }
190 data = s->invert_data;
191 oe = s->invert_oe;
192 break;
193 default:
194 assert(0 && "invalid signal level specifier");
195 return ERROR_FAIL;
196 }
197
198 uint16_t old_output = output;
199 uint16_t old_direction = direction;
200
201 output = data ? output | s->data_mask : output & ~s->data_mask;
202 if (s->oe_mask == s->data_mask)
203 direction = oe ? direction | s->oe_mask : direction & ~s->oe_mask;
204 else
205 output = oe ? output | s->oe_mask : output & ~s->oe_mask;
206
207 if ((output & 0xff) != (old_output & 0xff) || (direction & 0xff) != (old_direction & 0xff))
208 mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
209 if ((output >> 8 != old_output >> 8) || (direction >> 8 != old_direction >> 8))
210 mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
211
212 return ERROR_OK;
213 }
214
215
216 /**
217 * Function move_to_state
218 * moves the TAP controller from the current state to a
219 * \a goal_state through a path given by tap_get_tms_path(). State transition
220 * logging is performed by delegation to clock_tms().
221 *
222 * @param goal_state is the destination state for the move.
223 */
224 static void move_to_state(tap_state_t goal_state)
225 {
226 tap_state_t start_state = tap_get_state();
227
228 /* goal_state is 1/2 of a tuple/pair of states which allow convenient
229 lookup of the required TMS pattern to move to this state from the
230 start state.
231 */
232
233 /* do the 2 lookups */
234 uint8_t tms_bits = tap_get_tms_path(start_state, goal_state);
235 int tms_count = tap_get_tms_path_len(start_state, goal_state);
236 assert(tms_count <= 8);
237
238 DEBUG_JTAG_IO("start=%s goal=%s", tap_state_name(start_state), tap_state_name(goal_state));
239
240 /* Track state transitions step by step */
241 for (int i = 0; i < tms_count; i++)
242 tap_set_state(tap_state_transition(tap_get_state(), (tms_bits >> i) & 1));
243
244 mpsse_clock_tms_cs_out(mpsse_ctx,
245 &tms_bits,
246 0,
247 tms_count,
248 false,
249 JTAG_MODE);
250 }
251
252 static int ftdi_speed(int speed)
253 {
254 int retval;
255 retval = mpsse_set_frequency(mpsse_ctx, speed);
256
257 if (retval < 0) {
258 LOG_ERROR("couldn't set FTDI TCK speed");
259 return retval;
260 }
261
262 return ERROR_OK;
263 }
264
265 static int ftdi_speed_div(int speed, int *khz)
266 {
267 *khz = speed / 1000;
268 return ERROR_OK;
269 }
270
271 static int ftdi_khz(int khz, int *jtag_speed)
272 {
273 if (khz == 0 && !mpsse_is_high_speed(mpsse_ctx)) {
274 LOG_DEBUG("RCLK not supported");
275 return ERROR_FAIL;
276 }
277
278 *jtag_speed = khz * 1000;
279 return ERROR_OK;
280 }
281
282 static void ftdi_end_state(tap_state_t state)
283 {
284 if (tap_is_state_stable(state))
285 tap_set_end_state(state);
286 else {
287 LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state));
288 exit(-1);
289 }
290 }
291
292 static void ftdi_execute_runtest(struct jtag_command *cmd)
293 {
294 int i;
295 uint8_t zero = 0;
296
297 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
298 cmd->cmd.runtest->num_cycles,
299 tap_state_name(cmd->cmd.runtest->end_state));
300
301 if (tap_get_state() != TAP_IDLE)
302 move_to_state(TAP_IDLE);
303
304 /* TODO: Reuse ftdi_execute_stableclocks */
305 i = cmd->cmd.runtest->num_cycles;
306 while (i > 0) {
307 /* there are no state transitions in this code, so omit state tracking */
308 unsigned this_len = i > 7 ? 7 : i;
309 mpsse_clock_tms_cs_out(mpsse_ctx, &zero, 0, this_len, false, JTAG_MODE);
310 i -= this_len;
311 }
312
313 ftdi_end_state(cmd->cmd.runtest->end_state);
314
315 if (tap_get_state() != tap_get_end_state())
316 move_to_state(tap_get_end_state());
317
318 DEBUG_JTAG_IO("runtest: %i, end in %s",
319 cmd->cmd.runtest->num_cycles,
320 tap_state_name(tap_get_end_state()));
321 }
322
323 static void ftdi_execute_statemove(struct jtag_command *cmd)
324 {
325 DEBUG_JTAG_IO("statemove end in %s",
326 tap_state_name(cmd->cmd.statemove->end_state));
327
328 ftdi_end_state(cmd->cmd.statemove->end_state);
329
330 /* shortest-path move to desired end state */
331 if (tap_get_state() != tap_get_end_state() || tap_get_end_state() == TAP_RESET)
332 move_to_state(tap_get_end_state());
333 }
334
335 /**
336 * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG
337 * (or SWD) state machine. REVISIT: Not the best method, perhaps.
338 */
339 static void ftdi_execute_tms(struct jtag_command *cmd)
340 {
341 DEBUG_JTAG_IO("TMS: %d bits", cmd->cmd.tms->num_bits);
342
343 /* TODO: Missing tap state tracking, also missing from ft2232.c! */
344 mpsse_clock_tms_cs_out(mpsse_ctx,
345 cmd->cmd.tms->bits,
346 0,
347 cmd->cmd.tms->num_bits,
348 false,
349 JTAG_MODE);
350 }
351
352 static void ftdi_execute_pathmove(struct jtag_command *cmd)
353 {
354 tap_state_t *path = cmd->cmd.pathmove->path;
355 int num_states = cmd->cmd.pathmove->num_states;
356
357 DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
358 tap_state_name(tap_get_state()),
359 tap_state_name(path[num_states-1]));
360
361 int state_count = 0;
362 unsigned bit_count = 0;
363 uint8_t tms_byte = 0;
364
365 DEBUG_JTAG_IO("-");
366
367 /* this loop verifies that the path is legal and logs each state in the path */
368 while (num_states--) {
369
370 /* either TMS=0 or TMS=1 must work ... */
371 if (tap_state_transition(tap_get_state(), false)
372 == path[state_count])
373 buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
374 else if (tap_state_transition(tap_get_state(), true)
375 == path[state_count]) {
376 buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
377
378 /* ... or else the caller goofed BADLY */
379 } else {
380 LOG_ERROR("BUG: %s -> %s isn't a valid "
381 "TAP state transition",
382 tap_state_name(tap_get_state()),
383 tap_state_name(path[state_count]));
384 exit(-1);
385 }
386
387 tap_set_state(path[state_count]);
388 state_count++;
389
390 if (bit_count == 7 || num_states == 0) {
391 mpsse_clock_tms_cs_out(mpsse_ctx,
392 &tms_byte,
393 0,
394 bit_count,
395 false,
396 JTAG_MODE);
397 bit_count = 0;
398 }
399 }
400 tap_set_end_state(tap_get_state());
401 }
402
403 static void ftdi_execute_scan(struct jtag_command *cmd)
404 {
405 DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN",
406 jtag_scan_type(cmd->cmd.scan));
407
408 /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
409 while (cmd->cmd.scan->num_fields > 0
410 && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 1].num_bits == 0) {
411 cmd->cmd.scan->num_fields--;
412 LOG_DEBUG("discarding trailing empty field");
413 }
414
415 if (cmd->cmd.scan->num_fields == 0) {
416 LOG_DEBUG("empty scan, doing nothing");
417 return;
418 }
419
420 if (cmd->cmd.scan->ir_scan) {
421 if (tap_get_state() != TAP_IRSHIFT)
422 move_to_state(TAP_IRSHIFT);
423 } else {
424 if (tap_get_state() != TAP_DRSHIFT)
425 move_to_state(TAP_DRSHIFT);
426 }
427
428 ftdi_end_state(cmd->cmd.scan->end_state);
429
430 struct scan_field *field = cmd->cmd.scan->fields;
431 unsigned scan_size = 0;
432
433 for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
434 scan_size += field->num_bits;
435 DEBUG_JTAG_IO("%s%s field %d/%d %d bits",
436 field->in_value ? "in" : "",
437 field->out_value ? "out" : "",
438 i,
439 cmd->cmd.scan->num_fields,
440 field->num_bits);
441
442 if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != tap_get_end_state()) {
443 /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
444 * movement. This last field can't have length zero, it was checked above. */
445 mpsse_clock_data(mpsse_ctx,
446 field->out_value,
447 0,
448 field->in_value,
449 0,
450 field->num_bits - 1,
451 JTAG_MODE);
452 uint8_t last_bit = 0;
453 if (field->out_value)
454 bit_copy(&last_bit, 0, field->out_value, field->num_bits - 1, 1);
455 uint8_t tms_bits = 0x01;
456 mpsse_clock_tms_cs(mpsse_ctx,
457 &tms_bits,
458 0,
459 field->in_value,
460 field->num_bits - 1,
461 1,
462 last_bit,
463 JTAG_MODE);
464 tap_set_state(tap_state_transition(tap_get_state(), 1));
465 mpsse_clock_tms_cs_out(mpsse_ctx,
466 &tms_bits,
467 1,
468 1,
469 last_bit,
470 JTAG_MODE);
471 tap_set_state(tap_state_transition(tap_get_state(), 0));
472 } else
473 mpsse_clock_data(mpsse_ctx,
474 field->out_value,
475 0,
476 field->in_value,
477 0,
478 field->num_bits,
479 JTAG_MODE);
480 }
481
482 if (tap_get_state() != tap_get_end_state())
483 move_to_state(tap_get_end_state());
484
485 DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
486 (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
487 tap_state_name(tap_get_end_state()));
488 }
489
490 static void ftdi_execute_reset(struct jtag_command *cmd)
491 {
492 DEBUG_JTAG_IO("reset trst: %i srst %i",
493 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
494
495 if (cmd->cmd.reset->trst == 1
496 || (cmd->cmd.reset->srst
497 && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
498 tap_set_state(TAP_RESET);
499
500 struct signal *trst = find_signal_by_name("nTRST");
501 if (cmd->cmd.reset->trst == 1) {
502 if (trst)
503 ftdi_set_signal(trst, '0');
504 else
505 LOG_ERROR("Can't assert TRST: nTRST signal is not defined");
506 } else if (trst && cmd->cmd.reset->trst == 0) {
507 if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN)
508 ftdi_set_signal(trst, 'z');
509 else
510 ftdi_set_signal(trst, '1');
511 }
512
513 struct signal *srst = find_signal_by_name("nSRST");
514 if (cmd->cmd.reset->srst == 1) {
515 if (srst)
516 ftdi_set_signal(srst, '0');
517 else
518 LOG_ERROR("Can't assert SRST: nSRST signal is not defined");
519 } else if (srst && 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 = swd_mode ? swd_output_init : jtag_output_init;
638 direction = swd_mode ? swd_direction_init : jtag_direction_init;
639
640 mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
641 mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
642
643 mpsse_loopback_config(mpsse_ctx, false);
644
645 /* Set a low default */
646 freq = mpsse_set_frequency(mpsse_ctx, 1000);
647
648 if (swd_mode)
649 ftdi_swd_switch_seq(NULL, JTAG_TO_SWD);
650 else
651 ftdi_swd_switch_seq(NULL, SWD_TO_JTAG);
652
653 return mpsse_flush(mpsse_ctx);
654 }
655
656 static int ftdi_quit(void)
657 {
658 mpsse_close(mpsse_ctx);
659
660 return ERROR_OK;
661 }
662
663 COMMAND_HANDLER(ftdi_handle_device_desc_command)
664 {
665 if (CMD_ARGC == 1) {
666 if (ftdi_device_desc)
667 free(ftdi_device_desc);
668 ftdi_device_desc = strdup(CMD_ARGV[0]);
669 } else {
670 LOG_ERROR("expected exactly one argument to ftdi_device_desc <description>");
671 }
672
673 return ERROR_OK;
674 }
675
676 COMMAND_HANDLER(ftdi_handle_serial_command)
677 {
678 if (CMD_ARGC == 1) {
679 if (ftdi_serial)
680 free(ftdi_serial);
681 ftdi_serial = strdup(CMD_ARGV[0]);
682 } else {
683 return ERROR_COMMAND_SYNTAX_ERROR;
684 }
685
686 return ERROR_OK;
687 }
688
689 COMMAND_HANDLER(ftdi_handle_channel_command)
690 {
691 if (CMD_ARGC == 1)
692 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], ftdi_channel);
693 else
694 return ERROR_COMMAND_SYNTAX_ERROR;
695
696 return ERROR_OK;
697 }
698
699 COMMAND_HANDLER(ftdi_handle_layout_init_command)
700 {
701 if (CMD_ARGC != 2)
702 return ERROR_COMMAND_SYNTAX_ERROR;
703
704 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], jtag_output_init);
705 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], jtag_direction_init);
706
707 return ERROR_OK;
708 }
709
710 COMMAND_HANDLER(ftdi_handle_layout_init_swd_command)
711 {
712 if (CMD_ARGC != 2)
713 return ERROR_COMMAND_SYNTAX_ERROR;
714
715 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], swd_output_init);
716 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], swd_direction_init);
717
718 return ERROR_OK;
719 }
720
721 COMMAND_HANDLER(ftdi_handle_layout_signal_command)
722 {
723 if (CMD_ARGC < 1)
724 return ERROR_COMMAND_SYNTAX_ERROR;
725
726 bool invert_data = false;
727 uint16_t data_mask = 0;
728 bool invert_oe = false;
729 uint16_t oe_mask = 0;
730 for (unsigned i = 1; i < CMD_ARGC; i += 2) {
731 if (strcmp("-data", CMD_ARGV[i]) == 0) {
732 invert_data = false;
733 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], data_mask);
734 } else if (strcmp("-ndata", CMD_ARGV[i]) == 0) {
735 invert_data = true;
736 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], data_mask);
737 } else if (strcmp("-oe", CMD_ARGV[i]) == 0) {
738 invert_oe = false;
739 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], oe_mask);
740 } else if (strcmp("-noe", CMD_ARGV[i]) == 0) {
741 invert_oe = true;
742 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], oe_mask);
743 } else if (!strcmp("-alias", CMD_ARGV[i]) ||
744 !strcmp("-nalias", CMD_ARGV[i])) {
745 if (!strcmp("-nalias", CMD_ARGV[i]))
746 invert_data = true;
747 struct signal *sig = find_signal_by_name(CMD_ARGV[i + 1]);
748 if (!sig) {
749 LOG_ERROR("signal %s is not defined", CMD_ARGV[i + 1]);
750 return ERROR_FAIL;
751 }
752 data_mask = sig->data_mask;
753 oe_mask = sig->oe_mask;
754 invert_oe = sig->invert_oe;
755 invert_data ^= sig->invert_data;
756 } else {
757 LOG_ERROR("unknown option '%s'", CMD_ARGV[i]);
758 return ERROR_COMMAND_SYNTAX_ERROR;
759 }
760 }
761
762 struct signal *sig;
763 sig = find_signal_by_name(CMD_ARGV[0]);
764 if (!sig)
765 sig = create_signal(CMD_ARGV[0]);
766 if (!sig) {
767 LOG_ERROR("failed to create signal %s", CMD_ARGV[0]);
768 return ERROR_FAIL;
769 }
770
771 sig->invert_data = invert_data;
772 sig->data_mask = data_mask;
773 sig->invert_oe = invert_oe;
774 sig->oe_mask = oe_mask;
775
776 return ERROR_OK;
777 }
778
779 COMMAND_HANDLER(ftdi_handle_set_signal_command)
780 {
781 if (CMD_ARGC < 2)
782 return ERROR_COMMAND_SYNTAX_ERROR;
783
784 struct signal *sig;
785 sig = find_signal_by_name(CMD_ARGV[0]);
786 if (!sig) {
787 LOG_ERROR("interface configuration doesn't define signal '%s'", CMD_ARGV[0]);
788 return ERROR_FAIL;
789 }
790
791 switch (*CMD_ARGV[1]) {
792 case '0':
793 case '1':
794 case 'z':
795 case 'Z':
796 /* single character level specifier only */
797 if (CMD_ARGV[1][1] == '\0') {
798 ftdi_set_signal(sig, *CMD_ARGV[1]);
799 break;
800 }
801 default:
802 LOG_ERROR("unknown signal level '%s', use 0, 1 or z", CMD_ARGV[1]);
803 return ERROR_COMMAND_SYNTAX_ERROR;
804 }
805
806 return mpsse_flush(mpsse_ctx);
807 }
808
809 COMMAND_HANDLER(ftdi_handle_vid_pid_command)
810 {
811 if (CMD_ARGC > MAX_USB_IDS * 2) {
812 LOG_WARNING("ignoring extra IDs in ftdi_vid_pid "
813 "(maximum is %d pairs)", MAX_USB_IDS);
814 CMD_ARGC = MAX_USB_IDS * 2;
815 }
816 if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
817 LOG_WARNING("incomplete ftdi_vid_pid configuration directive");
818 if (CMD_ARGC < 2)
819 return ERROR_COMMAND_SYNTAX_ERROR;
820 /* remove the incomplete trailing id */
821 CMD_ARGC -= 1;
822 }
823
824 unsigned i;
825 for (i = 0; i < CMD_ARGC; i += 2) {
826 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], ftdi_vid[i >> 1]);
827 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], ftdi_pid[i >> 1]);
828 }
829
830 /*
831 * Explicitly terminate, in case there are multiples instances of
832 * ftdi_vid_pid.
833 */
834 ftdi_vid[i >> 1] = ftdi_pid[i >> 1] = 0;
835
836 return ERROR_OK;
837 }
838
839 static const struct command_registration ftdi_command_handlers[] = {
840 {
841 .name = "ftdi_device_desc",
842 .handler = &ftdi_handle_device_desc_command,
843 .mode = COMMAND_CONFIG,
844 .help = "set the USB device description of the FTDI device",
845 .usage = "description_string",
846 },
847 {
848 .name = "ftdi_serial",
849 .handler = &ftdi_handle_serial_command,
850 .mode = COMMAND_CONFIG,
851 .help = "set the serial number of the FTDI device",
852 .usage = "serial_string",
853 },
854 {
855 .name = "ftdi_channel",
856 .handler = &ftdi_handle_channel_command,
857 .mode = COMMAND_CONFIG,
858 .help = "set the channel of the FTDI device that is used as JTAG",
859 .usage = "(0-3)",
860 },
861 {
862 .name = "ftdi_layout_init",
863 .handler = &ftdi_handle_layout_init_command,
864 .mode = COMMAND_CONFIG,
865 .help = "initialize the FTDI GPIO signals used "
866 "to control output-enables and reset signals"
867 "when JTAG mode is selected",
868 .usage = "data direction",
869 },
870 {
871 .name = "ftdi_layout_init_swd",
872 .handler = &ftdi_handle_layout_init_swd_command,
873 .mode = COMMAND_CONFIG,
874 .help = "initialize the FTDI GPIO signals used "
875 "to control output-enables and reset signals"
876 "when SWD mode is selected",
877 .usage = "data direction",
878 },
879 {
880 .name = "ftdi_layout_signal",
881 .handler = &ftdi_handle_layout_signal_command,
882 .mode = COMMAND_ANY,
883 .help = "define a signal controlled by one or more FTDI GPIO as data "
884 "and/or output enable",
885 .usage = "name [-data mask|-ndata mask] [-oe mask|-noe mask] [-alias|-nalias name]",
886 },
887 {
888 .name = "ftdi_set_signal",
889 .handler = &ftdi_handle_set_signal_command,
890 .mode = COMMAND_EXEC,
891 .help = "control a layout-specific signal",
892 .usage = "name (1|0|z)",
893 },
894 {
895 .name = "ftdi_vid_pid",
896 .handler = &ftdi_handle_vid_pid_command,
897 .mode = COMMAND_CONFIG,
898 .help = "the vendor ID and product ID of the FTDI device",
899 .usage = "(vid pid)* ",
900 },
901 COMMAND_REGISTRATION_DONE
902 };
903
904 static int create_default_signal(const char *name, uint16_t data_mask)
905 {
906 struct signal *sig = create_signal(name);
907 if (!sig) {
908 LOG_ERROR("failed to create signal %s", name);
909 return ERROR_FAIL;
910 }
911 sig->invert_data = false;
912 sig->data_mask = data_mask;
913 sig->invert_oe = false;
914 sig->oe_mask = 0;
915
916 return ERROR_OK;
917 }
918
919 static int create_signals(void)
920 {
921 if (create_default_signal("TCK", 0x01) != ERROR_OK)
922 return ERROR_FAIL;
923 if (create_default_signal("TDI", 0x02) != ERROR_OK)
924 return ERROR_FAIL;
925 if (create_default_signal("TDO", 0x04) != ERROR_OK)
926 return ERROR_FAIL;
927 if (create_default_signal("TMS", 0x08) != ERROR_OK)
928 return ERROR_FAIL;
929 return ERROR_OK;
930 }
931
932 static int ftdi_swd_init(void)
933 {
934 LOG_INFO("FTDI SWD mode enabled");
935 swd_mode = true;
936
937 if (create_signals() != ERROR_OK)
938 return ERROR_FAIL;
939
940 swd_cmd_queue_alloced = 10;
941 swd_cmd_queue = malloc(swd_cmd_queue_alloced * sizeof(*swd_cmd_queue));
942
943 return swd_cmd_queue != NULL ? ERROR_OK : ERROR_FAIL;
944 }
945
946 static void ftdi_swd_swdio_en(bool enable)
947 {
948 struct signal *oe = find_signal_by_name("SWDIO_OE");
949 if (oe)
950 ftdi_set_signal(oe, enable ? '1' : '0');
951 }
952
953 /**
954 * Flush the MPSSE queue and process the SWD transaction queue
955 * @param dap
956 * @return
957 */
958 static int ftdi_swd_run_queue(struct adiv5_dap *dap)
959 {
960 LOG_DEBUG("Executing %zu queued transactions", swd_cmd_queue_length);
961 int retval;
962 struct signal *led = find_signal_by_name("LED");
963
964 if (queued_retval != ERROR_OK) {
965 LOG_DEBUG("Skipping due to previous errors: %d", queued_retval);
966 goto skip;
967 }
968
969 /* A transaction must be followed by another transaction or at least 8 idle cycles to
970 * ensure that data is clocked through the AP. */
971 mpsse_clock_data_out(mpsse_ctx, NULL, 0, 8, SWD_MODE);
972
973 /* Terminate the "blink", if the current layout has that feature */
974 if (led)
975 ftdi_set_signal(led, '0');
976
977 queued_retval = mpsse_flush(mpsse_ctx);
978 if (queued_retval != ERROR_OK) {
979 LOG_ERROR("MPSSE failed");
980 goto skip;
981 }
982
983 for (size_t i = 0; i < swd_cmd_queue_length; i++) {
984 int ack = buf_get_u32(&swd_cmd_queue[i].trn_ack_data_parity_trn, 1, 3);
985
986 LOG_DEBUG("%s %s %s reg %X = %08"PRIx32,
987 ack == SWD_ACK_OK ? "OK" : ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK",
988 swd_cmd_queue[i].cmd & SWD_CMD_APnDP ? "AP" : "DP",
989 swd_cmd_queue[i].cmd & SWD_CMD_RnW ? "read" : "write",
990 (swd_cmd_queue[i].cmd & SWD_CMD_A32) >> 1,
991 buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn,
992 1 + 3 + (swd_cmd_queue[i].cmd & SWD_CMD_RnW ? 0 : 1), 32));
993
994 if (ack != SWD_ACK_OK) {
995 queued_retval = ack;
996 goto skip;
997
998 } else if (swd_cmd_queue[i].cmd & SWD_CMD_RnW) {
999 uint32_t data = buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3, 32);
1000 int parity = buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 32, 1);
1001
1002 if (parity != parity_u32(data)) {
1003 LOG_ERROR("SWD Read data parity mismatch");
1004 queued_retval = ERROR_FAIL;
1005 goto skip;
1006 }
1007
1008 if (swd_cmd_queue[i].dst != NULL)
1009 *swd_cmd_queue[i].dst = data;
1010 }
1011 }
1012
1013 skip:
1014 swd_cmd_queue_length = 0;
1015 retval = queued_retval;
1016 queued_retval = ERROR_OK;
1017
1018 /* Queue a new "blink" */
1019 if (led && retval == ERROR_OK)
1020 ftdi_set_signal(led, '1');
1021
1022 return retval;
1023 }
1024
1025 static void ftdi_swd_queue_cmd(struct adiv5_dap *dap, uint8_t cmd, uint32_t *dst, uint32_t data)
1026 {
1027 if (swd_cmd_queue_length >= swd_cmd_queue_alloced) {
1028 /* Not enough room in the queue. Run the queue and increase its size for next time.
1029 * Note that it's not possible to avoid running the queue here, because mpsse contains
1030 * pointers into the queue which may be invalid after the realloc. */
1031 queued_retval = ftdi_swd_run_queue(dap);
1032 struct swd_cmd_queue_entry *q = realloc(swd_cmd_queue, swd_cmd_queue_alloced * 2 * sizeof(*swd_cmd_queue));
1033 if (q != NULL) {
1034 swd_cmd_queue = q;
1035 swd_cmd_queue_alloced *= 2;
1036 LOG_DEBUG("Increased SWD command queue to %zu elements", swd_cmd_queue_alloced);
1037 }
1038 }
1039
1040 if (queued_retval != ERROR_OK)
1041 return;
1042
1043 size_t i = swd_cmd_queue_length++;
1044 swd_cmd_queue[i].cmd = cmd | SWD_CMD_START | SWD_CMD_PARK;
1045
1046 mpsse_clock_data_out(mpsse_ctx, &swd_cmd_queue[i].cmd, 0, 8, SWD_MODE);
1047
1048 if (swd_cmd_queue[i].cmd & SWD_CMD_RnW) {
1049 /* Queue a read transaction */
1050 swd_cmd_queue[i].dst = dst;
1051
1052 ftdi_swd_swdio_en(false);
1053 mpsse_clock_data_in(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1054 0, 1 + 3 + 32 + 1 + 1, SWD_MODE);
1055 ftdi_swd_swdio_en(true);
1056 } else {
1057 /* Queue a write transaction */
1058 ftdi_swd_swdio_en(false);
1059
1060 mpsse_clock_data_in(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1061 0, 1 + 3 + 1, SWD_MODE);
1062
1063 ftdi_swd_swdio_en(true);
1064
1065 buf_set_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 1, 32, data);
1066 buf_set_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1 + 3 + 1 + 32, 1, parity_u32(data));
1067
1068 mpsse_clock_data_out(mpsse_ctx, swd_cmd_queue[i].trn_ack_data_parity_trn,
1069 1 + 3 + 1, 32 + 1, SWD_MODE);
1070 }
1071
1072 /* Insert idle cycles after AP accesses to avoid WAIT */
1073 if (cmd & SWD_CMD_APnDP)
1074 mpsse_clock_data_out(mpsse_ctx, NULL, 0, dap->memaccess_tck, SWD_MODE);
1075
1076 }
1077
1078 static void ftdi_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *value)
1079 {
1080 assert(cmd & SWD_CMD_RnW);
1081 ftdi_swd_queue_cmd(dap, cmd, value, 0);
1082 }
1083
1084 static void ftdi_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t value)
1085 {
1086 assert(!(cmd & SWD_CMD_RnW));
1087 ftdi_swd_queue_cmd(dap, cmd, NULL, value);
1088 }
1089
1090 static int_least32_t ftdi_swd_frequency(struct adiv5_dap *dap, int_least32_t hz)
1091 {
1092 if (hz > 0)
1093 freq = mpsse_set_frequency(mpsse_ctx, hz);
1094
1095 return freq;
1096 }
1097
1098 static int ftdi_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq)
1099 {
1100 switch (seq) {
1101 case LINE_RESET:
1102 LOG_DEBUG("SWD line reset");
1103 mpsse_clock_data_out(mpsse_ctx, swd_seq_line_reset, 0, swd_seq_line_reset_len, SWD_MODE);
1104 break;
1105 case JTAG_TO_SWD:
1106 LOG_DEBUG("JTAG-to-SWD");
1107 mpsse_clock_data_out(mpsse_ctx, swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len, SWD_MODE);
1108 break;
1109 case SWD_TO_JTAG:
1110 LOG_DEBUG("SWD-to-JTAG");
1111 mpsse_clock_data_out(mpsse_ctx, swd_seq_swd_to_jtag, 0, swd_seq_swd_to_jtag_len, SWD_MODE);
1112 break;
1113 default:
1114 LOG_ERROR("Sequence %d not supported", seq);
1115 return ERROR_FAIL;
1116 }
1117
1118 return ERROR_OK;
1119 }
1120
1121 static const struct swd_driver ftdi_swd = {
1122 .init = ftdi_swd_init,
1123 .frequency = ftdi_swd_frequency,
1124 .switch_seq = ftdi_swd_switch_seq,
1125 .read_reg = ftdi_swd_read_reg,
1126 .write_reg = ftdi_swd_write_reg,
1127 .run = ftdi_swd_run_queue,
1128 };
1129
1130 static const char * const ftdi_transports[] = { "jtag", "swd", NULL };
1131
1132 struct jtag_interface ftdi_interface = {
1133 .name = "ftdi",
1134 .supported = DEBUG_CAP_TMS_SEQ,
1135 .commands = ftdi_command_handlers,
1136 .transports = ftdi_transports,
1137 .swd = &ftdi_swd,
1138
1139 .init = ftdi_initialize,
1140 .quit = ftdi_quit,
1141 .speed = ftdi_speed,
1142 .speed_div = ftdi_speed_div,
1143 .khz = ftdi_khz,
1144 .execute_queue = ftdi_execute_queue,
1145 };

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)