jtag: constify driver arrays
[openocd.git] / src / jtag / drivers / ft2232.c
1 /***************************************************************************
2 * Copyright (C) 2009 by Øyvind Harboe *
3 * Øyvind Harboe <oyvind.harboe@zylin.com> *
4 * *
5 * Copyright (C) 2009 by SoftPLC Corporation. http://softplc.com *
6 * Dick Hollenbeck <dick@softplc.com> *
7 * *
8 * Copyright (C) 2004, 2006 by Dominic Rath *
9 * Dominic.Rath@gmx.de *
10 * *
11 * Copyright (C) 2008 by Spencer Oliver *
12 * spen@spen-soft.co.uk *
13 * *
14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. *
18 * *
19 * This program is distributed in the hope that it will be useful, *
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22 * GNU General Public License for more details. *
23 * *
24 * You should have received a copy of the GNU General Public License *
25 * along with this program; if not, write to the *
26 * Free Software Foundation, Inc., *
27 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
28 ***************************************************************************/
29
30 /**
31 * @file
32 * JTAG adapters based on the FT2232 full and high speed USB parts are
33 * popular low cost JTAG debug solutions. Many FT2232 based JTAG adapters
34 * are discrete, but development boards may integrate them as alternatives
35 * to more capable (and expensive) third party JTAG pods.
36 *
37 * JTAG uses only one of the two communications channels ("MPSSE engines")
38 * on these devices. Adapters based on FT4232 parts have four ports/channels
39 * (A/B/C/D), instead of just two (A/B).
40 *
41 * Especially on development boards integrating one of these chips (as
42 * opposed to discrete pods/dongles), the additional channels can be used
43 * for a variety of purposes, but OpenOCD only uses one channel at a time.
44 *
45 * - As a USB-to-serial adapter for the target's console UART ...
46 * which may be able to support ROM boot loaders that load initial
47 * firmware images to flash (or SRAM).
48 *
49 * - On systems which support ARM's SWD in addition to JTAG, or instead
50 * of it, that second port can be used for reading SWV/SWO trace data.
51 *
52 * - Additional JTAG links, e.g. to a CPLD or * FPGA.
53 *
54 * FT2232 based JTAG adapters are "dumb" not "smart", because most JTAG
55 * request/response interactions involve round trips over the USB link.
56 * A "smart" JTAG adapter has intelligence close to the scan chain, so it
57 * can for example poll quickly for a status change (usually taking on the
58 * order of microseconds not milliseconds) before beginning a queued
59 * transaction which require the previous one to have completed.
60 *
61 * There are dozens of adapters of this type, differing in details which
62 * this driver needs to understand. Those "layout" details are required
63 * as part of FT2232 driver configuration.
64 *
65 * This code uses information contained in the MPSSE specification which was
66 * found here:
67 * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
68 * Hereafter this is called the "MPSSE Spec".
69 *
70 * The datasheet for the ftdichip.com's FT2232D part is here:
71 * http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
72 *
73 * Also note the issue with code 0x4b (clock data to TMS) noted in
74 * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
75 * which can affect longer JTAG state paths.
76 */
77
78 #ifdef HAVE_CONFIG_H
79 #include "config.h"
80 #endif
81
82 /* project specific includes */
83 #include <jtag/interface.h>
84 #include <transport/transport.h>
85 #include <helper/time_support.h>
86
87 #if IS_CYGWIN == 1
88 #include <windows.h>
89 #endif
90
91 #include <assert.h>
92
93 #if (BUILD_FT2232_FTD2XX == 1 && BUILD_FT2232_LIBFTDI == 1)
94 #error "BUILD_FT2232_FTD2XX && BUILD_FT2232_LIBFTDI are mutually exclusive"
95 #elif (BUILD_FT2232_FTD2XX != 1 && BUILD_FT2232_LIBFTDI != 1)
96 #error "BUILD_FT2232_FTD2XX || BUILD_FT2232_LIBFTDI must be chosen"
97 #endif
98
99 /* FT2232 access library includes */
100 #if BUILD_FT2232_FTD2XX == 1
101 #include <ftd2xx.h>
102 #include "ftd2xx_common.h"
103
104 enum ftdi_interface {
105 INTERFACE_ANY = 0,
106 INTERFACE_A = 1,
107 INTERFACE_B = 2,
108 INTERFACE_C = 3,
109 INTERFACE_D = 4
110 };
111
112 #elif BUILD_FT2232_LIBFTDI == 1
113 #include <ftdi.h>
114 #endif
115
116 /* max TCK for the high speed devices 30000 kHz */
117 #define FTDI_x232H_MAX_TCK 30000
118 /* max TCK for the full speed devices 6000 kHz */
119 #define FTDI_2232C_MAX_TCK 6000
120 /* this speed value tells that RTCK is requested */
121 #define RTCK_SPEED -1
122
123 /*
124 * On my Athlon XP 1900+ EHCI host with FT2232H JTAG dongle I get read timeout
125 * errors with a retry count of 100. Increasing it solves the problem for me.
126 * - Dimitar
127 *
128 * FIXME There's likely an issue with the usb_read_timeout from libftdi.
129 * Fix that (libusb? kernel? libftdi? here?) and restore the retry count
130 * to something sane.
131 */
132 #define LIBFTDI_READ_RETRY_COUNT 2000
133
134 #ifndef BUILD_FT2232_HIGHSPEED
135 #if BUILD_FT2232_FTD2XX == 1
136 enum { FT_DEVICE_2232H = 6, FT_DEVICE_4232H, FT_DEVICE_232H };
137 #elif BUILD_FT2232_LIBFTDI == 1
138 enum ftdi_chip_type { TYPE_2232H = 4, TYPE_4232H = 5, TYPE_232H = 6 };
139 #endif
140 #endif
141
142 /**
143 * Send out \a num_cycles on the TCK line while the TAP(s) are in a
144 * stable state. Calling code must ensure that current state is stable,
145 * that verification is not done in here.
146 *
147 * @param num_cycles The number of clocks cycles to send.
148 * @param cmd The command to send.
149 *
150 * @returns ERROR_OK on success, or ERROR_JTAG_QUEUE_FAILED on failure.
151 */
152 static int ft2232_stableclocks(int num_cycles, struct jtag_command *cmd);
153
154 static char *ft2232_device_desc_A;
155 static char *ft2232_device_desc;
156 static char *ft2232_serial;
157 static uint8_t ft2232_latency = 2;
158 static unsigned ft2232_max_tck = FTDI_2232C_MAX_TCK;
159 static int ft2232_channel = INTERFACE_ANY;
160
161 #define MAX_USB_IDS 8
162 /* vid = pid = 0 marks the end of the list */
163 static uint16_t ft2232_vid[MAX_USB_IDS + 1] = { 0x0403, 0 };
164 static uint16_t ft2232_pid[MAX_USB_IDS + 1] = { 0x6010, 0 };
165
166 struct ft2232_layout {
167 const char *name;
168 int (*init)(void);
169 void (*reset)(int trst, int srst);
170 void (*blink)(void);
171 int channel;
172 };
173
174 /* init procedures for supported layouts */
175 static int usbjtag_init(void);
176 static int jtagkey_init(void);
177 static int lm3s811_jtag_init(void);
178 static int icdi_jtag_init(void);
179 static int olimex_jtag_init(void);
180 static int flyswatter1_init(void);
181 static int flyswatter2_init(void);
182 static int minimodule_init(void);
183 static int turtle_init(void);
184 static int comstick_init(void);
185 static int stm32stick_init(void);
186 static int axm0432_jtag_init(void);
187 static int sheevaplug_init(void);
188 static int icebear_jtag_init(void);
189 static int cortino_jtag_init(void);
190 static int signalyzer_init(void);
191 static int signalyzer_h_init(void);
192 static int ktlink_init(void);
193 static int redbee_init(void);
194 static int lisa_l_init(void);
195 static int flossjtag_init(void);
196 static int xds100v2_init(void);
197 static int digilent_hs1_init(void);
198
199 /* reset procedures for supported layouts */
200 static void ftx23_reset(int trst, int srst);
201 static void jtagkey_reset(int trst, int srst);
202 static void olimex_jtag_reset(int trst, int srst);
203 static void flyswatter1_reset(int trst, int srst);
204 static void flyswatter2_reset(int trst, int srst);
205 static void minimodule_reset(int trst, int srst);
206 static void turtle_reset(int trst, int srst);
207 static void comstick_reset(int trst, int srst);
208 static void stm32stick_reset(int trst, int srst);
209 static void axm0432_jtag_reset(int trst, int srst);
210 static void sheevaplug_reset(int trst, int srst);
211 static void icebear_jtag_reset(int trst, int srst);
212 static void signalyzer_h_reset(int trst, int srst);
213 static void ktlink_reset(int trst, int srst);
214 static void redbee_reset(int trst, int srst);
215 static void xds100v2_reset(int trst, int srst);
216 static void digilent_hs1_reset(int trst, int srst);
217
218 /* blink procedures for layouts that support a blinking led */
219 static void olimex_jtag_blink(void);
220 static void flyswatter1_jtag_blink(void);
221 static void flyswatter2_jtag_blink(void);
222 static void turtle_jtag_blink(void);
223 static void signalyzer_h_blink(void);
224 static void ktlink_blink(void);
225 static void lisa_l_blink(void);
226 static void flossjtag_blink(void);
227
228 /* common transport support options */
229
230 /* static const char *jtag_and_swd[] = { "jtag", "swd", NULL }; */
231
232 static const struct ft2232_layout ft2232_layouts[] = {
233 { .name = "usbjtag",
234 .init = usbjtag_init,
235 .reset = ftx23_reset,
236 },
237 { .name = "jtagkey",
238 .init = jtagkey_init,
239 .reset = jtagkey_reset,
240 },
241 { .name = "jtagkey_prototype_v1",
242 .init = jtagkey_init,
243 .reset = jtagkey_reset,
244 },
245 { .name = "oocdlink",
246 .init = jtagkey_init,
247 .reset = jtagkey_reset,
248 },
249 { .name = "signalyzer",
250 .init = signalyzer_init,
251 .reset = ftx23_reset,
252 },
253 { .name = "evb_lm3s811",
254 .init = lm3s811_jtag_init,
255 .reset = ftx23_reset,
256 },
257 { .name = "luminary_icdi",
258 .init = icdi_jtag_init,
259 .reset = ftx23_reset,
260 },
261 { .name = "olimex-jtag",
262 .init = olimex_jtag_init,
263 .reset = olimex_jtag_reset,
264 .blink = olimex_jtag_blink
265 },
266 { .name = "flyswatter",
267 .init = flyswatter1_init,
268 .reset = flyswatter1_reset,
269 .blink = flyswatter1_jtag_blink
270 },
271 { .name = "flyswatter2",
272 .init = flyswatter2_init,
273 .reset = flyswatter2_reset,
274 .blink = flyswatter2_jtag_blink
275 },
276 { .name = "minimodule",
277 .init = minimodule_init,
278 .reset = minimodule_reset,
279 },
280 { .name = "turtelizer2",
281 .init = turtle_init,
282 .reset = turtle_reset,
283 .blink = turtle_jtag_blink
284 },
285 { .name = "comstick",
286 .init = comstick_init,
287 .reset = comstick_reset,
288 },
289 { .name = "stm32stick",
290 .init = stm32stick_init,
291 .reset = stm32stick_reset,
292 },
293 { .name = "axm0432_jtag",
294 .init = axm0432_jtag_init,
295 .reset = axm0432_jtag_reset,
296 },
297 { .name = "sheevaplug",
298 .init = sheevaplug_init,
299 .reset = sheevaplug_reset,
300 },
301 { .name = "icebear",
302 .init = icebear_jtag_init,
303 .reset = icebear_jtag_reset,
304 },
305 { .name = "cortino",
306 .init = cortino_jtag_init,
307 .reset = comstick_reset,
308 },
309 { .name = "signalyzer-h",
310 .init = signalyzer_h_init,
311 .reset = signalyzer_h_reset,
312 .blink = signalyzer_h_blink
313 },
314 { .name = "ktlink",
315 .init = ktlink_init,
316 .reset = ktlink_reset,
317 .blink = ktlink_blink
318 },
319 { .name = "redbee-econotag",
320 .init = redbee_init,
321 .reset = redbee_reset,
322 },
323 { .name = "redbee-usb",
324 .init = redbee_init,
325 .reset = redbee_reset,
326 .channel = INTERFACE_B,
327 },
328 { .name = "lisa-l",
329 .init = lisa_l_init,
330 .reset = ftx23_reset,
331 .blink = lisa_l_blink,
332 .channel = INTERFACE_B,
333 },
334 { .name = "flossjtag",
335 .init = flossjtag_init,
336 .reset = ftx23_reset,
337 .blink = flossjtag_blink,
338 },
339 { .name = "xds100v2",
340 .init = xds100v2_init,
341 .reset = xds100v2_reset,
342 },
343 { .name = "digilent-hs1",
344 .init = digilent_hs1_init,
345 .reset = digilent_hs1_reset,
346 .channel = INTERFACE_A,
347 },
348 { .name = NULL, /* END OF TABLE */ },
349 };
350
351 /* bitmask used to drive nTRST; usually a GPIOLx signal */
352 static uint8_t nTRST;
353 static uint8_t nTRSTnOE;
354 /* bitmask used to drive nSRST; usually a GPIOLx signal */
355 static uint8_t nSRST;
356 static uint8_t nSRSTnOE;
357
358 /** the layout being used with this debug session */
359 static const struct ft2232_layout *layout;
360
361 /** default bitmask values driven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
362 static uint8_t low_output;
363
364 /* note that direction bit == 1 means that signal is an output */
365
366 /** default direction bitmask for DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
367 static uint8_t low_direction;
368 /** default value bitmask for CBUS GPIOH(0..4) */
369 static uint8_t high_output;
370 /** default direction bitmask for CBUS GPIOH(0..4) */
371 static uint8_t high_direction;
372
373 #if BUILD_FT2232_FTD2XX == 1
374 static FT_HANDLE ftdih;
375 static FT_DEVICE ftdi_device;
376 #elif BUILD_FT2232_LIBFTDI == 1
377 static struct ftdi_context ftdic;
378 static enum ftdi_chip_type ftdi_device;
379 #endif
380
381 static struct jtag_command *first_unsent; /* next command that has to be sent */
382 static int require_send;
383
384 /* http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
385
386 "There is a significant difference between libftdi and libftd2xx. The latter
387 one allows to schedule up to 64*64 bytes of result data while libftdi fails
388 with more than 4*64. As a consequence, the FT2232 driver is forced to
389 perform around 16x more USB transactions for long command streams with TDO
390 capture when running with libftdi."
391
392 No idea how we get
393 #define FT2232_BUFFER_SIZE 131072
394 a comment would have been nice.
395 */
396
397 #if BUILD_FT2232_FTD2XX == 1
398 #define FT2232_BUFFER_READ_QUEUE_SIZE (64*64)
399 #else
400 #define FT2232_BUFFER_READ_QUEUE_SIZE (64*4)
401 #endif
402
403 #define FT2232_BUFFER_SIZE 131072
404
405 static uint8_t *ft2232_buffer;
406 static int ft2232_buffer_size;
407 static int ft2232_read_pointer;
408 static int ft2232_expect_read;
409
410 /**
411 * Function buffer_write
412 * writes a byte into the byte buffer, "ft2232_buffer", which must be sent later.
413 * @param val is the byte to send.
414 */
415 static inline void buffer_write(uint8_t val)
416 {
417 assert(ft2232_buffer);
418 assert((unsigned) ft2232_buffer_size < (unsigned) FT2232_BUFFER_SIZE);
419 ft2232_buffer[ft2232_buffer_size++] = val;
420 }
421
422 /**
423 * Function buffer_read
424 * returns a byte from the byte buffer.
425 */
426 static inline uint8_t buffer_read(void)
427 {
428 assert(ft2232_buffer);
429 assert(ft2232_read_pointer < ft2232_buffer_size);
430 return ft2232_buffer[ft2232_read_pointer++];
431 }
432
433 /**
434 * Clocks out \a bit_count bits on the TMS line, starting with the least
435 * significant bit of tms_bits and progressing to more significant bits.
436 * Rigorous state transition logging is done here via tap_set_state().
437 *
438 * @param mpsse_cmd One of the MPSSE TMS oriented commands such as
439 * 0x4b or 0x6b. See the MPSSE spec referenced above for their
440 * functionality. The MPSSE command "Clock Data to TMS/CS Pin (no Read)"
441 * is often used for this, 0x4b.
442 *
443 * @param tms_bits Holds the sequence of bits to send.
444 * @param tms_count Tells how many bits in the sequence.
445 * @param tdi_bit A single bit to pass on to TDI before the first TCK
446 * cycle and held static for the duration of TMS clocking.
447 *
448 * See the MPSSE spec referenced above.
449 */
450 static void clock_tms(uint8_t mpsse_cmd, int tms_bits, int tms_count, bool tdi_bit)
451 {
452 uint8_t tms_byte;
453 int i;
454 int tms_ndx; /* bit index into tms_byte */
455
456 assert(tms_count > 0);
457
458 DEBUG_JTAG_IO("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d",
459 mpsse_cmd, tms_bits, tms_count);
460
461 for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits >>= 1) {
462 bool bit = tms_bits & 1;
463
464 if (bit)
465 tms_byte |= (1 << tms_ndx);
466
467 /* always do state transitions in public view */
468 tap_set_state(tap_state_transition(tap_get_state(), bit));
469
470 /* we wrote a bit to tms_byte just above, increment bit index. if bit was zero
471 * also increment.
472 */
473 ++tms_ndx;
474
475 if (tms_ndx == 7 || i == tms_count-1) {
476 buffer_write(mpsse_cmd);
477 buffer_write(tms_ndx - 1);
478
479 /* Bit 7 of the byte is passed on to TDI/DO before the first TCK/SK of
480 * TMS/CS and is held static for the duration of TMS/CS clocking.
481 */
482 buffer_write(tms_byte | (tdi_bit << 7));
483 }
484 }
485 }
486
487 /**
488 * Function get_tms_buffer_requirements
489 * returns what clock_tms() will consume if called with
490 * same \a bit_count.
491 */
492 static inline int get_tms_buffer_requirements(int bit_count)
493 {
494 return ((bit_count + 6)/7) * 3;
495 }
496
497 /**
498 * Function move_to_state
499 * moves the TAP controller from the current state to a
500 * \a goal_state through a path given by tap_get_tms_path(). State transition
501 * logging is performed by delegation to clock_tms().
502 *
503 * @param goal_state is the destination state for the move.
504 */
505 static void move_to_state(tap_state_t goal_state)
506 {
507 tap_state_t start_state = tap_get_state();
508
509 /* goal_state is 1/2 of a tuple/pair of states which allow convenient
510 * lookup of the required TMS pattern to move to this state from the start state.
511 */
512
513 /* do the 2 lookups */
514 int tms_bits = tap_get_tms_path(start_state, goal_state);
515 int tms_count = tap_get_tms_path_len(start_state, goal_state);
516
517 DEBUG_JTAG_IO("start=%s goal=%s", tap_state_name(start_state), tap_state_name(goal_state));
518
519 clock_tms(0x4b, tms_bits, tms_count, 0);
520 }
521
522 static int ft2232_write(uint8_t *buf, int size, uint32_t *bytes_written)
523 {
524 #if BUILD_FT2232_FTD2XX == 1
525 FT_STATUS status;
526 DWORD dw_bytes_written = 0;
527 status = FT_Write(ftdih, buf, size, &dw_bytes_written);
528 if (status != FT_OK) {
529 *bytes_written = dw_bytes_written;
530 LOG_ERROR("FT_Write returned: %s", ftd2xx_status_string(status));
531 return ERROR_JTAG_DEVICE_ERROR;
532 } else
533 *bytes_written = dw_bytes_written;
534
535 #elif BUILD_FT2232_LIBFTDI == 1
536 int retval = ftdi_write_data(&ftdic, buf, size);
537 if (retval < 0) {
538 *bytes_written = 0;
539 LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
540 return ERROR_JTAG_DEVICE_ERROR;
541 } else
542 *bytes_written = retval;
543
544 #endif
545
546 if (*bytes_written != (uint32_t)size)
547 return ERROR_JTAG_DEVICE_ERROR;
548
549 return ERROR_OK;
550 }
551
552 static int ft2232_read(uint8_t *buf, uint32_t size, uint32_t *bytes_read)
553 {
554 #if BUILD_FT2232_FTD2XX == 1
555 DWORD dw_bytes_read;
556 FT_STATUS status;
557 int timeout = 5;
558 *bytes_read = 0;
559
560 while ((*bytes_read < size) && timeout--) {
561 status = FT_Read(ftdih, buf + *bytes_read, size -
562 *bytes_read, &dw_bytes_read);
563 if (status != FT_OK) {
564 *bytes_read = 0;
565 LOG_ERROR("FT_Read returned: %s", ftd2xx_status_string(status));
566 return ERROR_JTAG_DEVICE_ERROR;
567 }
568 *bytes_read += dw_bytes_read;
569 }
570
571 #elif BUILD_FT2232_LIBFTDI == 1
572 int retval;
573 int timeout = LIBFTDI_READ_RETRY_COUNT;
574 *bytes_read = 0;
575
576 while ((*bytes_read < size) && timeout--) {
577 retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read);
578 if (retval < 0) {
579 *bytes_read = 0;
580 LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic));
581 return ERROR_JTAG_DEVICE_ERROR;
582 }
583 *bytes_read += retval;
584 }
585
586 #endif
587
588 if (*bytes_read < size) {
589 LOG_ERROR("couldn't read enough bytes from "
590 "FT2232 device (%i < %i)",
591 (unsigned)*bytes_read,
592 (unsigned)size);
593 return ERROR_JTAG_DEVICE_ERROR;
594 }
595
596 return ERROR_OK;
597 }
598
599 static bool ft2232_device_is_highspeed(void)
600 {
601 #if BUILD_FT2232_FTD2XX == 1
602 return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H)
603 #ifdef HAS_ENUM_FT232H
604 || (ftdi_device == FT_DEVICE_232H)
605 #endif
606 ;
607 #elif BUILD_FT2232_LIBFTDI == 1
608 return (ftdi_device == TYPE_2232H || ftdi_device == TYPE_4232H
609 #ifdef HAS_ENUM_FT232H
610 || ftdi_device == TYPE_232H
611 #endif
612 );
613 #endif
614 }
615
616 /*
617 * Commands that only apply to the highspeed FTx232H devices (FT2232H, FT4232H, FT232H).
618 * See chapter 6 in http://www.ftdichip.com/Documents/AppNotes/
619 * AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf
620 */
621
622 static int ftx232h_adaptive_clocking(bool enable)
623 {
624 uint8_t buf = enable ? 0x96 : 0x97;
625 LOG_DEBUG("%2.2x", buf);
626
627 uint32_t bytes_written;
628 int retval;
629
630 retval = ft2232_write(&buf, sizeof(buf), &bytes_written);
631 if (retval != ERROR_OK) {
632 LOG_ERROR("couldn't write command to %s adaptive clocking"
633 , enable ? "enable" : "disable");
634 return retval;
635 }
636
637 return ERROR_OK;
638 }
639
640 /**
641 * Enable/disable the clk divide by 5 of the 60MHz master clock.
642 * This result in a JTAG clock speed range of 91.553Hz-6MHz
643 * respective 457.763Hz-30MHz.
644 */
645 static int ftx232h_clk_divide_by_5(bool enable)
646 {
647 uint32_t bytes_written;
648 uint8_t buf = enable ? 0x8b : 0x8a;
649
650 if (ft2232_write(&buf, sizeof(buf), &bytes_written) != ERROR_OK) {
651 LOG_ERROR("couldn't write command to %s clk divide by 5"
652 , enable ? "enable" : "disable");
653 return ERROR_JTAG_INIT_FAILED;
654 }
655 ft2232_max_tck = enable ? FTDI_2232C_MAX_TCK : FTDI_x232H_MAX_TCK;
656 LOG_INFO("max TCK change to: %u kHz", ft2232_max_tck);
657
658 return ERROR_OK;
659 }
660
661 static int ft2232_speed(int speed)
662 {
663 uint8_t buf[3];
664 int retval;
665 uint32_t bytes_written;
666
667 retval = ERROR_OK;
668 bool enable_adaptive_clocking = (RTCK_SPEED == speed);
669 if (ft2232_device_is_highspeed())
670 retval = ftx232h_adaptive_clocking(enable_adaptive_clocking);
671 else if (enable_adaptive_clocking) {
672 LOG_ERROR("ft2232 device %lu does not support RTCK"
673 , (long unsigned int)ftdi_device);
674 return ERROR_FAIL;
675 }
676
677 if ((enable_adaptive_clocking) || (ERROR_OK != retval))
678 return retval;
679
680 buf[0] = 0x86; /* command "set divisor" */
681 buf[1] = speed & 0xff; /* valueL (0 = 6MHz, 1 = 3MHz, 2 = 2.0MHz, ...*/
682 buf[2] = (speed >> 8) & 0xff; /* valueH */
683
684 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
685 retval = ft2232_write(buf, sizeof(buf), &bytes_written);
686 if (retval != ERROR_OK) {
687 LOG_ERROR("couldn't set FT2232 TCK speed");
688 return retval;
689 }
690
691 return ERROR_OK;
692 }
693
694 static int ft2232_speed_div(int speed, int *khz)
695 {
696 /* Take a look in the FT2232 manual,
697 * AN2232C-01 Command Processor for
698 * MPSSE and MCU Host Bus. Chapter 3.8 */
699
700 *khz = (RTCK_SPEED == speed) ? 0 : ft2232_max_tck / (1 + speed);
701
702 return ERROR_OK;
703 }
704
705 static int ft2232_khz(int khz, int *jtag_speed)
706 {
707 if (khz == 0) {
708 if (ft2232_device_is_highspeed()) {
709 *jtag_speed = RTCK_SPEED;
710 return ERROR_OK;
711 } else {
712 LOG_DEBUG("RCLK not supported");
713 return ERROR_FAIL;
714 }
715 }
716
717 /* Take a look in the FT2232 manual,
718 * AN2232C-01 Command Processor for
719 * MPSSE and MCU Host Bus. Chapter 3.8
720 *
721 * We will calc here with a multiplier
722 * of 10 for better rounding later. */
723
724 /* Calc speed, (ft2232_max_tck / khz) - 1
725 * Use 65000 for better rounding */
726 *jtag_speed = ((ft2232_max_tck*10) / khz) - 10;
727
728 /* Add 0.9 for rounding */
729 *jtag_speed += 9;
730
731 /* Calc real speed */
732 *jtag_speed = *jtag_speed / 10;
733
734 /* Check if speed is greater than 0 */
735 if (*jtag_speed < 0)
736 *jtag_speed = 0;
737
738 /* Check max value */
739 if (*jtag_speed > 0xFFFF)
740 *jtag_speed = 0xFFFF;
741
742 return ERROR_OK;
743 }
744
745 static void ft2232_end_state(tap_state_t state)
746 {
747 if (tap_is_state_stable(state))
748 tap_set_end_state(state);
749 else {
750 LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state));
751 exit(-1);
752 }
753 }
754
755 static void ft2232_read_scan(enum scan_type type, uint8_t *buffer, int scan_size)
756 {
757 int num_bytes = (scan_size + 7) / 8;
758 int bits_left = scan_size;
759 int cur_byte = 0;
760
761 while (num_bytes-- > 1) {
762 buffer[cur_byte++] = buffer_read();
763 bits_left -= 8;
764 }
765
766 buffer[cur_byte] = 0x0;
767
768 /* There is one more partial byte left from the clock data in/out instructions */
769 if (bits_left > 1)
770 buffer[cur_byte] = buffer_read() >> 1;
771 /* This shift depends on the length of the
772 *clock data to tms instruction, insterted
773 *at end of the scan, now fixed to a two
774 *step transition in ft2232_add_scan */
775 buffer[cur_byte] = (buffer[cur_byte] | (((buffer_read()) << 1) & 0x80)) >> (8 - bits_left);
776 }
777
778 static void ft2232_debug_dump_buffer(void)
779 {
780 int i;
781 char line[256];
782 char *line_p = line;
783
784 for (i = 0; i < ft2232_buffer_size; i++) {
785 line_p += snprintf(line_p,
786 sizeof(line) - (line_p - line),
787 "%2.2x ",
788 ft2232_buffer[i]);
789 if (i % 16 == 15) {
790 LOG_DEBUG("%s", line);
791 line_p = line;
792 }
793 }
794
795 if (line_p != line)
796 LOG_DEBUG("%s", line);
797 }
798
799 static int ft2232_send_and_recv(struct jtag_command *first, struct jtag_command *last)
800 {
801 struct jtag_command *cmd;
802 uint8_t *buffer;
803 int scan_size;
804 enum scan_type type;
805 int retval;
806 uint32_t bytes_written = 0;
807 uint32_t bytes_read = 0;
808
809 #ifdef _DEBUG_USB_IO_
810 struct timeval start, inter, inter2, end;
811 struct timeval d_inter, d_inter2, d_end;
812 #endif
813
814 #ifdef _DEBUG_USB_COMMS_
815 LOG_DEBUG("write buffer (size %i):", ft2232_buffer_size);
816 ft2232_debug_dump_buffer();
817 #endif
818
819 #ifdef _DEBUG_USB_IO_
820 gettimeofday(&start, NULL);
821 #endif
822
823 retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
824 if (retval != ERROR_OK) {
825 LOG_ERROR("couldn't write MPSSE commands to FT2232");
826 return retval;
827 }
828
829 #ifdef _DEBUG_USB_IO_
830 gettimeofday(&inter, NULL);
831 #endif
832
833 if (ft2232_expect_read) {
834 /* FIXME this "timeout" is never changed ... */
835 int timeout = LIBFTDI_READ_RETRY_COUNT;
836 ft2232_buffer_size = 0;
837
838 #ifdef _DEBUG_USB_IO_
839 gettimeofday(&inter2, NULL);
840 #endif
841
842 retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read);
843 if (retval != ERROR_OK) {
844 LOG_ERROR("couldn't read from FT2232");
845 return retval;
846 }
847
848 #ifdef _DEBUG_USB_IO_
849 gettimeofday(&end, NULL);
850
851 timeval_subtract(&d_inter, &inter, &start);
852 timeval_subtract(&d_inter2, &inter2, &start);
853 timeval_subtract(&d_end, &end, &start);
854
855 LOG_INFO("inter: %u.%06u, inter2: %u.%06u end: %u.%06u",
856 (unsigned)d_inter.tv_sec, (unsigned)d_inter.tv_usec,
857 (unsigned)d_inter2.tv_sec, (unsigned)d_inter2.tv_usec,
858 (unsigned)d_end.tv_sec, (unsigned)d_end.tv_usec);
859 #endif
860
861 ft2232_buffer_size = bytes_read;
862
863 if (ft2232_expect_read != ft2232_buffer_size) {
864 LOG_ERROR("ft2232_expect_read (%i) != "
865 "ft2232_buffer_size (%i) "
866 "(%i retries)",
867 ft2232_expect_read,
868 ft2232_buffer_size,
869 LIBFTDI_READ_RETRY_COUNT - timeout);
870 ft2232_debug_dump_buffer();
871
872 exit(-1);
873 }
874
875 #ifdef _DEBUG_USB_COMMS_
876 LOG_DEBUG("read buffer (%i retries): %i bytes",
877 LIBFTDI_READ_RETRY_COUNT - timeout,
878 ft2232_buffer_size);
879 ft2232_debug_dump_buffer();
880 #endif
881 }
882
883 ft2232_expect_read = 0;
884 ft2232_read_pointer = 0;
885
886 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
887 * that wasn't handled by a caller-provided error handler
888 */
889 retval = ERROR_OK;
890
891 cmd = first;
892 while (cmd != last) {
893 switch (cmd->type) {
894 case JTAG_SCAN:
895 type = jtag_scan_type(cmd->cmd.scan);
896 if (type != SCAN_OUT) {
897 scan_size = jtag_scan_size(cmd->cmd.scan);
898 buffer = calloc(DIV_ROUND_UP(scan_size, 8), 1);
899 ft2232_read_scan(type, buffer, scan_size);
900 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
901 retval = ERROR_JTAG_QUEUE_FAILED;
902 free(buffer);
903 }
904 break;
905
906 default:
907 break;
908 }
909
910 cmd = cmd->next;
911 }
912
913 ft2232_buffer_size = 0;
914
915 return retval;
916 }
917
918 /**
919 * Function ft2232_add_pathmove
920 * moves the TAP controller from the current state to a new state through the
921 * given path, where path is an array of tap_state_t's.
922 *
923 * @param path is an array of tap_stat_t which gives the states to traverse through
924 * ending with the last state at path[num_states-1]
925 * @param num_states is the count of state steps to move through
926 */
927 static void ft2232_add_pathmove(tap_state_t *path, int num_states)
928 {
929 int state_count = 0;
930
931 assert((unsigned) num_states <= 32u); /* tms_bits only holds 32 bits */
932
933 DEBUG_JTAG_IO("-");
934
935 /* this loop verifies that the path is legal and logs each state in the path */
936 while (num_states) {
937 unsigned char tms_byte = 0; /* zero this on each MPSSE batch */
938 int bit_count = 0;
939 int num_states_batch = num_states > 7 ? 7 : num_states;
940
941 /* command "Clock Data to TMS/CS Pin (no Read)" */
942 buffer_write(0x4b);
943
944 /* number of states remaining */
945 buffer_write(num_states_batch - 1);
946
947 while (num_states_batch--) {
948 /* either TMS=0 or TMS=1 must work ... */
949 if (tap_state_transition(tap_get_state(), false) == path[state_count])
950 buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
951 else if (tap_state_transition(tap_get_state(), true) == path[state_count])
952 buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
953
954 /* ... or else the caller goofed BADLY */
955 else {
956 LOG_ERROR("BUG: %s -> %s isn't a valid "
957 "TAP state transition",
958 tap_state_name(tap_get_state()),
959 tap_state_name(path[state_count]));
960 exit(-1);
961 }
962
963 tap_set_state(path[state_count]);
964 state_count++;
965 num_states--;
966 }
967
968 buffer_write(tms_byte);
969 }
970 tap_set_end_state(tap_get_state());
971 }
972
973 static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size)
974 {
975 int num_bytes = (scan_size + 7) / 8;
976 int bits_left = scan_size;
977 int cur_byte = 0;
978 int last_bit;
979
980 if (!ir_scan) {
981 if (tap_get_state() != TAP_DRSHIFT)
982 move_to_state(TAP_DRSHIFT);
983 } else {
984 if (tap_get_state() != TAP_IRSHIFT)
985 move_to_state(TAP_IRSHIFT);
986 }
987
988 /* add command for complete bytes */
989 while (num_bytes > 1) {
990 int thisrun_bytes;
991 if (type == SCAN_IO) {
992 /* Clock Data Bytes In and Out LSB First */
993 buffer_write(0x39);
994 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
995 } else if (type == SCAN_OUT) {
996 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
997 buffer_write(0x19);
998 /* LOG_DEBUG("added TDI bytes (o)"); */
999 } else if (type == SCAN_IN) {
1000 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
1001 buffer_write(0x28);
1002 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
1003 }
1004
1005 thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
1006 num_bytes -= thisrun_bytes;
1007
1008 buffer_write((uint8_t) (thisrun_bytes - 1));
1009 buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
1010
1011 if (type != SCAN_IN) {
1012 /* add complete bytes */
1013 while (thisrun_bytes-- > 0) {
1014 buffer_write(buffer[cur_byte++]);
1015 bits_left -= 8;
1016 }
1017 } else /* (type == SCAN_IN) */
1018 bits_left -= 8 * (thisrun_bytes);
1019 }
1020
1021 /* the most signifcant bit is scanned during TAP movement */
1022 if (type != SCAN_IN)
1023 last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
1024 else
1025 last_bit = 0;
1026
1027 /* process remaining bits but the last one */
1028 if (bits_left > 1) {
1029 if (type == SCAN_IO) {
1030 /* Clock Data Bits In and Out LSB First */
1031 buffer_write(0x3b);
1032 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1033 } else if (type == SCAN_OUT) {
1034 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1035 buffer_write(0x1b);
1036 /* LOG_DEBUG("added TDI bits (o)"); */
1037 } else if (type == SCAN_IN) {
1038 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1039 buffer_write(0x2a);
1040 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1041 }
1042
1043 buffer_write(bits_left - 2);
1044 if (type != SCAN_IN)
1045 buffer_write(buffer[cur_byte]);
1046 }
1047
1048 if ((ir_scan && (tap_get_end_state() == TAP_IRSHIFT))
1049 || (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT))) {
1050 if (type == SCAN_IO) {
1051 /* Clock Data Bits In and Out LSB First */
1052 buffer_write(0x3b);
1053 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1054 } else if (type == SCAN_OUT) {
1055 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1056 buffer_write(0x1b);
1057 /* LOG_DEBUG("added TDI bits (o)"); */
1058 } else if (type == SCAN_IN) {
1059 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1060 buffer_write(0x2a);
1061 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1062 }
1063 buffer_write(0x0);
1064 if (type != SCAN_IN)
1065 buffer_write(last_bit);
1066 } else {
1067 int tms_bits;
1068 int tms_count;
1069 uint8_t mpsse_cmd;
1070
1071 /* move from Shift-IR/DR to end state */
1072 if (type != SCAN_OUT) {
1073 /* We always go to the PAUSE state in two step at the end of an IN or IO
1074 *scan
1075 * This must be coordinated with the bit shifts in ft2232_read_scan */
1076 tms_bits = 0x01;
1077 tms_count = 2;
1078 /* Clock Data to TMS/CS Pin with Read */
1079 mpsse_cmd = 0x6b;
1080 } else {
1081 tms_bits = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1082 tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1083 /* Clock Data to TMS/CS Pin (no Read) */
1084 mpsse_cmd = 0x4b;
1085 }
1086
1087 DEBUG_JTAG_IO("finish %s", (type == SCAN_OUT) ? "without read" : "via PAUSE");
1088 clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
1089 }
1090
1091 if (tap_get_state() != tap_get_end_state())
1092 move_to_state(tap_get_end_state());
1093 }
1094
1095 static int ft2232_large_scan(struct scan_command *cmd,
1096 enum scan_type type,
1097 uint8_t *buffer,
1098 int scan_size)
1099 {
1100 int num_bytes = (scan_size + 7) / 8;
1101 int bits_left = scan_size;
1102 int cur_byte = 0;
1103 int last_bit;
1104 uint8_t *receive_buffer = malloc(DIV_ROUND_UP(scan_size, 8));
1105 uint8_t *receive_pointer = receive_buffer;
1106 uint32_t bytes_written;
1107 uint32_t bytes_read;
1108 int retval;
1109 int thisrun_read = 0;
1110
1111 if (!receive_buffer) {
1112 LOG_ERROR("failed to allocate memory");
1113 exit(-1);
1114 }
1115
1116 if (cmd->ir_scan) {
1117 LOG_ERROR("BUG: large IR scans are not supported");
1118 exit(-1);
1119 }
1120
1121 if (tap_get_state() != TAP_DRSHIFT)
1122 move_to_state(TAP_DRSHIFT);
1123
1124 retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
1125 if (retval != ERROR_OK) {
1126 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1127 exit(-1);
1128 }
1129 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1130 ft2232_buffer_size, (int)bytes_written);
1131 ft2232_buffer_size = 0;
1132
1133 /* add command for complete bytes */
1134 while (num_bytes > 1) {
1135 int thisrun_bytes;
1136
1137 if (type == SCAN_IO) {
1138 /* Clock Data Bytes In and Out LSB First */
1139 buffer_write(0x39);
1140 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
1141 } else if (type == SCAN_OUT) {
1142 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
1143 buffer_write(0x19);
1144 /* LOG_DEBUG("added TDI bytes (o)"); */
1145 } else if (type == SCAN_IN) {
1146 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
1147 buffer_write(0x28);
1148 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
1149 }
1150
1151 thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
1152 thisrun_read = thisrun_bytes;
1153 num_bytes -= thisrun_bytes;
1154 buffer_write((uint8_t) (thisrun_bytes - 1));
1155 buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
1156
1157 if (type != SCAN_IN) {
1158 /* add complete bytes */
1159 while (thisrun_bytes-- > 0) {
1160 buffer_write(buffer[cur_byte]);
1161 cur_byte++;
1162 bits_left -= 8;
1163 }
1164 } else /* (type == SCAN_IN) */
1165 bits_left -= 8 * (thisrun_bytes);
1166
1167 retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
1168 if (retval != ERROR_OK) {
1169 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1170 exit(-1);
1171 }
1172 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1173 ft2232_buffer_size,
1174 (int)bytes_written);
1175 ft2232_buffer_size = 0;
1176
1177 if (type != SCAN_OUT) {
1178 retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read);
1179 if (retval != ERROR_OK) {
1180 LOG_ERROR("couldn't read from FT2232");
1181 exit(-1);
1182 }
1183 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1184 thisrun_read,
1185 (int)bytes_read);
1186 receive_pointer += bytes_read;
1187 }
1188 }
1189
1190 thisrun_read = 0;
1191
1192 /* the most signifcant bit is scanned during TAP movement */
1193 if (type != SCAN_IN)
1194 last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
1195 else
1196 last_bit = 0;
1197
1198 /* process remaining bits but the last one */
1199 if (bits_left > 1) {
1200 if (type == SCAN_IO) {
1201 /* Clock Data Bits In and Out LSB First */
1202 buffer_write(0x3b);
1203 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1204 } else if (type == SCAN_OUT) {
1205 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1206 buffer_write(0x1b);
1207 /* LOG_DEBUG("added TDI bits (o)"); */
1208 } else if (type == SCAN_IN) {
1209 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1210 buffer_write(0x2a);
1211 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1212 }
1213 buffer_write(bits_left - 2);
1214 if (type != SCAN_IN)
1215 buffer_write(buffer[cur_byte]);
1216
1217 if (type != SCAN_OUT)
1218 thisrun_read += 2;
1219 }
1220
1221 if (tap_get_end_state() == TAP_DRSHIFT) {
1222 if (type == SCAN_IO) {
1223 /* Clock Data Bits In and Out LSB First */
1224 buffer_write(0x3b);
1225 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1226 } else if (type == SCAN_OUT) {
1227 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1228 buffer_write(0x1b);
1229 /* LOG_DEBUG("added TDI bits (o)"); */
1230 } else if (type == SCAN_IN) {
1231 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1232 buffer_write(0x2a);
1233 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1234 }
1235 buffer_write(0x0);
1236 buffer_write(last_bit);
1237 } else {
1238 int tms_bits = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1239 int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1240 uint8_t mpsse_cmd;
1241
1242 /* move from Shift-IR/DR to end state */
1243 if (type != SCAN_OUT) {
1244 /* Clock Data to TMS/CS Pin with Read */
1245 mpsse_cmd = 0x6b;
1246 /* LOG_DEBUG("added TMS scan (read)"); */
1247 } else {
1248 /* Clock Data to TMS/CS Pin (no Read) */
1249 mpsse_cmd = 0x4b;
1250 /* LOG_DEBUG("added TMS scan (no read)"); */
1251 }
1252
1253 DEBUG_JTAG_IO("finish, %s", (type == SCAN_OUT) ? "no read" : "read");
1254 clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
1255 }
1256
1257 if (type != SCAN_OUT)
1258 thisrun_read += 1;
1259
1260 retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
1261 if (retval != ERROR_OK) {
1262 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1263 exit(-1);
1264 }
1265 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1266 ft2232_buffer_size,
1267 (int)bytes_written);
1268 ft2232_buffer_size = 0;
1269
1270 if (type != SCAN_OUT) {
1271 retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read);
1272 if (retval != ERROR_OK) {
1273 LOG_ERROR("couldn't read from FT2232");
1274 exit(-1);
1275 }
1276 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1277 thisrun_read,
1278 (int)bytes_read);
1279 }
1280
1281 free(receive_buffer);
1282
1283 return ERROR_OK;
1284 }
1285
1286 static int ft2232_predict_scan_out(int scan_size, enum scan_type type)
1287 {
1288 int predicted_size = 3;
1289 int num_bytes = (scan_size - 1) / 8;
1290
1291 if (tap_get_state() != TAP_DRSHIFT)
1292 predicted_size += get_tms_buffer_requirements(
1293 tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
1294
1295 if (type == SCAN_IN) { /* only from device to host */
1296 /* complete bytes */
1297 predicted_size += DIV_ROUND_UP(num_bytes, 65536) * 3;
1298
1299 /* remaining bits - 1 (up to 7) */
1300 predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
1301 } else {/* host to device, or bidirectional
1302 * complete bytes */
1303 predicted_size += num_bytes + DIV_ROUND_UP(num_bytes, 65536) * 3;
1304
1305 /* remaining bits -1 (up to 7) */
1306 predicted_size += ((scan_size - 1) % 8) ? 3 : 0;
1307 }
1308
1309 return predicted_size;
1310 }
1311
1312 static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
1313 {
1314 int predicted_size = 0;
1315
1316 if (type != SCAN_OUT) {
1317 /* complete bytes */
1318 predicted_size +=
1319 (DIV_ROUND_UP(scan_size, 8) > 1) ? (DIV_ROUND_UP(scan_size, 8) - 1) : 0;
1320
1321 /* remaining bits - 1 */
1322 predicted_size += ((scan_size - 1) % 8) ? 1 : 0;
1323
1324 /* last bit (from TMS scan) */
1325 predicted_size += 1;
1326 }
1327
1328 /* LOG_DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size); */
1329
1330 return predicted_size;
1331 }
1332
1333 /* semi-generic FT2232/FT4232 reset code */
1334 static void ftx23_reset(int trst, int srst)
1335 {
1336 enum reset_types jtag_reset_config = jtag_get_reset_config();
1337 if (trst == 1) {
1338 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1339 low_direction |= nTRSTnOE; /* switch to output pin (output is low) */
1340 else
1341 low_output &= ~nTRST; /* switch output low */
1342 } else if (trst == 0) {
1343 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1344 low_direction &= ~nTRSTnOE; /* switch to input pin (high-Z + internal
1345 *and external pullup) */
1346 else
1347 low_output |= nTRST; /* switch output high */
1348 }
1349
1350 if (srst == 1) {
1351 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1352 low_output &= ~nSRST; /* switch output low */
1353 else
1354 low_direction |= nSRSTnOE; /* switch to output pin (output is low) */
1355 } else if (srst == 0) {
1356 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1357 low_output |= nSRST; /* switch output high */
1358 else
1359 low_direction &= ~nSRSTnOE; /* switch to input pin (high-Z) */
1360 }
1361
1362 /* command "set data bits low byte" */
1363 buffer_write(0x80);
1364 buffer_write(low_output);
1365 buffer_write(low_direction);
1366 }
1367
1368 static void jtagkey_reset(int trst, int srst)
1369 {
1370 enum reset_types jtag_reset_config = jtag_get_reset_config();
1371 if (trst == 1) {
1372 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1373 high_output &= ~nTRSTnOE;
1374 else
1375 high_output &= ~nTRST;
1376 } else if (trst == 0) {
1377 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1378 high_output |= nTRSTnOE;
1379 else
1380 high_output |= nTRST;
1381 }
1382
1383 if (srst == 1) {
1384 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1385 high_output &= ~nSRST;
1386 else
1387 high_output &= ~nSRSTnOE;
1388 } else if (srst == 0) {
1389 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1390 high_output |= nSRST;
1391 else
1392 high_output |= nSRSTnOE;
1393 }
1394
1395 /* command "set data bits high byte" */
1396 buffer_write(0x82);
1397 buffer_write(high_output);
1398 buffer_write(high_direction);
1399 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1400 trst,
1401 srst,
1402 high_output,
1403 high_direction);
1404 }
1405
1406 static void olimex_jtag_reset(int trst, int srst)
1407 {
1408 enum reset_types jtag_reset_config = jtag_get_reset_config();
1409 if (trst == 1) {
1410 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1411 high_output &= ~nTRSTnOE;
1412 else
1413 high_output &= ~nTRST;
1414 } else if (trst == 0) {
1415 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1416 high_output |= nTRSTnOE;
1417 else
1418 high_output |= nTRST;
1419 }
1420
1421 if (srst == 1)
1422 high_output |= nSRST;
1423 else if (srst == 0)
1424 high_output &= ~nSRST;
1425
1426 /* command "set data bits high byte" */
1427 buffer_write(0x82);
1428 buffer_write(high_output);
1429 buffer_write(high_direction);
1430 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1431 trst,
1432 srst,
1433 high_output,
1434 high_direction);
1435 }
1436
1437 static void axm0432_jtag_reset(int trst, int srst)
1438 {
1439 if (trst == 1) {
1440 tap_set_state(TAP_RESET);
1441 high_output &= ~nTRST;
1442 } else if (trst == 0)
1443 high_output |= nTRST;
1444
1445 if (srst == 1)
1446 high_output &= ~nSRST;
1447 else if (srst == 0)
1448 high_output |= nSRST;
1449
1450 /* command "set data bits low byte" */
1451 buffer_write(0x82);
1452 buffer_write(high_output);
1453 buffer_write(high_direction);
1454 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1455 trst,
1456 srst,
1457 high_output,
1458 high_direction);
1459 }
1460
1461 static void flyswatter_reset(int trst, int srst)
1462 {
1463 if (trst == 1)
1464 low_output &= ~nTRST;
1465 else if (trst == 0)
1466 low_output |= nTRST;
1467
1468 if (srst == 1)
1469 low_output |= nSRST;
1470 else if (srst == 0)
1471 low_output &= ~nSRST;
1472
1473 /* command "set data bits low byte" */
1474 buffer_write(0x80);
1475 buffer_write(low_output);
1476 buffer_write(low_direction);
1477 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
1478 trst,
1479 srst,
1480 low_output,
1481 low_direction);
1482 }
1483
1484 static void flyswatter1_reset(int trst, int srst)
1485 {
1486 flyswatter_reset(trst, srst);
1487 }
1488
1489 static void flyswatter2_reset(int trst, int srst)
1490 {
1491 flyswatter_reset(trst, !srst);
1492 }
1493
1494 static void minimodule_reset(int trst, int srst)
1495 {
1496 if (srst == 1)
1497 low_output &= ~nSRST;
1498 else if (srst == 0)
1499 low_output |= nSRST;
1500
1501 /* command "set data bits low byte" */
1502 buffer_write(0x80);
1503 buffer_write(low_output);
1504 buffer_write(low_direction);
1505 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
1506 trst,
1507 srst,
1508 low_output,
1509 low_direction);
1510 }
1511
1512 static void turtle_reset(int trst, int srst)
1513 {
1514 if (trst == 1)
1515 LOG_ERROR("Can't assert TRST: the adapter lacks this signal");
1516
1517 if (srst == 1)
1518 low_output |= nSRST;
1519 else if (srst == 0)
1520 low_output &= ~nSRST;
1521
1522 /* command "set data bits low byte" */
1523 buffer_write(0x80);
1524 buffer_write(low_output);
1525 buffer_write(low_direction);
1526 LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
1527 srst,
1528 low_output,
1529 low_direction);
1530 }
1531
1532 static void comstick_reset(int trst, int srst)
1533 {
1534 if (trst == 1)
1535 high_output &= ~nTRST;
1536 else if (trst == 0)
1537 high_output |= nTRST;
1538
1539 if (srst == 1)
1540 high_output &= ~nSRST;
1541 else if (srst == 0)
1542 high_output |= nSRST;
1543
1544 /* command "set data bits high byte" */
1545 buffer_write(0x82);
1546 buffer_write(high_output);
1547 buffer_write(high_direction);
1548 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1549 trst,
1550 srst,
1551 high_output,
1552 high_direction);
1553 }
1554
1555 static void stm32stick_reset(int trst, int srst)
1556 {
1557 if (trst == 1)
1558 high_output &= ~nTRST;
1559 else if (trst == 0)
1560 high_output |= nTRST;
1561
1562 if (srst == 1)
1563 low_output &= ~nSRST;
1564 else if (srst == 0)
1565 low_output |= nSRST;
1566
1567 /* command "set data bits low byte" */
1568 buffer_write(0x80);
1569 buffer_write(low_output);
1570 buffer_write(low_direction);
1571
1572 /* command "set data bits high byte" */
1573 buffer_write(0x82);
1574 buffer_write(high_output);
1575 buffer_write(high_direction);
1576 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1577 trst,
1578 srst,
1579 high_output,
1580 high_direction);
1581 }
1582
1583 static void sheevaplug_reset(int trst, int srst)
1584 {
1585 if (trst == 1)
1586 high_output &= ~nTRST;
1587 else if (trst == 0)
1588 high_output |= nTRST;
1589
1590 if (srst == 1)
1591 high_output &= ~nSRSTnOE;
1592 else if (srst == 0)
1593 high_output |= nSRSTnOE;
1594
1595 /* command "set data bits high byte" */
1596 buffer_write(0x82);
1597 buffer_write(high_output);
1598 buffer_write(high_direction);
1599 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
1600 trst,
1601 srst,
1602 high_output,
1603 high_direction);
1604 }
1605
1606 static void redbee_reset(int trst, int srst)
1607 {
1608 if (trst == 1) {
1609 tap_set_state(TAP_RESET);
1610 high_output &= ~nTRST;
1611 } else if (trst == 0)
1612 high_output |= nTRST;
1613
1614 if (srst == 1)
1615 high_output &= ~nSRST;
1616 else if (srst == 0)
1617 high_output |= nSRST;
1618
1619 /* command "set data bits low byte" */
1620 buffer_write(0x82);
1621 buffer_write(high_output);
1622 buffer_write(high_direction);
1623 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, "
1624 "high_direction: 0x%2.2x", trst, srst, high_output,
1625 high_direction);
1626 }
1627
1628 static void xds100v2_reset(int trst, int srst)
1629 {
1630 if (trst == 1) {
1631 tap_set_state(TAP_RESET);
1632 high_output &= ~nTRST;
1633 } else if (trst == 0)
1634 high_output |= nTRST;
1635
1636 if (srst == 1)
1637 high_output |= nSRST;
1638 else if (srst == 0)
1639 high_output &= ~nSRST;
1640
1641 /* command "set data bits low byte" */
1642 buffer_write(0x82);
1643 buffer_write(high_output);
1644 buffer_write(high_direction);
1645 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, "
1646 "high_direction: 0x%2.2x", trst, srst, high_output,
1647 high_direction);
1648 }
1649
1650 static int ft2232_execute_runtest(struct jtag_command *cmd)
1651 {
1652 int retval;
1653 int i;
1654 int predicted_size = 0;
1655 retval = ERROR_OK;
1656
1657 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
1658 cmd->cmd.runtest->num_cycles,
1659 tap_state_name(cmd->cmd.runtest->end_state));
1660
1661 /* only send the maximum buffer size that FT2232C can handle */
1662 predicted_size = 0;
1663 if (tap_get_state() != TAP_IDLE)
1664 predicted_size += 3;
1665 predicted_size += 3 * DIV_ROUND_UP(cmd->cmd.runtest->num_cycles, 7);
1666 if (cmd->cmd.runtest->end_state != TAP_IDLE)
1667 predicted_size += 3;
1668 if (tap_get_end_state() != TAP_IDLE)
1669 predicted_size += 3;
1670 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
1671 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1672 retval = ERROR_JTAG_QUEUE_FAILED;
1673 require_send = 0;
1674 first_unsent = cmd;
1675 }
1676 if (tap_get_state() != TAP_IDLE) {
1677 move_to_state(TAP_IDLE);
1678 require_send = 1;
1679 }
1680 i = cmd->cmd.runtest->num_cycles;
1681 while (i > 0) {
1682 /* there are no state transitions in this code, so omit state tracking */
1683
1684 /* command "Clock Data to TMS/CS Pin (no Read)" */
1685 buffer_write(0x4b);
1686
1687 /* scan 7 bits */
1688 buffer_write((i > 7) ? 6 : (i - 1));
1689
1690 /* TMS data bits */
1691 buffer_write(0x0);
1692
1693 i -= (i > 7) ? 7 : i;
1694 /* LOG_DEBUG("added TMS scan (no read)"); */
1695 }
1696
1697 ft2232_end_state(cmd->cmd.runtest->end_state);
1698
1699 if (tap_get_state() != tap_get_end_state())
1700 move_to_state(tap_get_end_state());
1701
1702 require_send = 1;
1703 DEBUG_JTAG_IO("runtest: %i, end in %s",
1704 cmd->cmd.runtest->num_cycles,
1705 tap_state_name(tap_get_end_state()));
1706 return retval;
1707 }
1708
1709 static int ft2232_execute_statemove(struct jtag_command *cmd)
1710 {
1711 int predicted_size = 0;
1712 int retval = ERROR_OK;
1713
1714 DEBUG_JTAG_IO("statemove end in %s",
1715 tap_state_name(cmd->cmd.statemove->end_state));
1716
1717 /* only send the maximum buffer size that FT2232C can handle */
1718 predicted_size = 3;
1719 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
1720 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1721 retval = ERROR_JTAG_QUEUE_FAILED;
1722 require_send = 0;
1723 first_unsent = cmd;
1724 }
1725 ft2232_end_state(cmd->cmd.statemove->end_state);
1726
1727 /* For TAP_RESET, ignore the current recorded state. It's often
1728 * wrong at server startup, and this transation is critical whenever
1729 * it's requested.
1730 */
1731 if (tap_get_end_state() == TAP_RESET) {
1732 clock_tms(0x4b, 0xff, 5, 0);
1733 require_send = 1;
1734
1735 /* shortest-path move to desired end state */
1736 } else if (tap_get_state() != tap_get_end_state()) {
1737 move_to_state(tap_get_end_state());
1738 require_send = 1;
1739 }
1740
1741 return retval;
1742 }
1743
1744 /**
1745 * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG
1746 * (or SWD) state machine.
1747 */
1748 static int ft2232_execute_tms(struct jtag_command *cmd)
1749 {
1750 int retval = ERROR_OK;
1751 unsigned num_bits = cmd->cmd.tms->num_bits;
1752 const uint8_t *bits = cmd->cmd.tms->bits;
1753 unsigned count;
1754
1755 DEBUG_JTAG_IO("TMS: %d bits", num_bits);
1756
1757 /* only send the maximum buffer size that FT2232C can handle */
1758 count = 3 * DIV_ROUND_UP(num_bits, 4);
1759 if (ft2232_buffer_size + 3*count + 1 > FT2232_BUFFER_SIZE) {
1760 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1761 retval = ERROR_JTAG_QUEUE_FAILED;
1762
1763 require_send = 0;
1764 first_unsent = cmd;
1765 }
1766
1767 /* Shift out in batches of at most 6 bits; there's a report of an
1768 * FT2232 bug in this area, where shifting exactly 7 bits can make
1769 * problems with TMS signaling for the last clock cycle:
1770 *
1771 * http://developer.intra2net.com/mailarchive/html/
1772 * libftdi/2009/msg00292.html
1773 *
1774 * Command 0x4b is: "Clock Data to TMS/CS Pin (no Read)"
1775 *
1776 * Note that pathmoves in JTAG are not often seven bits, so that
1777 * isn't a particularly likely situation outside of "special"
1778 * signaling such as switching between JTAG and SWD modes.
1779 */
1780 while (num_bits) {
1781 if (num_bits <= 6) {
1782 buffer_write(0x4b);
1783 buffer_write(num_bits - 1);
1784 buffer_write(*bits & 0x3f);
1785 break;
1786 }
1787
1788 /* Yes, this is lazy ... we COULD shift out more data
1789 * bits per operation, but doing it in nybbles is easy
1790 */
1791 buffer_write(0x4b);
1792 buffer_write(3);
1793 buffer_write(*bits & 0xf);
1794 num_bits -= 4;
1795
1796 count = (num_bits > 4) ? 4 : num_bits;
1797
1798 buffer_write(0x4b);
1799 buffer_write(count - 1);
1800 buffer_write((*bits >> 4) & 0xf);
1801 num_bits -= count;
1802
1803 bits++;
1804 }
1805
1806 require_send = 1;
1807 return retval;
1808 }
1809
1810 static int ft2232_execute_pathmove(struct jtag_command *cmd)
1811 {
1812 int predicted_size = 0;
1813 int retval = ERROR_OK;
1814
1815 tap_state_t *path = cmd->cmd.pathmove->path;
1816 int num_states = cmd->cmd.pathmove->num_states;
1817
1818 DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
1819 tap_state_name(tap_get_state()),
1820 tap_state_name(path[num_states-1]));
1821
1822 /* only send the maximum buffer size that FT2232C can handle */
1823 predicted_size = 3 * DIV_ROUND_UP(num_states, 7);
1824 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
1825 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1826 retval = ERROR_JTAG_QUEUE_FAILED;
1827
1828 require_send = 0;
1829 first_unsent = cmd;
1830 }
1831
1832 ft2232_add_pathmove(path, num_states);
1833 require_send = 1;
1834
1835 return retval;
1836 }
1837
1838 static int ft2232_execute_scan(struct jtag_command *cmd)
1839 {
1840 uint8_t *buffer;
1841 int scan_size; /* size of IR or DR scan */
1842 int predicted_size = 0;
1843 int retval = ERROR_OK;
1844
1845 enum scan_type type = jtag_scan_type(cmd->cmd.scan);
1846
1847 DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN", type);
1848
1849 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
1850
1851 predicted_size = ft2232_predict_scan_out(scan_size, type);
1852 if ((predicted_size + 1) > FT2232_BUFFER_SIZE) {
1853 LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
1854 /* unsent commands before this */
1855 if (first_unsent != cmd)
1856 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1857 retval = ERROR_JTAG_QUEUE_FAILED;
1858
1859 /* current command */
1860 ft2232_end_state(cmd->cmd.scan->end_state);
1861 ft2232_large_scan(cmd->cmd.scan, type, buffer, scan_size);
1862 require_send = 0;
1863 first_unsent = cmd->next;
1864 if (buffer)
1865 free(buffer);
1866 return retval;
1867 } else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
1868 LOG_DEBUG(
1869 "ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
1870 first_unsent,
1871 cmd);
1872 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1873 retval = ERROR_JTAG_QUEUE_FAILED;
1874 require_send = 0;
1875 first_unsent = cmd;
1876 }
1877 ft2232_expect_read += ft2232_predict_scan_in(scan_size, type);
1878 /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */
1879 ft2232_end_state(cmd->cmd.scan->end_state);
1880 ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
1881 require_send = 1;
1882 if (buffer)
1883 free(buffer);
1884 DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
1885 (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
1886 tap_state_name(tap_get_end_state()));
1887 return retval;
1888
1889 }
1890
1891 static int ft2232_execute_reset(struct jtag_command *cmd)
1892 {
1893 int retval;
1894 int predicted_size = 0;
1895 retval = ERROR_OK;
1896
1897 DEBUG_JTAG_IO("reset trst: %i srst %i",
1898 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1899
1900 /* only send the maximum buffer size that FT2232C can handle */
1901 predicted_size = 3;
1902 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
1903 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1904 retval = ERROR_JTAG_QUEUE_FAILED;
1905 require_send = 0;
1906 first_unsent = cmd;
1907 }
1908
1909 if ((cmd->cmd.reset->trst == 1) ||
1910 (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
1911 tap_set_state(TAP_RESET);
1912
1913 layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1914 require_send = 1;
1915
1916 DEBUG_JTAG_IO("trst: %i, srst: %i",
1917 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1918 return retval;
1919 }
1920
1921 static int ft2232_execute_sleep(struct jtag_command *cmd)
1922 {
1923 int retval;
1924 retval = ERROR_OK;
1925
1926 DEBUG_JTAG_IO("sleep %" PRIi32, cmd->cmd.sleep->us);
1927
1928 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1929 retval = ERROR_JTAG_QUEUE_FAILED;
1930 first_unsent = cmd->next;
1931 jtag_sleep(cmd->cmd.sleep->us);
1932 DEBUG_JTAG_IO("sleep %" PRIi32 " usec while in %s",
1933 cmd->cmd.sleep->us,
1934 tap_state_name(tap_get_state()));
1935 return retval;
1936 }
1937
1938 static int ft2232_execute_stableclocks(struct jtag_command *cmd)
1939 {
1940 int retval;
1941 retval = ERROR_OK;
1942
1943 /* this is only allowed while in a stable state. A check for a stable
1944 * state was done in jtag_add_clocks()
1945 */
1946 if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
1947 retval = ERROR_JTAG_QUEUE_FAILED;
1948 DEBUG_JTAG_IO("clocks %i while in %s",
1949 cmd->cmd.stableclocks->num_cycles,
1950 tap_state_name(tap_get_state()));
1951 return retval;
1952 }
1953
1954 static int ft2232_execute_command(struct jtag_command *cmd)
1955 {
1956 int retval;
1957
1958 switch (cmd->type) {
1959 case JTAG_RESET:
1960 retval = ft2232_execute_reset(cmd);
1961 break;
1962 case JTAG_RUNTEST:
1963 retval = ft2232_execute_runtest(cmd);
1964 break;
1965 case JTAG_TLR_RESET:
1966 retval = ft2232_execute_statemove(cmd);
1967 break;
1968 case JTAG_PATHMOVE:
1969 retval = ft2232_execute_pathmove(cmd);
1970 break;
1971 case JTAG_SCAN:
1972 retval = ft2232_execute_scan(cmd);
1973 break;
1974 case JTAG_SLEEP:
1975 retval = ft2232_execute_sleep(cmd);
1976 break;
1977 case JTAG_STABLECLOCKS:
1978 retval = ft2232_execute_stableclocks(cmd);
1979 break;
1980 case JTAG_TMS:
1981 retval = ft2232_execute_tms(cmd);
1982 break;
1983 default:
1984 LOG_ERROR("BUG: unknown JTAG command type encountered");
1985 retval = ERROR_JTAG_QUEUE_FAILED;
1986 break;
1987 }
1988 return retval;
1989 }
1990
1991 static int ft2232_execute_queue(void)
1992 {
1993 struct jtag_command *cmd = jtag_command_queue; /* currently processed command */
1994 int retval;
1995
1996 first_unsent = cmd; /* next command that has to be sent */
1997 require_send = 0;
1998
1999 /* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
2000 * that wasn't handled by a caller-provided error handler
2001 */
2002 retval = ERROR_OK;
2003
2004 ft2232_buffer_size = 0;
2005 ft2232_expect_read = 0;
2006
2007 /* blink, if the current layout has that feature */
2008 if (layout->blink)
2009 layout->blink();
2010
2011 while (cmd) {
2012 /* fill the write buffer with the desired command */
2013 if (ft2232_execute_command(cmd) != ERROR_OK)
2014 retval = ERROR_JTAG_QUEUE_FAILED;
2015 /* Start reading input before FT2232 TX buffer fills up.
2016 * Sometimes this happens because we don't know the
2017 * length of the last command before we execute it. So
2018 * we simple inform the user.
2019 */
2020 cmd = cmd->next;
2021
2022 if (ft2232_expect_read >= FT2232_BUFFER_READ_QUEUE_SIZE) {
2023 if (ft2232_expect_read > (FT2232_BUFFER_READ_QUEUE_SIZE+1))
2024 LOG_DEBUG("read buffer size looks too high %d/%d",
2025 ft2232_expect_read,
2026 (FT2232_BUFFER_READ_QUEUE_SIZE+1));
2027 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
2028 retval = ERROR_JTAG_QUEUE_FAILED;
2029 first_unsent = cmd;
2030 }
2031 }
2032
2033 if (require_send > 0)
2034 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
2035 retval = ERROR_JTAG_QUEUE_FAILED;
2036
2037 return retval;
2038 }
2039
2040 #if BUILD_FT2232_FTD2XX == 1
2041 static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int *try_more)
2042 {
2043 FT_STATUS status;
2044 DWORD deviceID;
2045 char SerialNumber[16];
2046 char Description[64];
2047 DWORD openex_flags = 0;
2048 char *openex_string = NULL;
2049 uint8_t latency_timer;
2050
2051 if (layout == NULL) {
2052 LOG_WARNING("No ft2232 layout specified'");
2053 return ERROR_JTAG_INIT_FAILED;
2054 }
2055
2056 LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)",
2057 layout->name, vid, pid);
2058
2059 #if IS_WIN32 == 0
2060 /* Add non-standard Vid/Pid to the linux driver */
2061 status = FT_SetVIDPID(vid, pid);
2062 if (status != FT_OK)
2063 LOG_WARNING("couldn't add %4.4x:%4.4x", vid, pid);
2064
2065 #endif
2066
2067 if (ft2232_device_desc && ft2232_serial) {
2068 LOG_WARNING(
2069 "can't open by device description and serial number, giving precedence to serial");
2070 ft2232_device_desc = NULL;
2071 }
2072
2073 if (ft2232_device_desc) {
2074 openex_string = ft2232_device_desc;
2075 openex_flags = FT_OPEN_BY_DESCRIPTION;
2076 } else if (ft2232_serial) {
2077 openex_string = ft2232_serial;
2078 openex_flags = FT_OPEN_BY_SERIAL_NUMBER;
2079 } else {
2080 LOG_ERROR("neither device description nor serial number specified");
2081 LOG_ERROR(
2082 "please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
2083
2084 return ERROR_JTAG_INIT_FAILED;
2085 }
2086
2087 status = FT_OpenEx(openex_string, openex_flags, &ftdih);
2088 if (status != FT_OK) {
2089 /* under Win32, the FTD2XX driver appends an "A" to the end
2090 * of the description, if we tried by the desc, then
2091 * try by the alternate "A" description. */
2092 if (openex_string == ft2232_device_desc) {
2093 /* Try the alternate method. */
2094 openex_string = ft2232_device_desc_A;
2095 status = FT_OpenEx(openex_string, openex_flags, &ftdih);
2096 if (status == FT_OK) {
2097 /* yea, the "alternate" method worked! */
2098 } else {
2099 /* drat, give the user a meaningfull message.
2100 * telling the use we tried *BOTH* methods. */
2101 LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'",
2102 ft2232_device_desc,
2103 ft2232_device_desc_A);
2104 }
2105 }
2106 }
2107
2108 if (status != FT_OK) {
2109 DWORD num_devices;
2110
2111 if (more) {
2112 LOG_WARNING("unable to open ftdi device (trying more): %s",
2113 ftd2xx_status_string(status));
2114 *try_more = 1;
2115 return ERROR_JTAG_INIT_FAILED;
2116 }
2117 LOG_ERROR("unable to open ftdi device: %s",
2118 ftd2xx_status_string(status));
2119 status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY);
2120 if (status == FT_OK) {
2121 char **desc_array = malloc(sizeof(char *) * (num_devices + 1));
2122 uint32_t i;
2123
2124 for (i = 0; i < num_devices; i++)
2125 desc_array[i] = malloc(64);
2126
2127 desc_array[num_devices] = NULL;
2128
2129 status = FT_ListDevices(desc_array, &num_devices, FT_LIST_ALL | openex_flags);
2130
2131 if (status == FT_OK) {
2132 LOG_ERROR("ListDevices: %" PRIu32, (uint32_t)num_devices);
2133 for (i = 0; i < num_devices; i++)
2134 LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]);
2135 }
2136
2137 for (i = 0; i < num_devices; i++)
2138 free(desc_array[i]);
2139
2140 free(desc_array);
2141 } else
2142 LOG_ERROR("ListDevices: NONE");
2143 return ERROR_JTAG_INIT_FAILED;
2144 }
2145
2146 status = FT_SetLatencyTimer(ftdih, ft2232_latency);
2147 if (status != FT_OK) {
2148 LOG_ERROR("unable to set latency timer: %s",
2149 ftd2xx_status_string(status));
2150 return ERROR_JTAG_INIT_FAILED;
2151 }
2152
2153 status = FT_GetLatencyTimer(ftdih, &latency_timer);
2154 if (status != FT_OK) {
2155 /* ftd2xx 1.04 (linux) has a bug when calling FT_GetLatencyTimer
2156 * so ignore errors if using this driver version */
2157 DWORD dw_version;
2158
2159 status = FT_GetDriverVersion(ftdih, &dw_version);
2160 LOG_ERROR("unable to get latency timer: %s",
2161 ftd2xx_status_string(status));
2162
2163 if ((status == FT_OK) && (dw_version == 0x10004)) {
2164 LOG_ERROR("ftd2xx 1.04 detected - this has known issues " \
2165 "with FT_GetLatencyTimer, upgrade to a newer version");
2166 } else
2167 return ERROR_JTAG_INIT_FAILED;
2168 } else
2169 LOG_DEBUG("current latency timer: %i", latency_timer);
2170
2171 status = FT_SetTimeouts(ftdih, 5000, 5000);
2172 if (status != FT_OK) {
2173 LOG_ERROR("unable to set timeouts: %s",
2174 ftd2xx_status_string(status));
2175 return ERROR_JTAG_INIT_FAILED;
2176 }
2177
2178 status = FT_SetBitMode(ftdih, 0x0b, 2);
2179 if (status != FT_OK) {
2180 LOG_ERROR("unable to enable bit i/o mode: %s",
2181 ftd2xx_status_string(status));
2182 return ERROR_JTAG_INIT_FAILED;
2183 }
2184
2185 status = FT_GetDeviceInfo(ftdih, &ftdi_device, &deviceID,
2186 SerialNumber, Description, NULL);
2187 if (status != FT_OK) {
2188 LOG_ERROR("unable to get FT_GetDeviceInfo: %s",
2189 ftd2xx_status_string(status));
2190 return ERROR_JTAG_INIT_FAILED;
2191 } else {
2192 static const char *type_str[] = {
2193 "BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H", "232H"
2194 };
2195 unsigned no_of_known_types = ARRAY_SIZE(type_str) - 1;
2196 unsigned type_index = ((unsigned)ftdi_device <= no_of_known_types)
2197 ? ftdi_device : FT_DEVICE_UNKNOWN;
2198 LOG_INFO("device: %" PRIu32 " \"%s\"", (uint32_t)ftdi_device, type_str[type_index]);
2199 LOG_INFO("deviceID: %" PRIu32, (uint32_t)deviceID);
2200 LOG_INFO("SerialNumber: %s", SerialNumber);
2201 LOG_INFO("Description: %s", Description);
2202 }
2203
2204 return ERROR_OK;
2205 }
2206
2207 static int ft2232_purge_ftd2xx(void)
2208 {
2209 FT_STATUS status;
2210
2211 status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX);
2212 if (status != FT_OK) {
2213 LOG_ERROR("error purging ftd2xx device: %s",
2214 ftd2xx_status_string(status));
2215 return ERROR_JTAG_INIT_FAILED;
2216 }
2217
2218 return ERROR_OK;
2219 }
2220
2221 #endif /* BUILD_FT2232_FTD2XX == 1 */
2222
2223 #if BUILD_FT2232_LIBFTDI == 1
2224 static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int *try_more, int channel)
2225 {
2226 uint8_t latency_timer;
2227
2228 if (layout == NULL) {
2229 LOG_WARNING("No ft2232 layout specified'");
2230 return ERROR_JTAG_INIT_FAILED;
2231 }
2232
2233 LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
2234 layout->name, vid, pid);
2235
2236 if (ftdi_init(&ftdic) < 0)
2237 return ERROR_JTAG_INIT_FAILED;
2238
2239 /* default to INTERFACE_A */
2240 if (channel == INTERFACE_ANY)
2241 channel = INTERFACE_A;
2242 if (ftdi_set_interface(&ftdic, channel) < 0) {
2243 LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str);
2244 return ERROR_JTAG_INIT_FAILED;
2245 }
2246
2247 /* context, vendor id, product id */
2248 if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc, ft2232_serial) < 0) {
2249 if (more)
2250 LOG_WARNING("unable to open ftdi device (trying more): %s",
2251 ftdic.error_str);
2252 else
2253 LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str);
2254 *try_more = 1;
2255 return ERROR_JTAG_INIT_FAILED;
2256 }
2257
2258 /* There is already a reset in ftdi_usb_open_desc, this should be redundant */
2259 if (ftdi_usb_reset(&ftdic) < 0) {
2260 LOG_ERROR("unable to reset ftdi device");
2261 return ERROR_JTAG_INIT_FAILED;
2262 }
2263
2264 if (ftdi_set_latency_timer(&ftdic, ft2232_latency) < 0) {
2265 LOG_ERROR("unable to set latency timer");
2266 return ERROR_JTAG_INIT_FAILED;
2267 }
2268
2269 if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0) {
2270 LOG_ERROR("unable to get latency timer");
2271 return ERROR_JTAG_INIT_FAILED;
2272 } else
2273 LOG_DEBUG("current latency timer: %i", latency_timer);
2274
2275 ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */
2276
2277 ftdi_device = ftdic.type;
2278 static const char *type_str[] = {
2279 "AM", "BM", "2232C", "R", "2232H", "4232H", "232H", "Unknown"
2280 };
2281 unsigned no_of_known_types = ARRAY_SIZE(type_str) - 1;
2282 unsigned type_index = ((unsigned)ftdi_device < no_of_known_types)
2283 ? ftdi_device : no_of_known_types;
2284 LOG_DEBUG("FTDI chip type: %i \"%s\"", (int)ftdi_device, type_str[type_index]);
2285 return ERROR_OK;
2286 }
2287
2288 static int ft2232_purge_libftdi(void)
2289 {
2290 if (ftdi_usb_purge_buffers(&ftdic) < 0) {
2291 LOG_ERROR("ftdi_purge_buffers: %s", ftdic.error_str);
2292 return ERROR_JTAG_INIT_FAILED;
2293 }
2294
2295 return ERROR_OK;
2296 }
2297
2298 #endif /* BUILD_FT2232_LIBFTDI == 1 */
2299
2300 static int ft2232_set_data_bits_low_byte(uint8_t value, uint8_t direction)
2301 {
2302 uint8_t buf[3];
2303 uint32_t bytes_written;
2304
2305 buf[0] = 0x80; /* command "set data bits low byte" */
2306 buf[1] = value; /* value */
2307 buf[2] = direction; /* direction */
2308
2309 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2310
2311 if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
2312 LOG_ERROR("couldn't initialize data bits low byte");
2313 return ERROR_JTAG_INIT_FAILED;
2314 }
2315
2316 return ERROR_OK;
2317 }
2318
2319 static int ft2232_set_data_bits_high_byte(uint8_t value, uint8_t direction)
2320 {
2321 uint8_t buf[3];
2322 uint32_t bytes_written;
2323
2324 buf[0] = 0x82; /* command "set data bits high byte" */
2325 buf[1] = value; /* value */
2326 buf[2] = direction; /* direction */
2327
2328 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2329
2330 if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
2331 LOG_ERROR("couldn't initialize data bits high byte");
2332 return ERROR_JTAG_INIT_FAILED;
2333 }
2334
2335 return ERROR_OK;
2336 }
2337
2338 static int ft2232_init(void)
2339 {
2340 uint8_t buf[1];
2341 int retval;
2342 uint32_t bytes_written;
2343
2344 LOG_WARNING("Using DEPRECATED interface driver 'ft2232'");
2345 #if BUILD_FTDI
2346 LOG_INFO("Consider using the 'ftdi' interface driver, with configuration files in interface/ftdi/...");
2347 #endif
2348
2349 if (tap_get_tms_path_len(TAP_IRPAUSE, TAP_IRPAUSE) == 7)
2350 LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
2351 else
2352 LOG_DEBUG("ft2232 interface using shortest path jtag state transitions");
2353 if (layout == NULL) {
2354 LOG_WARNING("No ft2232 layout specified'");
2355 return ERROR_JTAG_INIT_FAILED;
2356 }
2357
2358 for (int i = 0; 1; i++) {
2359 /*
2360 * "more indicates that there are more IDs to try, so we should
2361 * not print an error for an ID mismatch (but for anything
2362 * else, we should).
2363 *
2364 * try_more indicates that the error code returned indicates an
2365 * ID mismatch (and nothing else) and that we should proceeed
2366 * with the next ID pair.
2367 */
2368 int more = ft2232_vid[i + 1] || ft2232_pid[i + 1];
2369 int try_more = 0;
2370
2371 #if BUILD_FT2232_FTD2XX == 1
2372 retval = ft2232_init_ftd2xx(ft2232_vid[i], ft2232_pid[i],
2373 more, &try_more);
2374 #elif BUILD_FT2232_LIBFTDI == 1
2375 retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
2376 more, &try_more, ft2232_channel);
2377 #endif
2378 if (retval >= 0)
2379 break;
2380 if (!more || !try_more)
2381 return retval;
2382 }
2383
2384 ft2232_buffer_size = 0;
2385 ft2232_buffer = malloc(FT2232_BUFFER_SIZE);
2386
2387 if (layout->init() != ERROR_OK)
2388 return ERROR_JTAG_INIT_FAILED;
2389
2390 if (ft2232_device_is_highspeed()) {
2391 #ifndef BUILD_FT2232_HIGHSPEED
2392 #if BUILD_FT2232_FTD2XX == 1
2393 LOG_WARNING(
2394 "High Speed device found - You need a newer FTD2XX driver (version 2.04.16 or later)");
2395 #elif BUILD_FT2232_LIBFTDI == 1
2396 LOG_WARNING(
2397 "High Speed device found - You need a newer libftdi version (0.16 or later)");
2398 #endif
2399 #endif
2400 /* make sure the legacy mode is disabled */
2401 if (ftx232h_clk_divide_by_5(false) != ERROR_OK)
2402 return ERROR_JTAG_INIT_FAILED;
2403 }
2404
2405 buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
2406 retval = ft2232_write(buf, 1, &bytes_written);
2407 if (retval != ERROR_OK) {
2408 LOG_ERROR("couldn't write to FT2232 to disable loopback");
2409 return ERROR_JTAG_INIT_FAILED;
2410 }
2411
2412 #if BUILD_FT2232_FTD2XX == 1
2413 return ft2232_purge_ftd2xx();
2414 #elif BUILD_FT2232_LIBFTDI == 1
2415 return ft2232_purge_libftdi();
2416 #endif
2417
2418 return ERROR_OK;
2419 }
2420
2421 /** Updates defaults for DBUS signals: the four JTAG signals
2422 * (TCK, TDI, TDO, TMS) and * the four GPIOL signals.
2423 */
2424 static inline void ftx232_dbus_init(void)
2425 {
2426 low_output = 0x08;
2427 low_direction = 0x0b;
2428 }
2429
2430 /** Initializes DBUS signals: the four JTAG signals (TCK, TDI, TDO, TMS),
2431 * the four GPIOL signals. Initialization covers value and direction,
2432 * as customized for each layout.
2433 */
2434 static int ftx232_dbus_write(void)
2435 {
2436 enum reset_types jtag_reset_config = jtag_get_reset_config();
2437 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
2438 low_direction &= ~nTRSTnOE; /* nTRST input */
2439 low_output &= ~nTRST; /* nTRST = 0 */
2440 } else {
2441 low_direction |= nTRSTnOE; /* nTRST output */
2442 low_output |= nTRST; /* nTRST = 1 */
2443 }
2444
2445 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
2446 low_direction |= nSRSTnOE; /* nSRST output */
2447 low_output |= nSRST; /* nSRST = 1 */
2448 } else {
2449 low_direction &= ~nSRSTnOE; /* nSRST input */
2450 low_output &= ~nSRST; /* nSRST = 0 */
2451 }
2452
2453 /* initialize low byte for jtag */
2454 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2455 LOG_ERROR("couldn't initialize FT2232 DBUS");
2456 return ERROR_JTAG_INIT_FAILED;
2457 }
2458
2459 return ERROR_OK;
2460 }
2461
2462 static int usbjtag_init(void)
2463 {
2464 /*
2465 * NOTE: This is now _specific_ to the "usbjtag" layout.
2466 * Don't try cram any more layouts into this.
2467 */
2468 ftx232_dbus_init();
2469
2470 nTRST = 0x10;
2471 nTRSTnOE = 0x10;
2472 nSRST = 0x40;
2473 nSRSTnOE = 0x40;
2474
2475 return ftx232_dbus_write();
2476 }
2477
2478 static int lm3s811_jtag_init(void)
2479 {
2480 ftx232_dbus_init();
2481
2482 /* There are multiple revisions of LM3S811 eval boards:
2483 * - Rev B (and older?) boards have no SWO trace support.
2484 * - Rev C boards add ADBUS_6 DBG_ENn and BDBUS_4 SWO_EN;
2485 * they should use the "luminary_icdi" layout instead.
2486 */
2487 nTRST = 0x0;
2488 nTRSTnOE = 0x00;
2489 nSRST = 0x20;
2490 nSRSTnOE = 0x20;
2491 low_output = 0x88;
2492 low_direction = 0x8b;
2493
2494 return ftx232_dbus_write();
2495 }
2496
2497 static int icdi_jtag_init(void)
2498 {
2499 ftx232_dbus_init();
2500
2501 /* Most Luminary eval boards support SWO trace output,
2502 * and should use this "luminary_icdi" layout.
2503 *
2504 * ADBUS 0..3 are used for JTAG as usual. GPIOs are used
2505 * to switch between JTAG and SWD, or switch the ft2232 UART
2506 * on the second MPSSE channel/interface (BDBUS)
2507 * between (i) the stellaris UART (on Luminary boards)
2508 * or (ii) SWO trace data (generic).
2509 *
2510 * We come up in JTAG mode and may switch to SWD later (with
2511 * SWO/trace option if SWD is active).
2512 *
2513 * DBUS == GPIO-Lx
2514 * CBUS == GPIO-Hx
2515 */
2516
2517
2518 #define ICDI_JTAG_EN (1 << 7) /* ADBUS 7 (a.k.a. DBGMOD) */
2519 #define ICDI_DBG_ENn (1 << 6) /* ADBUS 6 */
2520 #define ICDI_SRST (1 << 5) /* ADBUS 5 */
2521
2522
2523 /* GPIOs on second channel/interface (UART) ... */
2524 #define ICDI_SWO_EN (1 << 4) /* BDBUS 4 */
2525 #define ICDI_TX_SWO (1 << 1) /* BDBUS 1 */
2526 #define ICDI_VCP_RX (1 << 0) /* BDBUS 0 (to stellaris UART) */
2527
2528 nTRST = 0x0;
2529 nTRSTnOE = 0x00;
2530 nSRST = ICDI_SRST;
2531 nSRSTnOE = ICDI_SRST;
2532
2533 low_direction |= ICDI_JTAG_EN | ICDI_DBG_ENn;
2534 low_output |= ICDI_JTAG_EN;
2535 low_output &= ~ICDI_DBG_ENn;
2536
2537 return ftx232_dbus_write();
2538 }
2539
2540 static int signalyzer_init(void)
2541 {
2542 ftx232_dbus_init();
2543
2544 nTRST = 0x10;
2545 nTRSTnOE = 0x10;
2546 nSRST = 0x20;
2547 nSRSTnOE = 0x20;
2548 return ftx232_dbus_write();
2549 }
2550
2551 static int axm0432_jtag_init(void)
2552 {
2553 low_output = 0x08;
2554 low_direction = 0x2b;
2555
2556 /* initialize low byte for jtag */
2557 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2558 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2559 return ERROR_JTAG_INIT_FAILED;
2560 }
2561
2562 if (strcmp(layout->name, "axm0432_jtag") == 0) {
2563 nTRST = 0x08;
2564 nTRSTnOE = 0x0; /* No output enable for TRST*/
2565 nSRST = 0x04;
2566 nSRSTnOE = 0x0; /* No output enable for SRST*/
2567 } else {
2568 LOG_ERROR("BUG: axm0432_jtag_init called for non axm0432 layout");
2569 exit(-1);
2570 }
2571
2572 high_output = 0x0;
2573 high_direction = 0x0c;
2574
2575 enum reset_types jtag_reset_config = jtag_get_reset_config();
2576 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2577 LOG_ERROR("can't set nTRSTOE to push-pull on the Dicarlo jtag");
2578 else
2579 high_output |= nTRST;
2580
2581 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2582 LOG_ERROR("can't set nSRST to push-pull on the Dicarlo jtag");
2583 else
2584 high_output |= nSRST;
2585
2586 /* initialize high byte for jtag */
2587 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2588 LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
2589 return ERROR_JTAG_INIT_FAILED;
2590 }
2591
2592 return ERROR_OK;
2593 }
2594
2595 static int redbee_init(void)
2596 {
2597 low_output = 0x08;
2598 low_direction = 0x2b;
2599
2600 /* initialize low byte for jtag */
2601 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2602 LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
2603 return ERROR_JTAG_INIT_FAILED;
2604 }
2605
2606 nTRST = 0x08;
2607 nTRSTnOE = 0x0; /* No output enable for TRST*/
2608 nSRST = 0x04;
2609 nSRSTnOE = 0x0; /* No output enable for SRST*/
2610
2611 high_output = 0x0;
2612 high_direction = 0x0c;
2613
2614 enum reset_types jtag_reset_config = jtag_get_reset_config();
2615 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2616 LOG_ERROR("can't set nTRSTOE to push-pull on redbee");
2617 else
2618 high_output |= nTRST;
2619
2620 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2621 LOG_ERROR("can't set nSRST to push-pull on redbee");
2622 else
2623 high_output |= nSRST;
2624
2625 /* initialize high byte for jtag */
2626 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2627 LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
2628 return ERROR_JTAG_INIT_FAILED;
2629 }
2630
2631 return ERROR_OK;
2632 }
2633
2634 static int jtagkey_init(void)
2635 {
2636 low_output = 0x08;
2637 low_direction = 0x1b;
2638
2639 /* initialize low byte for jtag */
2640 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2641 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2642 return ERROR_JTAG_INIT_FAILED;
2643 }
2644
2645 if (strcmp(layout->name, "jtagkey") == 0) {
2646 nTRST = 0x01;
2647 nTRSTnOE = 0x4;
2648 nSRST = 0x02;
2649 nSRSTnOE = 0x08;
2650 } else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0)
2651 || (strcmp(layout->name, "oocdlink") == 0)) {
2652 nTRST = 0x02;
2653 nTRSTnOE = 0x1;
2654 nSRST = 0x08;
2655 nSRSTnOE = 0x04;
2656 } else {
2657 LOG_ERROR("BUG: jtagkey_init called for non jtagkey layout");
2658 exit(-1);
2659 }
2660
2661 high_output = 0x0;
2662 high_direction = 0x0f;
2663
2664 enum reset_types jtag_reset_config = jtag_get_reset_config();
2665 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
2666 high_output |= nTRSTnOE;
2667 high_output &= ~nTRST;
2668 } else {
2669 high_output &= ~nTRSTnOE;
2670 high_output |= nTRST;
2671 }
2672
2673 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
2674 high_output &= ~nSRSTnOE;
2675 high_output |= nSRST;
2676 } else {
2677 high_output |= nSRSTnOE;
2678 high_output &= ~nSRST;
2679 }
2680
2681 /* initialize high byte for jtag */
2682 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2683 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2684 return ERROR_JTAG_INIT_FAILED;
2685 }
2686
2687 return ERROR_OK;
2688 }
2689
2690 static int olimex_jtag_init(void)
2691 {
2692 low_output = 0x08;
2693 low_direction = 0x1b;
2694
2695 /* initialize low byte for jtag */
2696 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2697 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2698 return ERROR_JTAG_INIT_FAILED;
2699 }
2700
2701 nTRST = 0x01;
2702 nTRSTnOE = 0x4;
2703 nSRST = 0x02;
2704 nSRSTnOE = 0x00;/* no output enable for nSRST */
2705
2706 high_output = 0x0;
2707 high_direction = 0x0f;
2708
2709 enum reset_types jtag_reset_config = jtag_get_reset_config();
2710 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
2711 high_output |= nTRSTnOE;
2712 high_output &= ~nTRST;
2713 } else {
2714 high_output &= ~nTRSTnOE;
2715 high_output |= nTRST;
2716 }
2717
2718 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2719 LOG_ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
2720 else
2721 high_output &= ~nSRST;
2722
2723 /* turn red LED on */
2724 high_output |= 0x08;
2725
2726 /* initialize high byte for jtag */
2727 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2728 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2729 return ERROR_JTAG_INIT_FAILED;
2730 }
2731
2732 return ERROR_OK;
2733 }
2734
2735 static int flyswatter_init(int rev)
2736 {
2737 low_output = 0x18;
2738 low_direction = 0x7b;
2739
2740 if ((rev < 0) || (rev > 3)) {
2741 LOG_ERROR("bogus 'flyswatter' revision supplied (%i)", rev);
2742 return ERROR_JTAG_INIT_FAILED;
2743 }
2744
2745 if (rev == 1)
2746 low_direction |= 1 << 7;
2747
2748 /* initialize low byte for jtag */
2749 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2750 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2751 return ERROR_JTAG_INIT_FAILED;
2752 }
2753
2754 nTRST = 0x10;
2755 nTRSTnOE = 0x0; /* not output enable for nTRST */
2756 nSRST = 0x20;
2757 nSRSTnOE = 0x00; /* no output enable for nSRST */
2758
2759 high_output = 0x00;
2760
2761 if (rev == 1)
2762 high_direction = 0x0c;
2763 else
2764 high_direction = 0x01;
2765
2766 /* turn red LED3 on, LED2 off */
2767 high_output |= 0x08;
2768
2769 /* initialize high byte for jtag */
2770 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2771 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2772 return ERROR_JTAG_INIT_FAILED;
2773 }
2774
2775 return ERROR_OK;
2776 }
2777
2778 static int flyswatter1_init(void)
2779 {
2780 return flyswatter_init(1);
2781 }
2782
2783 static int flyswatter2_init(void)
2784 {
2785 return flyswatter_init(2);
2786 }
2787
2788 static int minimodule_init(void)
2789 {
2790 low_output = 0x18; /* check if srst should be 1 or 0 initially. (0x08) (flyswatter was
2791 * 0x18) */
2792 low_direction = 0xfb; /* 0xfb; */
2793
2794 /* initialize low byte for jtag */
2795 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2796 LOG_ERROR("couldn't initialize FT2232 with 'minimodule' layout");
2797 return ERROR_JTAG_INIT_FAILED;
2798 }
2799
2800
2801 nSRST = 0x20;
2802
2803 high_output = 0x00;
2804 high_direction = 0x05;
2805
2806 /* turn red LED3 on, LED2 off */
2807 /* high_output |= 0x08; */
2808
2809 /* initialize high byte for jtag */
2810 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2811 LOG_ERROR("couldn't initialize FT2232 with 'minimodule' layout");
2812 return ERROR_JTAG_INIT_FAILED;
2813 }
2814
2815 return ERROR_OK;
2816 }
2817
2818 static int turtle_init(void)
2819 {
2820 low_output = 0x08;
2821 low_direction = 0x5b;
2822
2823 /* initialize low byte for jtag */
2824 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2825 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2826 return ERROR_JTAG_INIT_FAILED;
2827 }
2828
2829 nSRST = 0x40;
2830
2831 high_output = 0x00;
2832 high_direction = 0x0C;
2833
2834 /* initialize high byte for jtag */
2835 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2836 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2837 return ERROR_JTAG_INIT_FAILED;
2838 }
2839
2840 return ERROR_OK;
2841 }
2842
2843 static int comstick_init(void)
2844 {
2845 low_output = 0x08;
2846 low_direction = 0x0b;
2847
2848 /* initialize low byte for jtag */
2849 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2850 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2851 return ERROR_JTAG_INIT_FAILED;
2852 }
2853
2854 nTRST = 0x01;
2855 nTRSTnOE = 0x00; /* no output enable for nTRST */
2856 nSRST = 0x02;
2857 nSRSTnOE = 0x00; /* no output enable for nSRST */
2858
2859 high_output = 0x03;
2860 high_direction = 0x03;
2861
2862 /* initialize high byte for jtag */
2863 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2864 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2865 return ERROR_JTAG_INIT_FAILED;
2866 }
2867
2868 return ERROR_OK;
2869 }
2870
2871 static int stm32stick_init(void)
2872 {
2873 low_output = 0x88;
2874 low_direction = 0x8b;
2875
2876 /* initialize low byte for jtag */
2877 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2878 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2879 return ERROR_JTAG_INIT_FAILED;
2880 }
2881
2882 nTRST = 0x01;
2883 nTRSTnOE = 0x00; /* no output enable for nTRST */
2884 nSRST = 0x80;
2885 nSRSTnOE = 0x00; /* no output enable for nSRST */
2886
2887 high_output = 0x01;
2888 high_direction = 0x03;
2889
2890 /* initialize high byte for jtag */
2891 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2892 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2893 return ERROR_JTAG_INIT_FAILED;
2894 }
2895
2896 return ERROR_OK;
2897 }
2898
2899 static int sheevaplug_init(void)
2900 {
2901 low_output = 0x08;
2902 low_direction = 0x1b;
2903
2904 /* initialize low byte for jtag */
2905 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2906 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2907 return ERROR_JTAG_INIT_FAILED;
2908 }
2909
2910 nTRSTnOE = 0x1;
2911 nTRST = 0x02;
2912 nSRSTnOE = 0x4;
2913 nSRST = 0x08;
2914
2915 high_output = 0x0;
2916 high_direction = 0x0f;
2917
2918 /* nTRST is always push-pull */
2919 high_output &= ~nTRSTnOE;
2920 high_output |= nTRST;
2921
2922 /* nSRST is always open-drain */
2923 high_output |= nSRSTnOE;
2924 high_output &= ~nSRST;
2925
2926 /* initialize high byte for jtag */
2927 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2928 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2929 return ERROR_JTAG_INIT_FAILED;
2930 }
2931
2932 return ERROR_OK;
2933 }
2934
2935 static int cortino_jtag_init(void)
2936 {
2937 low_output = 0x08;
2938 low_direction = 0x1b;
2939
2940 /* initialize low byte for jtag */
2941 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
2942 LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
2943 return ERROR_JTAG_INIT_FAILED;
2944 }
2945
2946 nTRST = 0x01;
2947 nTRSTnOE = 0x00; /* no output enable for nTRST */
2948 nSRST = 0x02;
2949 nSRSTnOE = 0x00; /* no output enable for nSRST */
2950
2951 high_output = 0x03;
2952 high_direction = 0x03;
2953
2954 /* initialize high byte for jtag */
2955 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2956 LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
2957 return ERROR_JTAG_INIT_FAILED;
2958 }
2959
2960 return ERROR_OK;
2961 }
2962
2963 static int lisa_l_init(void)
2964 {
2965 ftx232_dbus_init();
2966
2967 nTRST = 0x10;
2968 nTRSTnOE = 0x10;
2969 nSRST = 0x40;
2970 nSRSTnOE = 0x40;
2971
2972 high_output = 0x00;
2973 high_direction = 0x18;
2974
2975 /* initialize high byte for jtag */
2976 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2977 LOG_ERROR("couldn't initialize FT2232 with 'lisa_l' layout");
2978 return ERROR_JTAG_INIT_FAILED;
2979 }
2980
2981 return ftx232_dbus_write();
2982 }
2983
2984 static int flossjtag_init(void)
2985 {
2986 ftx232_dbus_init();
2987
2988 nTRST = 0x10;
2989 nTRSTnOE = 0x10;
2990 nSRST = 0x40;
2991 nSRSTnOE = 0x40;
2992
2993 high_output = 0x00;
2994 high_direction = 0x18;
2995
2996 /* initialize high byte for jtag */
2997 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
2998 LOG_ERROR("couldn't initialize FT2232 with 'Floss-JTAG' layout");
2999 return ERROR_JTAG_INIT_FAILED;
3000 }
3001
3002 return ftx232_dbus_write();
3003 }
3004
3005 /*
3006 * The reference schematic from TI for the XDS100v2 has a CPLD on which opens
3007 * the door for a number of different configurations
3008 *
3009 * Known Implementations:
3010 * http://processors.wiki.ti.com/images/9/93/TMS570LS20216_USB_STICK_Schematic.pdf
3011 *
3012 * http://processors.wiki.ti.com/index.php/XDS100 (rev2)
3013 * * CLPD logic: Rising edge to enable outputs (XDS100_PWR_RST)
3014 * * ACBUS3 to transition 0->1 (OE rising edge)
3015 * * CPLD logic: Put the EMU0/1 pins in Hi-Z:
3016 * * ADBUS5/GPIOL1 = EMU_EN = 1
3017 * * ADBUS6/GPIOL2 = EMU0 = 0
3018 * * ACBUS4/SPARE0 = EMU1 = 0
3019 * * CPLD logic: Disable loopback
3020 * * ACBUS6/SPARE2 = LOOPBACK = 0
3021 */
3022 #define XDS100_nEMU_EN (1<<5)
3023 #define XDS100_nEMU0 (1<<6)
3024
3025 #define XDS100_PWR_RST (1<<3)
3026 #define XDS100_nEMU1 (1<<4)
3027 #define XDS100_LOOPBACK (1<<6)
3028 static int xds100v2_init(void)
3029 {
3030 /* These are in the lower byte */
3031 nTRST = 0x10;
3032 nTRSTnOE = 0x10;
3033
3034 /* These aren't actually used on 14 pin connectors
3035 * These are in the upper byte */
3036 nSRST = 0x01;
3037 nSRSTnOE = 0x01;
3038
3039 low_output = 0x08 | nTRST | XDS100_nEMU_EN;
3040 low_direction = 0x0b | nTRSTnOE | XDS100_nEMU_EN | XDS100_nEMU0;
3041
3042 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
3043 LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout");
3044 return ERROR_JTAG_INIT_FAILED;
3045 }
3046
3047 high_output = 0;
3048 high_direction = nSRSTnOE | XDS100_LOOPBACK | XDS100_PWR_RST | XDS100_nEMU1;
3049
3050 /* initialize high byte for jtag */
3051 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
3052 LOG_ERROR("couldn't put CPLD in to reset with 'xds100v2' layout");
3053 return ERROR_JTAG_INIT_FAILED;
3054 }
3055
3056 high_output |= XDS100_PWR_RST;
3057
3058 /* initialize high byte for jtag */
3059 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
3060 LOG_ERROR("couldn't bring CPLD out of reset with 'xds100v2' layout");
3061 return ERROR_JTAG_INIT_FAILED;
3062 }
3063
3064 return ERROR_OK;
3065 }
3066
3067 static void olimex_jtag_blink(void)
3068 {
3069 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
3070 * ACBUS3 is bit 3 of the GPIOH port
3071 */
3072 high_output ^= 0x08;
3073
3074 buffer_write(0x82);
3075 buffer_write(high_output);
3076 buffer_write(high_direction);
3077 }
3078
3079 static void flyswatter_jtag_blink(unsigned char led)
3080 {
3081 buffer_write(0x82);
3082 buffer_write(high_output ^ led);
3083 buffer_write(high_direction);
3084 }
3085
3086 static void flyswatter1_jtag_blink(void)
3087 {
3088 /*
3089 * Flyswatter has two LEDs connected to ACBUS2 and ACBUS3
3090 */
3091 flyswatter_jtag_blink(0xc);
3092 }
3093
3094 static void flyswatter2_jtag_blink(void)
3095 {
3096 /*
3097 * Flyswatter2 only has one LED connected to ACBUS2
3098 */
3099 flyswatter_jtag_blink(0x4);
3100 }
3101
3102 static void turtle_jtag_blink(void)
3103 {
3104 /*
3105 * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
3106 */
3107 if (high_output & 0x08)
3108 high_output = 0x04;
3109 else
3110 high_output = 0x08;
3111
3112 buffer_write(0x82);
3113 buffer_write(high_output);
3114 buffer_write(high_direction);
3115 }
3116
3117 static void lisa_l_blink(void)
3118 {
3119 /*
3120 * Lisa/L has two LEDs connected to BCBUS3 and BCBUS4
3121 */
3122 if (high_output & 0x10)
3123 high_output = 0x08;
3124 else
3125 high_output = 0x10;
3126
3127 buffer_write(0x82);
3128 buffer_write(high_output);
3129 buffer_write(high_direction);
3130 }
3131
3132 static void flossjtag_blink(void)
3133 {
3134 /*
3135 * Floss-JTAG has two LEDs connected to ACBUS3 and ACBUS4
3136 */
3137 if (high_output & 0x10)
3138 high_output = 0x08;
3139 else
3140 high_output = 0x10;
3141
3142 buffer_write(0x82);
3143 buffer_write(high_output);
3144 buffer_write(high_direction);
3145 }
3146
3147 static int ft2232_quit(void)
3148 {
3149 #if BUILD_FT2232_FTD2XX == 1
3150
3151 FT_Close(ftdih);
3152 #elif BUILD_FT2232_LIBFTDI == 1
3153 ftdi_usb_close(&ftdic);
3154
3155 ftdi_deinit(&ftdic);
3156 #endif
3157
3158 free(ft2232_buffer);
3159 ft2232_buffer = NULL;
3160
3161 return ERROR_OK;
3162 }
3163
3164 COMMAND_HANDLER(ft2232_handle_device_desc_command)
3165 {
3166 char *cp;
3167 char buf[200];
3168 if (CMD_ARGC == 1) {
3169 ft2232_device_desc = strdup(CMD_ARGV[0]);
3170 cp = strchr(ft2232_device_desc, 0);
3171 /* under Win32, the FTD2XX driver appends an "A" to the end
3172 * of the description, this examines the given desc
3173 * and creates the 'missing' _A or non_A variable. */
3174 if ((cp[-1] == 'A') && (cp[-2] == ' ')) {
3175 /* it was, so make this the "A" version. */
3176 ft2232_device_desc_A = ft2232_device_desc;
3177 /* and *CREATE* the non-A version. */
3178 strcpy(buf, ft2232_device_desc);
3179 cp = strchr(buf, 0);
3180 cp[-2] = 0;
3181 ft2232_device_desc = strdup(buf);
3182 } else {
3183 /* <space > A not defined
3184 * so create it */
3185 sprintf(buf, "%s A", ft2232_device_desc);
3186 ft2232_device_desc_A = strdup(buf);
3187 }
3188 } else
3189 LOG_ERROR("expected exactly one argument to ft2232_device_desc <description>");
3190
3191 return ERROR_OK;
3192 }
3193
3194 COMMAND_HANDLER(ft2232_handle_serial_command)
3195 {
3196 if (CMD_ARGC == 1)
3197 ft2232_serial = strdup(CMD_ARGV[0]);
3198 else
3199 return ERROR_COMMAND_SYNTAX_ERROR;
3200
3201 return ERROR_OK;
3202 }
3203
3204 COMMAND_HANDLER(ft2232_handle_layout_command)
3205 {
3206 if (CMD_ARGC != 1)
3207 return ERROR_COMMAND_SYNTAX_ERROR;
3208
3209 if (layout) {
3210 LOG_ERROR("already specified ft2232_layout %s",
3211 layout->name);
3212 return (strcmp(layout->name, CMD_ARGV[0]) != 0)
3213 ? ERROR_FAIL
3214 : ERROR_OK;
3215 }
3216
3217 for (const struct ft2232_layout *l = ft2232_layouts; l->name; l++) {
3218 if (strcmp(l->name, CMD_ARGV[0]) == 0) {
3219 layout = l;
3220 ft2232_channel = l->channel;
3221 return ERROR_OK;
3222 }
3223 }
3224
3225 LOG_ERROR("No FT2232 layout '%s' found", CMD_ARGV[0]);
3226 return ERROR_FAIL;
3227 }
3228
3229 COMMAND_HANDLER(ft2232_handle_vid_pid_command)
3230 {
3231 if (CMD_ARGC > MAX_USB_IDS * 2) {
3232 LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
3233 "(maximum is %d pairs)", MAX_USB_IDS);
3234 CMD_ARGC = MAX_USB_IDS * 2;
3235 }
3236 if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
3237 LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
3238 if (CMD_ARGC < 2)
3239 return ERROR_COMMAND_SYNTAX_ERROR;
3240 /* remove the incomplete trailing id */
3241 CMD_ARGC -= 1;
3242 }
3243
3244 unsigned i;
3245 for (i = 0; i < CMD_ARGC; i += 2) {
3246 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], ft2232_vid[i >> 1]);
3247 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], ft2232_pid[i >> 1]);
3248 }
3249
3250 /*
3251 * Explicitly terminate, in case there are multiples instances of
3252 * ft2232_vid_pid.
3253 */
3254 ft2232_vid[i >> 1] = ft2232_pid[i >> 1] = 0;
3255
3256 return ERROR_OK;
3257 }
3258
3259 COMMAND_HANDLER(ft2232_handle_latency_command)
3260 {
3261 if (CMD_ARGC == 1)
3262 ft2232_latency = atoi(CMD_ARGV[0]);
3263 else
3264 return ERROR_COMMAND_SYNTAX_ERROR;
3265
3266 return ERROR_OK;
3267 }
3268
3269 COMMAND_HANDLER(ft2232_handle_channel_command)
3270 {
3271 if (CMD_ARGC == 1) {
3272 ft2232_channel = atoi(CMD_ARGV[0]);
3273 if (ft2232_channel < 0 || ft2232_channel > 4)
3274 LOG_ERROR("ft2232_channel must be in the 0 to 4 range");
3275 } else
3276 LOG_ERROR("expected exactly one argument to ft2232_channel <ch>");
3277
3278 return ERROR_OK;
3279 }
3280
3281 static int ft2232_stableclocks(int num_cycles, struct jtag_command *cmd)
3282 {
3283 int retval = 0;
3284
3285 /* 7 bits of either ones or zeros. */
3286 uint8_t tms = (tap_get_state() == TAP_RESET ? 0x7F : 0x00);
3287
3288 while (num_cycles > 0) {
3289 /* the command 0x4b, "Clock Data to TMS/CS Pin (no Read)" handles
3290 * at most 7 bits per invocation. Here we invoke it potentially
3291 * several times.
3292 */
3293 int bitcount_per_command = (num_cycles > 7) ? 7 : num_cycles;
3294
3295 if (ft2232_buffer_size + 3 >= FT2232_BUFFER_SIZE) {
3296 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
3297 retval = ERROR_JTAG_QUEUE_FAILED;
3298
3299 first_unsent = cmd;
3300 }
3301
3302 /* there are no state transitions in this code, so omit state tracking */
3303
3304 /* command "Clock Data to TMS/CS Pin (no Read)" */
3305 buffer_write(0x4b);
3306
3307 /* scan 7 bit */
3308 buffer_write(bitcount_per_command - 1);
3309
3310 /* TMS data bits are either all zeros or ones to stay in the current stable state */
3311 buffer_write(tms);
3312
3313 require_send = 1;
3314
3315 num_cycles -= bitcount_per_command;
3316 }
3317
3318 return retval;
3319 }
3320
3321 /* ---------------------------------------------------------------------
3322 * Support for IceBear JTAG adapter from Section5:
3323 * http://section5.ch/icebear
3324 *
3325 * Author: Sten, debian@sansys-electronic.com
3326 */
3327
3328 /* Icebear pin layout
3329 *
3330 * ADBUS5 (nEMU) nSRST | 2 1| GND (10k->VCC)
3331 * GND GND | 4 3| n.c.
3332 * ADBUS3 TMS | 6 5| ADBUS6 VCC
3333 * ADBUS0 TCK | 8 7| ADBUS7 (GND)
3334 * ADBUS4 nTRST |10 9| ACBUS0 (GND)
3335 * ADBUS1 TDI |12 11| ACBUS1 (GND)
3336 * ADBUS2 TDO |14 13| GND GND
3337 *
3338 * ADBUS0 O L TCK ACBUS0 GND
3339 * ADBUS1 O L TDI ACBUS1 GND
3340 * ADBUS2 I TDO ACBUS2 n.c.
3341 * ADBUS3 O H TMS ACBUS3 n.c.
3342 * ADBUS4 O H nTRST
3343 * ADBUS5 O H nSRST
3344 * ADBUS6 - VCC
3345 * ADBUS7 - GND
3346 */
3347 static int icebear_jtag_init(void)
3348 {
3349 low_direction = 0x0b; /* output: TCK TDI TMS; input: TDO */
3350 low_output = 0x08; /* high: TMS; low: TCK TDI */
3351 nTRST = 0x10;
3352 nSRST = 0x20;
3353
3354 enum reset_types jtag_reset_config = jtag_get_reset_config();
3355 if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0)
3356 low_direction &= ~nTRST; /* nTRST high impedance */
3357 else {
3358 low_direction |= nTRST;
3359 low_output |= nTRST;
3360 }
3361
3362 low_direction |= nSRST;
3363 low_output |= nSRST;
3364
3365 /* initialize low byte for jtag */
3366 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
3367 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)");
3368 return ERROR_JTAG_INIT_FAILED;
3369 }
3370
3371 high_output = 0x0;
3372 high_direction = 0x00;
3373
3374 /* initialize high byte for jtag */
3375 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
3376 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)");
3377 return ERROR_JTAG_INIT_FAILED;
3378 }
3379
3380 return ERROR_OK;
3381 }
3382
3383 static void icebear_jtag_reset(int trst, int srst)
3384 {
3385 if (trst == 1) {
3386 low_direction |= nTRST;
3387 low_output &= ~nTRST;
3388 } else if (trst == 0) {
3389 enum reset_types jtag_reset_config = jtag_get_reset_config();
3390 if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0)
3391 low_direction &= ~nTRST;
3392 else
3393 low_output |= nTRST;
3394 }
3395
3396 if (srst == 1)
3397 low_output &= ~nSRST;
3398 else if (srst == 0)
3399 low_output |= nSRST;
3400
3401 /* command "set data bits low byte" */
3402 buffer_write(0x80);
3403 buffer_write(low_output);
3404 buffer_write(low_direction);
3405
3406 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
3407 trst,
3408 srst,
3409 low_output,
3410 low_direction);
3411 }
3412
3413 /* ---------------------------------------------------------------------
3414 * Support for Signalyzer H2 and Signalyzer H4
3415 * JTAG adapter from Xverve Technologies Inc.
3416 * http://www.signalyzer.com or http://www.xverve.com
3417 *
3418 * Author: Oleg Seiljus, oleg@signalyzer.com
3419 */
3420 static unsigned char signalyzer_h_side;
3421 static unsigned int signalyzer_h_adapter_type;
3422
3423 static int signalyzer_h_ctrl_write(int address, unsigned short value);
3424
3425 #if BUILD_FT2232_FTD2XX == 1
3426 static int signalyzer_h_ctrl_read(int address, unsigned short *value);
3427 #endif
3428
3429 #define SIGNALYZER_COMMAND_ADDR 128
3430 #define SIGNALYZER_DATA_BUFFER_ADDR 129
3431
3432 #define SIGNALYZER_COMMAND_VERSION 0x41
3433 #define SIGNALYZER_COMMAND_RESET 0x42
3434 #define SIGNALYZER_COMMAND_POWERCONTROL_GET 0x50
3435 #define SIGNALYZER_COMMAND_POWERCONTROL_SET 0x51
3436 #define SIGNALYZER_COMMAND_PWM_SET 0x52
3437 #define SIGNALYZER_COMMAND_LED_SET 0x53
3438 #define SIGNALYZER_COMMAND_ADC 0x54
3439 #define SIGNALYZER_COMMAND_GPIO_STATE 0x55
3440 #define SIGNALYZER_COMMAND_GPIO_MODE 0x56
3441 #define SIGNALYZER_COMMAND_GPIO_PORT 0x57
3442 #define SIGNALYZER_COMMAND_I2C 0x58
3443
3444 #define SIGNALYZER_CHAN_A 1
3445 #define SIGNALYZER_CHAN_B 2
3446 /* LEDS use channel C */
3447 #define SIGNALYZER_CHAN_C 4
3448
3449 #define SIGNALYZER_LED_GREEN 1
3450 #define SIGNALYZER_LED_RED 2
3451
3452 #define SIGNALYZER_MODULE_TYPE_EM_LT16_A 0x0301
3453 #define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG 0x0302
3454 #define SIGNALYZER_MODULE_TYPE_EM_JTAG 0x0303
3455 #define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P 0x0304
3456 #define SIGNALYZER_MODULE_TYPE_EM_JTAG_P 0x0305
3457
3458
3459 static int signalyzer_h_ctrl_write(int address, unsigned short value)
3460 {
3461 #if BUILD_FT2232_FTD2XX == 1
3462 return FT_WriteEE(ftdih, address, value);
3463 #elif BUILD_FT2232_LIBFTDI == 1
3464 return 0;
3465 #endif
3466 }
3467
3468 #if BUILD_FT2232_FTD2XX == 1
3469 static int signalyzer_h_ctrl_read(int address, unsigned short *value)
3470 {
3471 return FT_ReadEE(ftdih, address, value);
3472 }
3473 #endif
3474
3475 static int signalyzer_h_led_set(unsigned char channel, unsigned char led,
3476 int on_time_ms, int off_time_ms, unsigned char cycles)
3477 {
3478 unsigned char on_time;
3479 unsigned char off_time;
3480
3481 if (on_time_ms < 0xFFFF)
3482 on_time = (unsigned char)(on_time_ms / 62);
3483 else
3484 on_time = 0xFF;
3485
3486 off_time = (unsigned char)(off_time_ms / 62);
3487
3488 #if BUILD_FT2232_FTD2XX == 1
3489 FT_STATUS status;
3490
3491 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3492 ((uint32_t)(channel << 8) | led));
3493 if (status != FT_OK) {
3494 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3495 ftd2xx_status_string(status));
3496 return ERROR_JTAG_DEVICE_ERROR;
3497 }
3498
3499 status = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 1),
3500 ((uint32_t)(on_time << 8) | off_time));
3501 if (status != FT_OK) {
3502 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3503 ftd2xx_status_string(status));
3504 return ERROR_JTAG_DEVICE_ERROR;
3505 }
3506
3507 status = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 2),
3508 ((uint32_t)cycles));
3509 if (status != FT_OK) {
3510 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3511 ftd2xx_status_string(status));
3512 return ERROR_JTAG_DEVICE_ERROR;
3513 }
3514
3515 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3516 SIGNALYZER_COMMAND_LED_SET);
3517 if (status != FT_OK) {
3518 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3519 ftd2xx_status_string(status));
3520 return ERROR_JTAG_DEVICE_ERROR;
3521 }
3522
3523 return ERROR_OK;
3524 #elif BUILD_FT2232_LIBFTDI == 1
3525 int retval;
3526
3527 retval = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3528 ((uint32_t)(channel << 8) | led));
3529 if (retval < 0) {
3530 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3531 ftdi_get_error_string(&ftdic));
3532 return ERROR_JTAG_DEVICE_ERROR;
3533 }
3534
3535 retval = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 1),
3536 ((uint32_t)(on_time << 8) | off_time));
3537 if (retval < 0) {
3538 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3539 ftdi_get_error_string(&ftdic));
3540 return ERROR_JTAG_DEVICE_ERROR;
3541 }
3542
3543 retval = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 2),
3544 (uint32_t)cycles);
3545 if (retval < 0) {
3546 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3547 ftdi_get_error_string(&ftdic));
3548 return ERROR_JTAG_DEVICE_ERROR;
3549 }
3550
3551 retval = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3552 SIGNALYZER_COMMAND_LED_SET);
3553 if (retval < 0) {
3554 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3555 ftdi_get_error_string(&ftdic));
3556 return ERROR_JTAG_DEVICE_ERROR;
3557 }
3558
3559 return ERROR_OK;
3560 #endif
3561 }
3562
3563 static int signalyzer_h_init(void)
3564 {
3565 #if BUILD_FT2232_FTD2XX == 1
3566 FT_STATUS status;
3567 int i;
3568 #endif
3569
3570 char *end_of_desc;
3571
3572 uint16_t read_buf[12] = { 0 };
3573
3574 /* turn on center green led */
3575 signalyzer_h_led_set(SIGNALYZER_CHAN_C, SIGNALYZER_LED_GREEN,
3576 0xFFFF, 0x00, 0x00);
3577
3578 /* determine what channel config wants to open
3579 * TODO: change me... current implementation is made to work
3580 * with openocd description parsing.
3581 */
3582 end_of_desc = strrchr(ft2232_device_desc, 0x00);
3583
3584 if (end_of_desc) {
3585 signalyzer_h_side = *(end_of_desc - 1);
3586 if (signalyzer_h_side == 'B')
3587 signalyzer_h_side = SIGNALYZER_CHAN_B;
3588 else
3589 signalyzer_h_side = SIGNALYZER_CHAN_A;
3590 } else {
3591 LOG_ERROR("No Channel was specified");
3592 return ERROR_FAIL;
3593 }
3594
3595 signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_GREEN,
3596 1000, 1000, 0xFF);
3597
3598 #if BUILD_FT2232_FTD2XX == 1
3599 /* read signalyzer versionining information */
3600 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3601 SIGNALYZER_COMMAND_VERSION);
3602 if (status != FT_OK) {
3603 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3604 ftd2xx_status_string(status));
3605 return ERROR_JTAG_DEVICE_ERROR;
3606 }
3607
3608 for (i = 0; i < 10; i++) {
3609 status = signalyzer_h_ctrl_read((SIGNALYZER_DATA_BUFFER_ADDR + i),
3610 &read_buf[i]);
3611 if (status != FT_OK) {
3612 LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
3613 ftd2xx_status_string(status));
3614 return ERROR_JTAG_DEVICE_ERROR;
3615 }
3616 }
3617
3618 LOG_INFO("Signalyzer: ID info: { %.4x %.4x %.4x %.4x %.4x %.4x %.4x }",
3619 read_buf[0], read_buf[1], read_buf[2], read_buf[3],
3620 read_buf[4], read_buf[5], read_buf[6]);
3621
3622 /* set gpio register */
3623 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3624 (uint32_t)(signalyzer_h_side << 8));
3625 if (status != FT_OK) {
3626 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3627 ftd2xx_status_string(status));
3628 return ERROR_JTAG_DEVICE_ERROR;
3629 }
3630
3631 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0404);
3632 if (status != FT_OK) {
3633 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3634 ftd2xx_status_string(status));
3635 return ERROR_JTAG_DEVICE_ERROR;
3636 }
3637
3638 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3639 SIGNALYZER_COMMAND_GPIO_STATE);
3640 if (status != FT_OK) {
3641 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3642 ftd2xx_status_string(status));
3643 return ERROR_JTAG_DEVICE_ERROR;
3644 }
3645
3646 /* read adapter type information */
3647 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3648 ((uint32_t)(signalyzer_h_side << 8) | 0x01));
3649 if (status != FT_OK) {
3650 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3651 ftd2xx_status_string(status));
3652 return ERROR_JTAG_DEVICE_ERROR;
3653 }
3654
3655 status = signalyzer_h_ctrl_write(
3656 (SIGNALYZER_DATA_BUFFER_ADDR + 1), 0xA000);
3657 if (status != FT_OK) {
3658 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3659 ftd2xx_status_string(status));
3660 return ERROR_JTAG_DEVICE_ERROR;
3661 }
3662
3663 status = signalyzer_h_ctrl_write(
3664 (SIGNALYZER_DATA_BUFFER_ADDR + 2), 0x0008);
3665 if (status != FT_OK) {
3666 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3667 ftd2xx_status_string(status));
3668 return ERROR_JTAG_DEVICE_ERROR;
3669 }
3670
3671 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3672 SIGNALYZER_COMMAND_I2C);
3673 if (status != FT_OK) {
3674 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3675 ftd2xx_status_string(status));
3676 return ERROR_JTAG_DEVICE_ERROR;
3677 }
3678
3679 usleep(100000);
3680
3681 status = signalyzer_h_ctrl_read(SIGNALYZER_COMMAND_ADDR, &read_buf[0]);
3682 if (status != FT_OK) {
3683 LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
3684 ftd2xx_status_string(status));
3685 return ERROR_JTAG_DEVICE_ERROR;
3686 }
3687
3688 if (read_buf[0] != 0x0498)
3689 signalyzer_h_adapter_type = 0x0000;
3690 else {
3691 for (i = 0; i < 4; i++) {
3692 status = signalyzer_h_ctrl_read((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i]);
3693 if (status != FT_OK) {
3694 LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
3695 ftd2xx_status_string(status));
3696 return ERROR_JTAG_DEVICE_ERROR;
3697 }
3698 }
3699
3700 signalyzer_h_adapter_type = read_buf[0];
3701 }
3702
3703 #elif BUILD_FT2232_LIBFTDI == 1
3704 /* currently libftdi does not allow reading individual eeprom
3705 * locations, therefore adapter type cannot be detected.
3706 * override with most common type
3707 */
3708 signalyzer_h_adapter_type = SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG;
3709 #endif
3710
3711 enum reset_types jtag_reset_config = jtag_get_reset_config();
3712
3713 /* ADAPTOR: EM_LT16_A */
3714 if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) {
3715 LOG_INFO("Signalyzer: EM-LT (16-channel level translator) "
3716 "detected. (HW: %2x).", (read_buf[1] >> 8));
3717
3718 nTRST = 0x10;
3719 nTRSTnOE = 0x10;
3720 nSRST = 0x20;
3721 nSRSTnOE = 0x20;
3722
3723 low_output = 0x08;
3724 low_direction = 0x1b;
3725
3726 high_output = 0x0;
3727 high_direction = 0x0;
3728
3729 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
3730 low_direction &= ~nTRSTnOE; /* nTRST input */
3731 low_output &= ~nTRST; /* nTRST = 0 */
3732 } else {
3733 low_direction |= nTRSTnOE; /* nTRST output */
3734 low_output |= nTRST; /* nTRST = 1 */
3735 }
3736
3737 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
3738 low_direction |= nSRSTnOE; /* nSRST output */
3739 low_output |= nSRST; /* nSRST = 1 */
3740 } else {
3741 low_direction &= ~nSRSTnOE; /* nSRST input */
3742 low_output &= ~nSRST; /* nSRST = 0 */
3743 }
3744
3745 #if BUILD_FT2232_FTD2XX == 1
3746 /* enable power to the module */
3747 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3748 ((uint32_t)(signalyzer_h_side << 8) | 0x01));
3749 if (status != FT_OK) {
3750 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3751 ftd2xx_status_string(status));
3752 return ERROR_JTAG_DEVICE_ERROR;
3753 }
3754
3755 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3756 SIGNALYZER_COMMAND_POWERCONTROL_SET);
3757 if (status != FT_OK) {
3758 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3759 ftd2xx_status_string(status));
3760 return ERROR_JTAG_DEVICE_ERROR;
3761 }
3762
3763 /* set gpio mode register */
3764 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3765 (uint32_t)(signalyzer_h_side << 8));
3766 if (status != FT_OK) {
3767 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3768 ftd2xx_status_string(status));
3769 return ERROR_JTAG_DEVICE_ERROR;
3770 }
3771
3772 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000);
3773 if (status != FT_OK) {
3774 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3775 ftd2xx_status_string(status));
3776 return ERROR_JTAG_DEVICE_ERROR;
3777 }
3778
3779 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE);
3780 if (status != FT_OK) {
3781 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3782 ftd2xx_status_string(status));
3783 return ERROR_JTAG_DEVICE_ERROR;
3784 }
3785
3786 /* set gpio register */
3787 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3788 (uint32_t)(signalyzer_h_side << 8));
3789 if (status != FT_OK) {
3790 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3791 ftd2xx_status_string(status));
3792 return ERROR_JTAG_DEVICE_ERROR;
3793 }
3794
3795 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040);
3796 if (status != FT_OK) {
3797 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3798 ftd2xx_status_string(status));
3799 return ERROR_JTAG_DEVICE_ERROR;
3800 }
3801
3802 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3803 SIGNALYZER_COMMAND_GPIO_STATE);
3804 if (status != FT_OK) {
3805 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3806 ftd2xx_status_string(status));
3807 return ERROR_JTAG_DEVICE_ERROR;
3808 }
3809 #endif
3810 }
3811 /* ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */
3812 else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
3813 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
3814 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG) ||
3815 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) {
3816 if (signalyzer_h_adapter_type
3817 == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG)
3818 LOG_INFO("Signalyzer: EM-ARM-JTAG (ARM JTAG) "
3819 "detected. (HW: %2x).", (read_buf[1] >> 8));
3820 else if (signalyzer_h_adapter_type
3821 == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P)
3822 LOG_INFO("Signalyzer: EM-ARM-JTAG_P "
3823 "(ARM JTAG with PSU) detected. (HW: %2x).",
3824 (read_buf[1] >> 8));
3825 else if (signalyzer_h_adapter_type
3826 == SIGNALYZER_MODULE_TYPE_EM_JTAG)
3827 LOG_INFO("Signalyzer: EM-JTAG (Generic JTAG) "
3828 "detected. (HW: %2x).", (read_buf[1] >> 8));
3829 else if (signalyzer_h_adapter_type
3830 == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)
3831 LOG_INFO("Signalyzer: EM-JTAG-P "
3832 "(Generic JTAG with PSU) detected. (HW: %2x).",
3833 (read_buf[1] >> 8));
3834
3835 nTRST = 0x02;
3836 nTRSTnOE = 0x04;
3837 nSRST = 0x08;
3838 nSRSTnOE = 0x10;
3839
3840 low_output = 0x08;
3841 low_direction = 0x1b;
3842
3843 high_output = 0x0;
3844 high_direction = 0x1f;
3845
3846 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
3847 high_output |= nTRSTnOE;
3848 high_output &= ~nTRST;
3849 } else {
3850 high_output &= ~nTRSTnOE;
3851 high_output |= nTRST;
3852 }
3853
3854 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
3855 high_output &= ~nSRSTnOE;
3856 high_output |= nSRST;
3857 } else {
3858 high_output |= nSRSTnOE;
3859 high_output &= ~nSRST;
3860 }
3861
3862 #if BUILD_FT2232_FTD2XX == 1
3863 /* enable power to the module */
3864 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3865 ((uint32_t)(signalyzer_h_side << 8) | 0x01));
3866 if (status != FT_OK) {
3867 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3868 ftd2xx_status_string(status));
3869 return ERROR_JTAG_DEVICE_ERROR;
3870 }
3871
3872 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
3873 SIGNALYZER_COMMAND_POWERCONTROL_SET);
3874 if (status != FT_OK) {
3875 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3876 ftd2xx_status_string(status));
3877 return ERROR_JTAG_DEVICE_ERROR;
3878 }
3879
3880 /* set gpio mode register (IO_16 and IO_17 set as analog
3881 * inputs, other is gpio)
3882 */
3883 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3884 (uint32_t)(signalyzer_h_side << 8));
3885 if (status != FT_OK) {
3886 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3887 ftd2xx_status_string(status));
3888 return ERROR_JTAG_DEVICE_ERROR;
3889 }
3890
3891 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060);
3892 if (status != FT_OK) {
3893 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3894 ftd2xx_status_string(status));
3895 return ERROR_JTAG_DEVICE_ERROR;
3896 }
3897
3898 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE);
3899 if (status != FT_OK) {
3900 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3901 ftd2xx_status_string(status));
3902 return ERROR_JTAG_DEVICE_ERROR;
3903 }
3904
3905 /* set gpio register (all inputs, for -P modules,
3906 * PSU will be turned off)
3907 */
3908 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
3909 (uint32_t)(signalyzer_h_side << 8));
3910 if (status != FT_OK) {
3911 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3912 ftd2xx_status_string(status));
3913 return ERROR_JTAG_DEVICE_ERROR;
3914 }
3915
3916 status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000);
3917 if (status != FT_OK) {
3918 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3919 ftd2xx_status_string(status));
3920 return ERROR_JTAG_DEVICE_ERROR;
3921 }
3922
3923 status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_STATE);
3924 if (status != FT_OK) {
3925 LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
3926 ftd2xx_status_string(status));
3927 return ERROR_JTAG_DEVICE_ERROR;
3928 }
3929 #endif
3930 } else if (signalyzer_h_adapter_type == 0x0000) {
3931 LOG_INFO("Signalyzer: No external modules were detected.");
3932
3933 nTRST = 0x10;
3934 nTRSTnOE = 0x10;
3935 nSRST = 0x20;
3936 nSRSTnOE = 0x20;
3937
3938 low_output = 0x08;
3939 low_direction = 0x1b;
3940
3941 high_output = 0x0;
3942 high_direction = 0x0;
3943
3944 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
3945 low_direction &= ~nTRSTnOE; /* nTRST input */
3946 low_output &= ~nTRST; /* nTRST = 0 */
3947 } else {
3948 low_direction |= nTRSTnOE; /* nTRST output */
3949 low_output |= nTRST; /* nTRST = 1 */
3950 }
3951
3952 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
3953 low_direction |= nSRSTnOE; /* nSRST output */
3954 low_output |= nSRST; /* nSRST = 1 */
3955 } else {
3956 low_direction &= ~nSRSTnOE; /* nSRST input */
3957 low_output &= ~nSRST; /* nSRST = 0 */
3958 }
3959 } else {
3960 LOG_ERROR("Unknown module type is detected: %.4x",
3961 signalyzer_h_adapter_type);
3962 return ERROR_JTAG_DEVICE_ERROR;
3963 }
3964
3965 /* initialize low byte of controller for jtag operation */
3966 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
3967 LOG_ERROR("couldn't initialize Signalyzer-H layout");
3968 return ERROR_JTAG_INIT_FAILED;
3969 }
3970
3971 #if BUILD_FT2232_FTD2XX == 1
3972 if (ftdi_device == FT_DEVICE_2232H) {
3973 /* initialize high byte of controller for jtag operation */
3974 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
3975 LOG_ERROR("couldn't initialize Signalyzer-H layout");
3976 return ERROR_JTAG_INIT_FAILED;
3977 }
3978 }
3979 #elif BUILD_FT2232_LIBFTDI == 1
3980 if (ftdi_device == TYPE_2232H) {
3981 /* initialize high byte of controller for jtag operation */
3982 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
3983 LOG_ERROR("couldn't initialize Signalyzer-H layout");
3984 return ERROR_JTAG_INIT_FAILED;
3985 }
3986 }
3987 #endif
3988 return ERROR_OK;
3989 }
3990
3991 static void signalyzer_h_reset(int trst, int srst)
3992 {
3993 enum reset_types jtag_reset_config = jtag_get_reset_config();
3994
3995 /* ADAPTOR: EM_LT16_A */
3996 if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) {
3997 if (trst == 1) {
3998 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
3999 /* switch to output pin (output is low) */
4000 low_direction |= nTRSTnOE;
4001 else
4002 /* switch output low */
4003 low_output &= ~nTRST;
4004 } else if (trst == 0) {
4005 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4006 /* switch to input pin (high-Z + internal
4007 * and external pullup) */
4008 low_direction &= ~nTRSTnOE;
4009 else
4010 /* switch output high */
4011 low_output |= nTRST;
4012 }
4013
4014 if (srst == 1) {
4015 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4016 /* switch output low */
4017 low_output &= ~nSRST;
4018 else
4019 /* switch to output pin (output is low) */
4020 low_direction |= nSRSTnOE;
4021 } else if (srst == 0) {
4022 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4023 /* switch output high */
4024 low_output |= nSRST;
4025 else
4026 /* switch to input pin (high-Z) */
4027 low_direction &= ~nSRSTnOE;
4028 }
4029
4030 /* command "set data bits low byte" */
4031 buffer_write(0x80);
4032 buffer_write(low_output);
4033 buffer_write(low_direction);
4034 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, "
4035 "low_direction: 0x%2.2x",
4036 trst, srst, low_output, low_direction);
4037 }
4038 /* ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */
4039 else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
4040 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
4041 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG) ||
4042 (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) {
4043 if (trst == 1) {
4044 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4045 high_output &= ~nTRSTnOE;
4046 else
4047 high_output &= ~nTRST;
4048 } else if (trst == 0) {
4049 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4050 high_output |= nTRSTnOE;
4051 else
4052 high_output |= nTRST;
4053 }
4054
4055 if (srst == 1) {
4056 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4057 high_output &= ~nSRST;
4058 else
4059 high_output &= ~nSRSTnOE;
4060 } else if (srst == 0) {
4061 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4062 high_output |= nSRST;
4063 else
4064 high_output |= nSRSTnOE;
4065 }
4066
4067 /* command "set data bits high byte" */
4068 buffer_write(0x82);
4069 buffer_write(high_output);
4070 buffer_write(high_direction);
4071 LOG_INFO("trst: %i, srst: %i, high_output: 0x%2.2x, "
4072 "high_direction: 0x%2.2x",
4073 trst, srst, high_output, high_direction);
4074 } else if (signalyzer_h_adapter_type == 0x0000) {
4075 if (trst == 1) {
4076 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4077 /* switch to output pin (output is low) */
4078 low_direction |= nTRSTnOE;
4079 else
4080 /* switch output low */
4081 low_output &= ~nTRST;
4082 } else if (trst == 0) {
4083 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4084 /* switch to input pin (high-Z + internal
4085 * and external pullup) */
4086 low_direction &= ~nTRSTnOE;
4087 else
4088 /* switch output high */
4089 low_output |= nTRST;
4090 }
4091
4092 if (srst == 1) {
4093 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4094 /* switch output low */
4095 low_output &= ~nSRST;
4096 else
4097 /* switch to output pin (output is low) */
4098 low_direction |= nSRSTnOE;
4099 } else if (srst == 0) {
4100 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4101 /* switch output high */
4102 low_output |= nSRST;
4103 else
4104 /* switch to input pin (high-Z) */
4105 low_direction &= ~nSRSTnOE;
4106 }
4107
4108 /* command "set data bits low byte" */
4109 buffer_write(0x80);
4110 buffer_write(low_output);
4111 buffer_write(low_direction);
4112 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, "
4113 "low_direction: 0x%2.2x",
4114 trst, srst, low_output, low_direction);
4115 }
4116 }
4117
4118 static void signalyzer_h_blink(void)
4119 {
4120 signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_RED, 100, 0, 1);
4121 }
4122
4123 /********************************************************************
4124 * Support for KT-LINK
4125 * JTAG adapter from KRISTECH
4126 * http://www.kristech.eu
4127 *******************************************************************/
4128 static int ktlink_init(void)
4129 {
4130 uint8_t swd_en = 0x20; /* 0x20 SWD disable, 0x00 SWD enable (ADBUS5) */
4131
4132 low_output = 0x08 | swd_en; /* value; TMS=1,TCK=0,TDI=0,SWD=swd_en */
4133 low_direction = 0x3B; /* out=1; TCK/TDI/TMS=out,TDO=in,SWD=out,RTCK=in,SRSTIN=in */
4134
4135 /* initialize low byte for jtag */
4136 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
4137 LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
4138 return ERROR_JTAG_INIT_FAILED;
4139 }
4140
4141 nTRST = 0x01;
4142 nSRST = 0x02;
4143 nTRSTnOE = 0x04;
4144 nSRSTnOE = 0x08;
4145
4146 high_output = 0x80; /* turn LED on */
4147 high_direction = 0xFF; /* all outputs */
4148
4149 enum reset_types jtag_reset_config = jtag_get_reset_config();
4150
4151 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
4152 high_output |= nTRSTnOE;
4153 high_output &= ~nTRST;
4154 } else {
4155 high_output &= ~nTRSTnOE;
4156 high_output |= nTRST;
4157 }
4158
4159 if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
4160 high_output &= ~nSRSTnOE;
4161 high_output |= nSRST;
4162 } else {
4163 high_output |= nSRSTnOE;
4164 high_output &= ~nSRST;
4165 }
4166
4167 /* initialize high byte for jtag */
4168 if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
4169 LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
4170 return ERROR_JTAG_INIT_FAILED;
4171 }
4172
4173 return ERROR_OK;
4174 }
4175
4176 static void ktlink_reset(int trst, int srst)
4177 {
4178 enum reset_types jtag_reset_config = jtag_get_reset_config();
4179
4180 if (trst == 1) {
4181 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4182 high_output &= ~nTRSTnOE;
4183 else
4184 high_output &= ~nTRST;
4185 } else if (trst == 0) {
4186 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
4187 high_output |= nTRSTnOE;
4188 else
4189 high_output |= nTRST;
4190 }
4191
4192 if (srst == 1) {
4193 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4194 high_output &= ~nSRST;
4195 else
4196 high_output &= ~nSRSTnOE;
4197 } else if (srst == 0) {
4198 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
4199 high_output |= nSRST;
4200 else
4201 high_output |= nSRSTnOE;
4202 }
4203
4204 buffer_write(0x82); /* command "set data bits high byte" */
4205 buffer_write(high_output);
4206 buffer_write(high_direction);
4207 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
4208 trst,
4209 srst,
4210 high_output,
4211 high_direction);
4212 }
4213
4214 static void ktlink_blink(void)
4215 {
4216 /* LED connected to ACBUS7 */
4217 high_output ^= 0x80;
4218
4219 buffer_write(0x82); /* command "set data bits high byte" */
4220 buffer_write(high_output);
4221 buffer_write(high_direction);
4222 }
4223
4224 /********************************************************************
4225 * Support for Digilent HS-1
4226 * JTAG adapter from Digilent
4227 * http://www.digilent.com
4228 * Author: Stephane Bonnet bonnetst@hds.utc.fr
4229 *******************************************************************/
4230
4231 static int digilent_hs1_init(void)
4232 {
4233 /* the adapter only supports the base JTAG signals, no nTRST
4234 nor nSRST */
4235 low_output = 0x88;
4236 low_direction = 0x8b;
4237
4238 /* initialize low byte for jtag */
4239 if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
4240 LOG_ERROR("couldn't initialize FT2232 with 'digilent_hs1' layout");
4241 return ERROR_JTAG_INIT_FAILED;
4242 }
4243 return ERROR_OK;
4244 }
4245
4246 static void digilent_hs1_reset(int trst, int srst)
4247 {
4248 /* Dummy function, no reset signals supported. */
4249 }
4250
4251 static const struct command_registration ft2232_command_handlers[] = {
4252 {
4253 .name = "ft2232_device_desc",
4254 .handler = &ft2232_handle_device_desc_command,
4255 .mode = COMMAND_CONFIG,
4256 .help = "set the USB device description of the FTDI FT2232 device",
4257 .usage = "description_string",
4258 },
4259 {
4260 .name = "ft2232_serial",
4261 .handler = &ft2232_handle_serial_command,
4262 .mode = COMMAND_CONFIG,
4263 .help = "set the serial number of the FTDI FT2232 device",
4264 .usage = "serial_string",
4265 },
4266 {
4267 .name = "ft2232_layout",
4268 .handler = &ft2232_handle_layout_command,
4269 .mode = COMMAND_CONFIG,
4270 .help = "set the layout of the FT2232 GPIO signals used "
4271 "to control output-enables and reset signals",
4272 .usage = "layout_name",
4273 },
4274 {
4275 .name = "ft2232_vid_pid",
4276 .handler = &ft2232_handle_vid_pid_command,
4277 .mode = COMMAND_CONFIG,
4278 .help = "the vendor ID and product ID of the FTDI FT2232 device",
4279 .usage = "(vid pid)* ",
4280 },
4281 {
4282 .name = "ft2232_latency",
4283 .handler = &ft2232_handle_latency_command,
4284 .mode = COMMAND_CONFIG,
4285 .help = "set the FT2232 latency timer to a new value",
4286 .usage = "value",
4287 },
4288 {
4289 .name = "ft2232_channel",
4290 .handler = &ft2232_handle_channel_command,
4291 .mode = COMMAND_CONFIG,
4292 .help = "set the FT2232 channel to a new value",
4293 .usage = "value",
4294 },
4295 COMMAND_REGISTRATION_DONE
4296 };
4297
4298 struct jtag_interface ft2232_interface = {
4299 .name = "ft2232",
4300 .supported = DEBUG_CAP_TMS_SEQ,
4301 .commands = ft2232_command_handlers,
4302 .transports = jtag_only,
4303
4304 .init = ft2232_init,
4305 .quit = ft2232_quit,
4306 .speed = ft2232_speed,
4307 .speed_div = ft2232_speed_div,
4308 .khz = ft2232_khz,
4309 .execute_queue = ft2232_execute_queue,
4310 };

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)