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

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)