- remove enable-ft2232-highspeed configure option, high speed ftdi support is now...
[openocd.git] / src / jtag / ft2232.c
1 /***************************************************************************
2 * Copyright (C) 2004, 2006 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
7 * *
8 * Copyright (C) 2009 by SoftPLC Corporation. http://softplc.com *
9 * Dick Hollenbeck <dick@softplc.com> *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
26
27 /* This code uses information contained in the MPSSE specification which was
28 * found here:
29 * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
30 * Hereafter this is called the "MPSSE Spec".
31 *
32 * The datasheet for the ftdichip.com's FT2232D part is here:
33 * http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
34 */
35
36 #ifdef HAVE_CONFIG_H
37 #include "config.h"
38 #endif
39
40 /* project specific includes */
41 #include "interface.h"
42 #include "commands.h"
43 #include "time_support.h"
44
45 #if IS_CYGWIN == 1
46 #include <windows.h>
47 #endif
48
49 #include <assert.h>
50
51 #if (BUILD_FT2232_FTD2XX == 1 && BUILD_FT2232_LIBFTDI == 1)
52 #error "BUILD_FT2232_FTD2XX && BUILD_FT2232_LIBFTDI are mutually exclusive"
53 #elif (BUILD_FT2232_FTD2XX != 1 && BUILD_FT2232_LIBFTDI != 1)
54 #error "BUILD_FT2232_FTD2XX || BUILD_FT2232_LIBFTDI must be chosen"
55 #endif
56
57 /* FT2232 access library includes */
58 #if BUILD_FT2232_FTD2XX == 1
59 #include <ftd2xx.h>
60 #elif BUILD_FT2232_LIBFTDI == 1
61 #include <ftdi.h>
62 #endif
63
64 /* max TCK for the high speed devices 30000 kHz */
65 #define FTDI_2232H_4232H_MAX_TCK 30000
66 /* max TCK for the full speed devices 6000 kHz */
67 #define FTDI_2232C_MAX_TCK 6000
68 /* this speed value tells that RTCK is requested */
69 #define RTCK_SPEED -1
70
71 #ifndef BUILD_FT2232_HIGHSPEED
72 #if BUILD_FT2232_FTD2XX == 1
73 enum { FT_DEVICE_2232H = 6, FT_DEVICE_4232H };
74 #elif BUILD_FT2232_LIBFTDI == 1
75 enum { TYPE_2232H = 4, TYPE_4232H = 5 };
76 #endif
77 #endif
78
79 static int ft2232_execute_queue(void);
80 static int ft2232_speed(int speed);
81 static int ft2232_speed_div(int speed, int* khz);
82 static int ft2232_khz(int khz, int* jtag_speed);
83 static int ft2232_register_commands(struct command_context_s* cmd_ctx);
84 static int ft2232_init(void);
85 static int ft2232_quit(void);
86
87 static int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
88 static int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
89 static int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
90 static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
91 static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
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, jtag_command_t* 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 typedef struct ft2232_layout_s
118 {
119 char* name;
120 int (*init)(void);
121 void (*reset)(int trst, int srst);
122 void (*blink)(void);
123 } ft2232_layout_t;
124
125 /* init procedures for supported layouts */
126 static int usbjtag_init(void);
127 static int jtagkey_init(void);
128 static int olimex_jtag_init(void);
129 static int flyswatter_init(void);
130 static int turtle_init(void);
131 static int comstick_init(void);
132 static int stm32stick_init(void);
133 static int axm0432_jtag_init(void);
134 static int sheevaplug_init(void);
135 static int icebear_jtag_init(void);
136 static int cortino_jtag_init(void);
137
138 /* reset procedures for supported layouts */
139 static void usbjtag_reset(int trst, int srst);
140 static void jtagkey_reset(int trst, int srst);
141 static void olimex_jtag_reset(int trst, int srst);
142 static void flyswatter_reset(int trst, int srst);
143 static void turtle_reset(int trst, int srst);
144 static void comstick_reset(int trst, int srst);
145 static void stm32stick_reset(int trst, int srst);
146 static void axm0432_jtag_reset(int trst, int srst);
147 static void sheevaplug_reset(int trst, int srst);
148 static void icebear_jtag_reset(int trst, int srst);
149
150 /* blink procedures for layouts that support a blinking led */
151 static void olimex_jtag_blink(void);
152 static void flyswatter_jtag_blink(void);
153 static void turtle_jtag_blink(void);
154
155 static const ft2232_layout_t ft2232_layouts[] =
156 {
157 { "usbjtag", usbjtag_init, usbjtag_reset, NULL },
158 { "jtagkey", jtagkey_init, jtagkey_reset, NULL },
159 { "jtagkey_prototype_v1", jtagkey_init, jtagkey_reset, NULL },
160 { "oocdlink", jtagkey_init, jtagkey_reset, NULL },
161 { "signalyzer", usbjtag_init, usbjtag_reset, NULL },
162 { "evb_lm3s811", usbjtag_init, usbjtag_reset, NULL },
163 { "luminary_icdi", usbjtag_init, usbjtag_reset, NULL },
164 { "olimex-jtag", olimex_jtag_init, olimex_jtag_reset, olimex_jtag_blink },
165 { "flyswatter", flyswatter_init, flyswatter_reset, flyswatter_jtag_blink },
166 { "turtelizer2", turtle_init, turtle_reset, turtle_jtag_blink },
167 { "comstick", comstick_init, comstick_reset, NULL },
168 { "stm32stick", stm32stick_init, stm32stick_reset, NULL },
169 { "axm0432_jtag", axm0432_jtag_init, axm0432_jtag_reset, NULL },
170 { "sheevaplug", sheevaplug_init, sheevaplug_reset, NULL },
171 { "icebear", icebear_jtag_init, icebear_jtag_reset, NULL },
172 { "cortino", cortino_jtag_init, comstick_reset, NULL },
173 { NULL, NULL, NULL, NULL },
174 };
175
176 static uint8_t nTRST, nTRSTnOE, nSRST, nSRSTnOE;
177
178 static const ft2232_layout_t *layout;
179 static uint8_t low_output = 0x0;
180 static uint8_t low_direction = 0x0;
181 static uint8_t high_output = 0x0;
182 static uint8_t high_direction = 0x0;
183
184 #if BUILD_FT2232_FTD2XX == 1
185 static FT_HANDLE ftdih = NULL;
186 static FT_DEVICE ftdi_device = 0;
187 #elif BUILD_FT2232_LIBFTDI == 1
188 static struct ftdi_context ftdic;
189 static enum ftdi_chip_type ftdi_device;
190 #endif
191
192 static jtag_command_t* first_unsent; /* next command that has to be sent */
193 static int require_send;
194
195 /* http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
196
197 "There is a significant difference between libftdi and libftd2xx. The latter
198 one allows to schedule up to 64*64 bytes of result data while libftdi fails
199 with more than 4*64. As a consequence, the FT2232 driver is forced to
200 perform around 16x more USB transactions for long command streams with TDO
201 capture when running with libftdi."
202
203 No idea how we get
204 #define FT2232_BUFFER_SIZE 131072
205 a comment would have been nice.
206 */
207
208 #define FT2232_BUFFER_SIZE 131072
209
210 static uint8_t* ft2232_buffer = NULL;
211 static int ft2232_buffer_size = 0;
212 static int ft2232_read_pointer = 0;
213 static int ft2232_expect_read = 0;
214
215 /**
216 * Function buffer_write
217 * writes a byte into the byte buffer, "ft2232_buffer", which must be sent later.
218 * @param val is the byte to send.
219 */
220 static inline void buffer_write(uint8_t val)
221 {
222 assert(ft2232_buffer);
223 assert((unsigned) ft2232_buffer_size < (unsigned) FT2232_BUFFER_SIZE);
224 ft2232_buffer[ft2232_buffer_size++] = val;
225 }
226
227 /**
228 * Function buffer_read
229 * returns a byte from the byte buffer.
230 */
231 static inline uint8_t buffer_read(void)
232 {
233 assert(ft2232_buffer);
234 assert(ft2232_read_pointer < ft2232_buffer_size);
235 return ft2232_buffer[ft2232_read_pointer++];
236 }
237
238 /**
239 * Clocks out \a bit_count bits on the TMS line, starting with the least
240 * significant bit of tms_bits and progressing to more significant bits.
241 * Rigorous state transition logging is done here via tap_set_state().
242 *
243 * @param mpsse_cmd One of the MPSSE TMS oriented commands such as
244 * 0x4b or 0x6b. See the MPSSE spec referenced above for their
245 * functionality. The MPSSE command "Clock Data to TMS/CS Pin (no Read)"
246 * is often used for this, 0x4b.
247 *
248 * @param tms_bits Holds the sequence of bits to send.
249 * @param tms_count Tells how many bits in the sequence.
250 * @param tdi_bit A single bit to pass on to TDI before the first TCK
251 * cycle and held static for the duration of TMS clocking.
252 *
253 * See the MPSSE spec referenced above.
254 */
255 static void clock_tms(uint8_t mpsse_cmd, int tms_bits, int tms_count, bool tdi_bit)
256 {
257 uint8_t tms_byte;
258 int i;
259 int tms_ndx; /* bit index into tms_byte */
260
261 assert(tms_count > 0);
262
263 #if 0
264 LOG_DEBUG("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d", mpsse_cmd, tms_bits, tms_count);
265 #endif
266
267 for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits>>=1)
268 {
269 bool bit = tms_bits & 1;
270
271 if (bit)
272 tms_byte |= (1 << tms_ndx);
273
274 /* always do state transitions in public view */
275 tap_set_state(tap_state_transition(tap_get_state(), bit));
276
277 /* we wrote a bit to tms_byte just above, increment bit index. if bit was zero
278 also increment.
279 */
280 ++tms_ndx;
281
282 if (tms_ndx == 7 || i == tms_count-1)
283 {
284 buffer_write(mpsse_cmd);
285 buffer_write(tms_ndx - 1);
286
287 /* Bit 7 of the byte is passed on to TDI/DO before the first TCK/SK of
288 TMS/CS and is held static for the duration of TMS/CS clocking.
289 */
290 buffer_write(tms_byte | (tdi_bit << 7));
291 }
292 }
293 }
294
295 /**
296 * Function get_tms_buffer_requirements
297 * returns what clock_tms() will consume if called with
298 * same \a bit_count.
299 */
300 static inline int get_tms_buffer_requirements(int bit_count)
301 {
302 return ((bit_count + 6)/7) * 3;
303 }
304
305 /**
306 * Function move_to_state
307 * moves the TAP controller from the current state to a
308 * \a goal_state through a path given by tap_get_tms_path(). State transition
309 * logging is performed by delegation to clock_tms().
310 *
311 * @param goal_state is the destination state for the move.
312 */
313 static void move_to_state(tap_state_t goal_state)
314 {
315 tap_state_t start_state = tap_get_state();
316
317 /* goal_state is 1/2 of a tuple/pair of states which allow convenient
318 lookup of the required TMS pattern to move to this state from the
319 start state.
320 */
321
322 /* do the 2 lookups */
323 int tms_bits = tap_get_tms_path(start_state, goal_state);
324 int tms_count = tap_get_tms_path_len(start_state, goal_state);
325
326 DEBUG_JTAG_IO("start=%s goal=%s", tap_state_name(start_state), tap_state_name(goal_state));
327
328 clock_tms(0x4b, tms_bits, tms_count, 0);
329 }
330
331 jtag_interface_t ft2232_interface =
332 {
333 .name = "ft2232",
334 .execute_queue = ft2232_execute_queue,
335 .speed = ft2232_speed,
336 .speed_div = ft2232_speed_div,
337 .khz = ft2232_khz,
338 .register_commands = ft2232_register_commands,
339 .init = ft2232_init,
340 .quit = ft2232_quit,
341 };
342
343 static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written)
344 {
345 #if BUILD_FT2232_FTD2XX == 1
346 FT_STATUS status;
347 DWORD dw_bytes_written;
348 if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
349 {
350 *bytes_written = dw_bytes_written;
351 LOG_ERROR("FT_Write returned: %lu", status);
352 return ERROR_JTAG_DEVICE_ERROR;
353 }
354 else
355 {
356 *bytes_written = dw_bytes_written;
357 return ERROR_OK;
358 }
359 #elif BUILD_FT2232_LIBFTDI == 1
360 int retval;
361 if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0)
362 {
363 *bytes_written = 0;
364 LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
365 return ERROR_JTAG_DEVICE_ERROR;
366 }
367 else
368 {
369 *bytes_written = retval;
370 return ERROR_OK;
371 }
372 #endif
373 }
374
375 static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
376 {
377 #if BUILD_FT2232_FTD2XX == 1
378 DWORD dw_bytes_read;
379 FT_STATUS status;
380 int timeout = 5;
381 *bytes_read = 0;
382
383 while ((*bytes_read < size) && timeout--)
384 {
385 if ((status = FT_Read(ftdih, buf + *bytes_read, size -
386 *bytes_read, &dw_bytes_read)) != FT_OK)
387 {
388 *bytes_read = 0;
389 LOG_ERROR("FT_Read returned: %lu", status);
390 return ERROR_JTAG_DEVICE_ERROR;
391 }
392 *bytes_read += dw_bytes_read;
393 }
394
395 #elif BUILD_FT2232_LIBFTDI == 1
396 int retval;
397 int timeout = 100;
398 *bytes_read = 0;
399
400 while ((*bytes_read < size) && timeout--)
401 {
402 if ((retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read)) < 0)
403 {
404 *bytes_read = 0;
405 LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic));
406 return ERROR_JTAG_DEVICE_ERROR;
407 }
408 *bytes_read += retval;
409 }
410
411 #endif
412
413 if (*bytes_read < size)
414 {
415 LOG_ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)",
416 (unsigned int)(*bytes_read),
417 (unsigned int)size);
418 return ERROR_JTAG_DEVICE_ERROR;
419 }
420
421 return ERROR_OK;
422 }
423
424 static bool ft2232_device_is_highspeed(void)
425 {
426 #if BUILD_FT2232_FTD2XX == 1
427 return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H);
428 #elif BUILD_FT2232_LIBFTDI == 1
429 return (ftdi_device == TYPE_2232H || ftdi_device == TYPE_4232H);
430 #endif
431 }
432
433 /*
434 * Commands that only apply to the FT2232H and FT4232H devices.
435 * See chapter 6 in http://www.ftdichip.com/Documents/AppNotes/
436 * AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf
437 */
438
439 static int ft2232h_ft4232h_adaptive_clocking(bool enable)
440 {
441 uint8_t buf = enable ? 0x96 : 0x97;
442 LOG_DEBUG("%2.2x", buf);
443
444 uint32_t bytes_written;
445 int retval = ft2232_write(&buf, 1, &bytes_written);
446 if ((ERROR_OK != retval) || (bytes_written != 1))
447 {
448 LOG_ERROR("couldn't write command to %s adaptive clocking"
449 , enable ? "enable" : "disable");
450 return retval;
451 }
452
453 return ERROR_OK;
454 }
455
456 /**
457 * Enable/disable the clk divide by 5 of the 60MHz master clock.
458 * This result in a JTAG clock speed range of 91.553Hz-6MHz
459 * respective 457.763Hz-30MHz.
460 */
461 static int ft2232h_ft4232h_clk_divide_by_5(bool enable)
462 {
463 uint32_t bytes_written;
464 uint8_t buf = enable ? 0x8b : 0x8a;
465 int retval = ft2232_write(&buf, 1, &bytes_written);
466 if ((ERROR_OK != retval) || (bytes_written != 1))
467 {
468 LOG_ERROR("couldn't write command to %s clk divide by 5"
469 , enable ? "enable" : "disable");
470 return ERROR_JTAG_INIT_FAILED;
471 }
472 ft2232_max_tck = enable ? FTDI_2232C_MAX_TCK : FTDI_2232H_4232H_MAX_TCK;
473 LOG_INFO("max TCK change to: %u kHz", ft2232_max_tck);
474
475 return ERROR_OK;
476 }
477
478 static int ft2232_speed(int speed)
479 {
480 uint8_t buf[3];
481 int retval;
482 uint32_t bytes_written;
483
484 retval = ERROR_OK;
485 bool enable_adaptive_clocking = (RTCK_SPEED == speed);
486 if (ft2232_device_is_highspeed())
487 retval = ft2232h_ft4232h_adaptive_clocking(enable_adaptive_clocking);
488 else if (enable_adaptive_clocking)
489 {
490 LOG_ERROR("ft2232 device %lu does not support RTCK"
491 , (long unsigned int)ftdi_device);
492 return ERROR_FAIL;
493 }
494
495 if ((enable_adaptive_clocking) || (ERROR_OK != retval))
496 return retval;
497
498 buf[0] = 0x86; /* command "set divisor" */
499 buf[1] = speed & 0xff; /* valueL (0 = 6MHz, 1 = 3MHz, 2 = 2.0MHz, ...*/
500 buf[2] = (speed >> 8) & 0xff; /* valueH */
501
502 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
503 if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
504 {
505 LOG_ERROR("couldn't set FT2232 TCK speed");
506 return retval;
507 }
508
509 return ERROR_OK;
510 }
511
512 static int ft2232_speed_div(int speed, int* khz)
513 {
514 /* Take a look in the FT2232 manual,
515 * AN2232C-01 Command Processor for
516 * MPSSE and MCU Host Bus. Chapter 3.8 */
517
518 *khz = (RTCK_SPEED == speed) ? 0 : ft2232_max_tck / (1 + speed);
519
520 return ERROR_OK;
521 }
522
523 static int ft2232_khz(int khz, int* jtag_speed)
524 {
525 if (khz == 0)
526 {
527 if (ft2232_device_is_highspeed())
528 {
529 *jtag_speed = RTCK_SPEED;
530 return ERROR_OK;
531 }
532 else
533 {
534 LOG_DEBUG("RCLK not supported");
535 return ERROR_FAIL;
536 }
537 }
538
539 /* Take a look in the FT2232 manual,
540 * AN2232C-01 Command Processor for
541 * MPSSE and MCU Host Bus. Chapter 3.8
542 *
543 * We will calc here with a multiplier
544 * of 10 for better rounding later. */
545
546 /* Calc speed, (ft2232_max_tck / khz) - 1 */
547 /* Use 65000 for better rounding */
548 *jtag_speed = ((ft2232_max_tck*10) / khz) - 10;
549
550 /* Add 0.9 for rounding */
551 *jtag_speed += 9;
552
553 /* Calc real speed */
554 *jtag_speed = *jtag_speed / 10;
555
556 /* Check if speed is greater than 0 */
557 if (*jtag_speed < 0)
558 {
559 *jtag_speed = 0;
560 }
561
562 /* Check max value */
563 if (*jtag_speed > 0xFFFF)
564 {
565 *jtag_speed = 0xFFFF;
566 }
567
568 return ERROR_OK;
569 }
570
571 static int ft2232_register_commands(struct command_context_s* cmd_ctx)
572 {
573 register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command,
574 COMMAND_CONFIG, "the USB device description of the FTDI FT2232 device");
575 register_command(cmd_ctx, NULL, "ft2232_serial", ft2232_handle_serial_command,
576 COMMAND_CONFIG, "the serial number of the FTDI FT2232 device");
577 register_command(cmd_ctx, NULL, "ft2232_layout", ft2232_handle_layout_command,
578 COMMAND_CONFIG, "the layout of the FT2232 GPIO signals used to control output-enables and reset signals");
579 register_command(cmd_ctx, NULL, "ft2232_vid_pid", ft2232_handle_vid_pid_command,
580 COMMAND_CONFIG, "the vendor ID and product ID of the FTDI FT2232 device");
581 register_command(cmd_ctx, NULL, "ft2232_latency", ft2232_handle_latency_command,
582 COMMAND_CONFIG, "set the FT2232 latency timer to a new value");
583 return ERROR_OK;
584 }
585
586 static void ft2232_end_state(tap_state_t state)
587 {
588 if (tap_is_state_stable(state))
589 tap_set_end_state(state);
590 else
591 {
592 LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state));
593 exit(-1);
594 }
595 }
596
597 static void ft2232_read_scan(enum scan_type type, uint8_t* buffer, int scan_size)
598 {
599 int num_bytes = (scan_size + 7) / 8;
600 int bits_left = scan_size;
601 int cur_byte = 0;
602
603 while (num_bytes-- > 1)
604 {
605 buffer[cur_byte++] = buffer_read();
606 bits_left -= 8;
607 }
608
609 buffer[cur_byte] = 0x0;
610
611 /* There is one more partial byte left from the clock data in/out instructions */
612 if (bits_left > 1)
613 {
614 buffer[cur_byte] = buffer_read() >> 1;
615 }
616 /* 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 */
617 buffer[cur_byte] = (buffer[cur_byte] | (((buffer_read()) << 1) & 0x80)) >> (8 - bits_left);
618 }
619
620 static void ft2232_debug_dump_buffer(void)
621 {
622 int i;
623 char line[256];
624 char* line_p = line;
625
626 for (i = 0; i < ft2232_buffer_size; i++)
627 {
628 line_p += snprintf(line_p, 256 - (line_p - line), "%2.2x ", ft2232_buffer[i]);
629 if (i % 16 == 15)
630 {
631 LOG_DEBUG("%s", line);
632 line_p = line;
633 }
634 }
635
636 if (line_p != line)
637 LOG_DEBUG("%s", line);
638 }
639
640 static int ft2232_send_and_recv(jtag_command_t* first, jtag_command_t* last)
641 {
642 jtag_command_t* cmd;
643 uint8_t* buffer;
644 int scan_size;
645 enum scan_type type;
646 int retval;
647 uint32_t bytes_written = 0;
648 uint32_t bytes_read = 0;
649
650 #ifdef _DEBUG_USB_IO_
651 struct timeval start, inter, inter2, end;
652 struct timeval d_inter, d_inter2, d_end;
653 #endif
654
655 #ifdef _DEBUG_USB_COMMS_
656 LOG_DEBUG("write buffer (size %i):", ft2232_buffer_size);
657 ft2232_debug_dump_buffer();
658 #endif
659
660 #ifdef _DEBUG_USB_IO_
661 gettimeofday(&start, NULL);
662 #endif
663
664 if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
665 {
666 LOG_ERROR("couldn't write MPSSE commands to FT2232");
667 return retval;
668 }
669
670 #ifdef _DEBUG_USB_IO_
671 gettimeofday(&inter, NULL);
672 #endif
673
674 if (ft2232_expect_read)
675 {
676 int timeout = 100;
677 ft2232_buffer_size = 0;
678
679 #ifdef _DEBUG_USB_IO_
680 gettimeofday(&inter2, NULL);
681 #endif
682
683 if ((retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read)) != ERROR_OK)
684 {
685 LOG_ERROR("couldn't read from FT2232");
686 return retval;
687 }
688
689 #ifdef _DEBUG_USB_IO_
690 gettimeofday(&end, NULL);
691
692 timeval_subtract(&d_inter, &inter, &start);
693 timeval_subtract(&d_inter2, &inter2, &start);
694 timeval_subtract(&d_end, &end, &start);
695
696 LOG_INFO("inter: %u.%06u, inter2: %u.%06u end: %u.%06u",
697 (unsigned)d_inter.tv_sec, (unsigned)d_inter.tv_usec,
698 (unsigned)d_inter2.tv_sec, (unsigned)d_inter2.tv_usec,
699 (unsigned)d_end.tv_sec, (unsigned)d_end.tv_usec);
700 #endif
701
702 ft2232_buffer_size = bytes_read;
703
704 if (ft2232_expect_read != ft2232_buffer_size)
705 {
706 LOG_ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read,
707 ft2232_buffer_size,
708 100 - timeout);
709 ft2232_debug_dump_buffer();
710
711 exit(-1);
712 }
713
714 #ifdef _DEBUG_USB_COMMS_
715 LOG_DEBUG("read buffer (%i retries): %i bytes", 100 - timeout, ft2232_buffer_size);
716 ft2232_debug_dump_buffer();
717 #endif
718 }
719
720 ft2232_expect_read = 0;
721 ft2232_read_pointer = 0;
722
723 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
724 * that wasn't handled by a caller-provided error handler
725 */
726 retval = ERROR_OK;
727
728 cmd = first;
729 while (cmd != last)
730 {
731 switch (cmd->type)
732 {
733 case JTAG_SCAN:
734 type = jtag_scan_type(cmd->cmd.scan);
735 if (type != SCAN_OUT)
736 {
737 scan_size = jtag_scan_size(cmd->cmd.scan);
738 buffer = calloc(CEIL(scan_size, 8), 1);
739 ft2232_read_scan(type, buffer, scan_size);
740 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
741 retval = ERROR_JTAG_QUEUE_FAILED;
742 free(buffer);
743 }
744 break;
745
746 default:
747 break;
748 }
749
750 cmd = cmd->next;
751 }
752
753 ft2232_buffer_size = 0;
754
755 return retval;
756 }
757
758 /**
759 * Function ft2232_add_pathmove
760 * moves the TAP controller from the current state to a new state through the
761 * given path, where path is an array of tap_state_t's.
762 *
763 * @param path is an array of tap_stat_t which gives the states to traverse through
764 * ending with the last state at path[num_states-1]
765 * @param num_states is the count of state steps to move through
766 */
767 static void ft2232_add_pathmove(tap_state_t* path, int num_states)
768 {
769 int tms_bits = 0;
770 int state_ndx;
771 tap_state_t walker = tap_get_state();
772
773 assert((unsigned) num_states <= 32u); /* tms_bits only holds 32 bits */
774
775 /* this loop verifies that the path is legal and logs each state in the path */
776 for (state_ndx = 0; state_ndx < num_states; ++state_ndx)
777 {
778 tap_state_t desired_next_state = path[state_ndx];
779
780 if (tap_state_transition(walker, false) == desired_next_state)
781 ; /* bit within tms_bits at index state_ndx is already zero */
782 else if (tap_state_transition(walker, true) == desired_next_state)
783 tms_bits |= (1 << state_ndx);
784 else
785 {
786 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
787 tap_state_name(walker), tap_state_name(desired_next_state));
788 exit(-1);
789 }
790
791 walker = desired_next_state;
792 }
793
794 clock_tms(0x4b, tms_bits, num_states, 0);
795
796 tap_set_end_state(tap_get_state());
797 }
798
799 static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer, int scan_size)
800 {
801 int num_bytes = (scan_size + 7) / 8;
802 int bits_left = scan_size;
803 int cur_byte = 0;
804 int last_bit;
805
806 if (!ir_scan)
807 {
808 if (tap_get_state() != TAP_DRSHIFT)
809 {
810 move_to_state(TAP_DRSHIFT);
811 }
812 }
813 else
814 {
815 if (tap_get_state() != TAP_IRSHIFT)
816 {
817 move_to_state(TAP_IRSHIFT);
818 }
819 }
820
821 /* add command for complete bytes */
822 while (num_bytes > 1)
823 {
824 int thisrun_bytes;
825 if (type == SCAN_IO)
826 {
827 /* Clock Data Bytes In and Out LSB First */
828 buffer_write(0x39);
829 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
830 }
831 else if (type == SCAN_OUT)
832 {
833 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
834 buffer_write(0x19);
835 /* LOG_DEBUG("added TDI bytes (o)"); */
836 }
837 else if (type == SCAN_IN)
838 {
839 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
840 buffer_write(0x28);
841 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
842 }
843
844 thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
845 num_bytes -= thisrun_bytes;
846
847 buffer_write((uint8_t) (thisrun_bytes - 1));
848 buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
849
850 if (type != SCAN_IN)
851 {
852 /* add complete bytes */
853 while (thisrun_bytes-- > 0)
854 {
855 buffer_write(buffer[cur_byte++]);
856 bits_left -= 8;
857 }
858 }
859 else /* (type == SCAN_IN) */
860 {
861 bits_left -= 8 * (thisrun_bytes);
862 }
863 }
864
865 /* the most signifcant bit is scanned during TAP movement */
866 if (type != SCAN_IN)
867 last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
868 else
869 last_bit = 0;
870
871 /* process remaining bits but the last one */
872 if (bits_left > 1)
873 {
874 if (type == SCAN_IO)
875 {
876 /* Clock Data Bits In and Out LSB First */
877 buffer_write(0x3b);
878 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
879 }
880 else if (type == SCAN_OUT)
881 {
882 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
883 buffer_write(0x1b);
884 /* LOG_DEBUG("added TDI bits (o)"); */
885 }
886 else if (type == SCAN_IN)
887 {
888 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
889 buffer_write(0x2a);
890 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
891 }
892
893 buffer_write(bits_left - 2);
894 if (type != SCAN_IN)
895 buffer_write(buffer[cur_byte]);
896 }
897
898 if ((ir_scan && (tap_get_end_state() == TAP_IRSHIFT))
899 || (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT)))
900 {
901 if (type == SCAN_IO)
902 {
903 /* Clock Data Bits In and Out LSB First */
904 buffer_write(0x3b);
905 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
906 }
907 else if (type == SCAN_OUT)
908 {
909 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
910 buffer_write(0x1b);
911 /* LOG_DEBUG("added TDI bits (o)"); */
912 }
913 else if (type == SCAN_IN)
914 {
915 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
916 buffer_write(0x2a);
917 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
918 }
919 buffer_write(0x0);
920 buffer_write(last_bit);
921 }
922 else
923 {
924 int tms_bits;
925 int tms_count;
926 uint8_t mpsse_cmd;
927
928 /* move from Shift-IR/DR to end state */
929 if (type != SCAN_OUT)
930 {
931 /* We always go to the PAUSE state in two step at the end of an IN or IO scan */
932 /* This must be coordinated with the bit shifts in ft2232_read_scan */
933 tms_bits = 0x01;
934 tms_count = 2;
935 /* Clock Data to TMS/CS Pin with Read */
936 mpsse_cmd = 0x6b;
937 /* LOG_DEBUG("added TMS scan (read)"); */
938 }
939 else
940 {
941 tms_bits = tap_get_tms_path(tap_get_state(), tap_get_end_state());
942 tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
943 /* Clock Data to TMS/CS Pin (no Read) */
944 mpsse_cmd = 0x4b;
945 /* LOG_DEBUG("added TMS scan (no read)"); */
946 }
947
948 clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
949 }
950
951 if (tap_get_state() != tap_get_end_state())
952 {
953 move_to_state(tap_get_end_state());
954 }
955 }
956
957 static int ft2232_large_scan(scan_command_t* cmd, enum scan_type type, uint8_t* buffer, int scan_size)
958 {
959 int num_bytes = (scan_size + 7) / 8;
960 int bits_left = scan_size;
961 int cur_byte = 0;
962 int last_bit;
963 uint8_t* receive_buffer = malloc(CEIL(scan_size, 8));
964 uint8_t* receive_pointer = receive_buffer;
965 uint32_t bytes_written;
966 uint32_t bytes_read;
967 int retval;
968 int thisrun_read = 0;
969
970 if (cmd->ir_scan)
971 {
972 LOG_ERROR("BUG: large IR scans are not supported");
973 exit(-1);
974 }
975
976 if (tap_get_state() != TAP_DRSHIFT)
977 {
978 move_to_state(TAP_DRSHIFT);
979 }
980
981 if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
982 {
983 LOG_ERROR("couldn't write MPSSE commands to FT2232");
984 exit(-1);
985 }
986 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
987 ft2232_buffer_size, (int)bytes_written);
988 ft2232_buffer_size = 0;
989
990 /* add command for complete bytes */
991 while (num_bytes > 1)
992 {
993 int thisrun_bytes;
994
995 if (type == SCAN_IO)
996 {
997 /* Clock Data Bytes In and Out LSB First */
998 buffer_write(0x39);
999 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
1000 }
1001 else if (type == SCAN_OUT)
1002 {
1003 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
1004 buffer_write(0x19);
1005 /* LOG_DEBUG("added TDI bytes (o)"); */
1006 }
1007 else if (type == SCAN_IN)
1008 {
1009 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
1010 buffer_write(0x28);
1011 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
1012 }
1013
1014 thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
1015 thisrun_read = thisrun_bytes;
1016 num_bytes -= thisrun_bytes;
1017 buffer_write((uint8_t) (thisrun_bytes - 1));
1018 buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
1019
1020 if (type != SCAN_IN)
1021 {
1022 /* add complete bytes */
1023 while (thisrun_bytes-- > 0)
1024 {
1025 buffer_write(buffer[cur_byte]);
1026 cur_byte++;
1027 bits_left -= 8;
1028 }
1029 }
1030 else /* (type == SCAN_IN) */
1031 {
1032 bits_left -= 8 * (thisrun_bytes);
1033 }
1034
1035 if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
1036 {
1037 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1038 exit(-1);
1039 }
1040 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1041 ft2232_buffer_size,
1042 (int)bytes_written);
1043 ft2232_buffer_size = 0;
1044
1045 if (type != SCAN_OUT)
1046 {
1047 if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
1048 {
1049 LOG_ERROR("couldn't read from FT2232");
1050 exit(-1);
1051 }
1052 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1053 thisrun_read,
1054 (int)bytes_read);
1055 receive_pointer += bytes_read;
1056 }
1057 }
1058
1059 thisrun_read = 0;
1060
1061 /* the most signifcant bit is scanned during TAP movement */
1062 if (type != SCAN_IN)
1063 last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
1064 else
1065 last_bit = 0;
1066
1067 /* process remaining bits but the last one */
1068 if (bits_left > 1)
1069 {
1070 if (type == SCAN_IO)
1071 {
1072 /* Clock Data Bits In and Out LSB First */
1073 buffer_write(0x3b);
1074 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1075 }
1076 else if (type == SCAN_OUT)
1077 {
1078 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1079 buffer_write(0x1b);
1080 /* LOG_DEBUG("added TDI bits (o)"); */
1081 }
1082 else if (type == SCAN_IN)
1083 {
1084 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1085 buffer_write(0x2a);
1086 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1087 }
1088 buffer_write(bits_left - 2);
1089 if (type != SCAN_IN)
1090 buffer_write(buffer[cur_byte]);
1091
1092 if (type != SCAN_OUT)
1093 thisrun_read += 2;
1094 }
1095
1096 if (tap_get_end_state() == TAP_DRSHIFT)
1097 {
1098 if (type == SCAN_IO)
1099 {
1100 /* Clock Data Bits In and Out LSB First */
1101 buffer_write(0x3b);
1102 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1103 }
1104 else if (type == SCAN_OUT)
1105 {
1106 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1107 buffer_write(0x1b);
1108 /* LOG_DEBUG("added TDI bits (o)"); */
1109 }
1110 else if (type == SCAN_IN)
1111 {
1112 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1113 buffer_write(0x2a);
1114 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1115 }
1116 buffer_write(0x0);
1117 buffer_write(last_bit);
1118 }
1119 else
1120 {
1121 int tms_bits = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1122 int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1123 uint8_t mpsse_cmd;
1124
1125 /* move from Shift-IR/DR to end state */
1126 if (type != SCAN_OUT)
1127 {
1128 /* Clock Data to TMS/CS Pin with Read */
1129 mpsse_cmd = 0x6b;
1130 /* LOG_DEBUG("added TMS scan (read)"); */
1131 }
1132 else
1133 {
1134 /* Clock Data to TMS/CS Pin (no Read) */
1135 mpsse_cmd = 0x4b;
1136 /* LOG_DEBUG("added TMS scan (no read)"); */
1137 }
1138
1139 clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
1140 }
1141
1142 if (type != SCAN_OUT)
1143 thisrun_read += 1;
1144
1145 if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
1146 {
1147 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1148 exit(-1);
1149 }
1150 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1151 ft2232_buffer_size,
1152 (int)bytes_written);
1153 ft2232_buffer_size = 0;
1154
1155 if (type != SCAN_OUT)
1156 {
1157 if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
1158 {
1159 LOG_ERROR("couldn't read from FT2232");
1160 exit(-1);
1161 }
1162 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1163 thisrun_read,
1164 (int)bytes_read);
1165 receive_pointer += bytes_read;
1166 }
1167
1168 return ERROR_OK;
1169 }
1170
1171 static int ft2232_predict_scan_out(int scan_size, enum scan_type type)
1172 {
1173 int predicted_size = 3;
1174 int num_bytes = (scan_size - 1) / 8;
1175
1176 if (tap_get_state() != TAP_DRSHIFT)
1177 predicted_size += get_tms_buffer_requirements(tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
1178
1179 if (type == SCAN_IN) /* only from device to host */
1180 {
1181 /* complete bytes */
1182 predicted_size += CEIL(num_bytes, 65536) * 3;
1183
1184 /* remaining bits - 1 (up to 7) */
1185 predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
1186 }
1187 else /* host to device, or bidirectional */
1188 {
1189 /* complete bytes */
1190 predicted_size += num_bytes + CEIL(num_bytes, 65536) * 3;
1191
1192 /* remaining bits -1 (up to 7) */
1193 predicted_size += ((scan_size - 1) % 8) ? 3 : 0;
1194 }
1195
1196 return predicted_size;
1197 }
1198
1199 static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
1200 {
1201 int predicted_size = 0;
1202
1203 if (type != SCAN_OUT)
1204 {
1205 /* complete bytes */
1206 predicted_size += (CEIL(scan_size, 8) > 1) ? (CEIL(scan_size, 8) - 1) : 0;
1207
1208 /* remaining bits - 1 */
1209 predicted_size += ((scan_size - 1) % 8) ? 1 : 0;
1210
1211 /* last bit (from TMS scan) */
1212 predicted_size += 1;
1213 }
1214
1215 /* LOG_DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size); */
1216
1217 return predicted_size;
1218 }
1219
1220 static void usbjtag_reset(int trst, int srst)
1221 {
1222 enum reset_types jtag_reset_config = jtag_get_reset_config();
1223 if (trst == 1)
1224 {
1225 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1226 low_direction |= nTRSTnOE; /* switch to output pin (output is low) */
1227 else
1228 low_output &= ~nTRST; /* switch output low */
1229 }
1230 else if (trst == 0)
1231 {
1232 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1233 low_direction &= ~nTRSTnOE; /* switch to input pin (high-Z + internal and external pullup) */
1234 else
1235 low_output |= nTRST; /* switch output high */
1236 }
1237
1238 if (srst == 1)
1239 {
1240 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1241 low_output &= ~nSRST; /* switch output low */
1242 else
1243 low_direction |= nSRSTnOE; /* switch to output pin (output is low) */
1244 }
1245 else if (srst == 0)
1246 {
1247 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1248 low_output |= nSRST; /* switch output high */
1249 else
1250 low_direction &= ~nSRSTnOE; /* switch to input pin (high-Z) */
1251 }
1252
1253 /* command "set data bits low byte" */
1254 buffer_write(0x80);
1255 buffer_write(low_output);
1256 buffer_write(low_direction);
1257 }
1258
1259 static void jtagkey_reset(int trst, int srst)
1260 {
1261 enum reset_types jtag_reset_config = jtag_get_reset_config();
1262 if (trst == 1)
1263 {
1264 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1265 high_output &= ~nTRSTnOE;
1266 else
1267 high_output &= ~nTRST;
1268 }
1269 else if (trst == 0)
1270 {
1271 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1272 high_output |= nTRSTnOE;
1273 else
1274 high_output |= nTRST;
1275 }
1276
1277 if (srst == 1)
1278 {
1279 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1280 high_output &= ~nSRST;
1281 else
1282 high_output &= ~nSRSTnOE;
1283 }
1284 else if (srst == 0)
1285 {
1286 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
1287 high_output |= nSRST;
1288 else
1289 high_output |= nSRSTnOE;
1290 }
1291
1292 /* command "set data bits high byte" */
1293 buffer_write(0x82);
1294 buffer_write(high_output);
1295 buffer_write(high_direction);
1296 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
1297 high_direction);
1298 }
1299
1300 static void olimex_jtag_reset(int trst, int srst)
1301 {
1302 enum reset_types jtag_reset_config = jtag_get_reset_config();
1303 if (trst == 1)
1304 {
1305 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1306 high_output &= ~nTRSTnOE;
1307 else
1308 high_output &= ~nTRST;
1309 }
1310 else if (trst == 0)
1311 {
1312 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
1313 high_output |= nTRSTnOE;
1314 else
1315 high_output |= nTRST;
1316 }
1317
1318 if (srst == 1)
1319 {
1320 high_output |= nSRST;
1321 }
1322 else if (srst == 0)
1323 {
1324 high_output &= ~nSRST;
1325 }
1326
1327 /* command "set data bits high byte" */
1328 buffer_write(0x82);
1329 buffer_write(high_output);
1330 buffer_write(high_direction);
1331 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
1332 high_direction);
1333 }
1334
1335 static void axm0432_jtag_reset(int trst, int srst)
1336 {
1337 if (trst == 1)
1338 {
1339 tap_set_state(TAP_RESET);
1340 high_output &= ~nTRST;
1341 }
1342 else if (trst == 0)
1343 {
1344 high_output |= nTRST;
1345 }
1346
1347 if (srst == 1)
1348 {
1349 high_output &= ~nSRST;
1350 }
1351 else if (srst == 0)
1352 {
1353 high_output |= nSRST;
1354 }
1355
1356 /* command "set data bits low byte" */
1357 buffer_write(0x82);
1358 buffer_write(high_output);
1359 buffer_write(high_direction);
1360 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
1361 high_direction);
1362 }
1363
1364 static void flyswatter_reset(int trst, int srst)
1365 {
1366 if (trst == 1)
1367 {
1368 low_output &= ~nTRST;
1369 }
1370 else if (trst == 0)
1371 {
1372 low_output |= nTRST;
1373 }
1374
1375 if (srst == 1)
1376 {
1377 low_output |= nSRST;
1378 }
1379 else if (srst == 0)
1380 {
1381 low_output &= ~nSRST;
1382 }
1383
1384 /* command "set data bits low byte" */
1385 buffer_write(0x80);
1386 buffer_write(low_output);
1387 buffer_write(low_direction);
1388 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
1389 }
1390
1391 static void turtle_reset(int trst, int srst)
1392 {
1393 trst = trst;
1394
1395 if (srst == 1)
1396 {
1397 low_output |= nSRST;
1398 }
1399 else if (srst == 0)
1400 {
1401 low_output &= ~nSRST;
1402 }
1403
1404 /* command "set data bits low byte" */
1405 buffer_write(0x80);
1406 buffer_write(low_output);
1407 buffer_write(low_direction);
1408 LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction);
1409 }
1410
1411 static void comstick_reset(int trst, int srst)
1412 {
1413 if (trst == 1)
1414 {
1415 high_output &= ~nTRST;
1416 }
1417 else if (trst == 0)
1418 {
1419 high_output |= nTRST;
1420 }
1421
1422 if (srst == 1)
1423 {
1424 high_output &= ~nSRST;
1425 }
1426 else if (srst == 0)
1427 {
1428 high_output |= nSRST;
1429 }
1430
1431 /* command "set data bits high byte" */
1432 buffer_write(0x82);
1433 buffer_write(high_output);
1434 buffer_write(high_direction);
1435 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
1436 high_direction);
1437 }
1438
1439 static void stm32stick_reset(int trst, int srst)
1440 {
1441 if (trst == 1)
1442 {
1443 high_output &= ~nTRST;
1444 }
1445 else if (trst == 0)
1446 {
1447 high_output |= nTRST;
1448 }
1449
1450 if (srst == 1)
1451 {
1452 low_output &= ~nSRST;
1453 }
1454 else if (srst == 0)
1455 {
1456 low_output |= nSRST;
1457 }
1458
1459 /* command "set data bits low byte" */
1460 buffer_write(0x80);
1461 buffer_write(low_output);
1462 buffer_write(low_direction);
1463
1464 /* command "set data bits high byte" */
1465 buffer_write(0x82);
1466 buffer_write(high_output);
1467 buffer_write(high_direction);
1468 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
1469 high_direction);
1470 }
1471
1472 static void sheevaplug_reset(int trst, int srst)
1473 {
1474 if (trst == 1)
1475 high_output &= ~nTRST;
1476 else if (trst == 0)
1477 high_output |= nTRST;
1478
1479 if (srst == 1)
1480 high_output &= ~nSRSTnOE;
1481 else if (srst == 0)
1482 high_output |= nSRSTnOE;
1483
1484 /* command "set data bits high byte" */
1485 buffer_write(0x82);
1486 buffer_write(high_output);
1487 buffer_write(high_direction);
1488 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
1489 }
1490
1491 static int ft2232_execute_runtest(jtag_command_t *cmd)
1492 {
1493 int retval;
1494 int i;
1495 int predicted_size = 0;
1496 retval = ERROR_OK;
1497
1498 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
1499 cmd->cmd.runtest->num_cycles,
1500 tap_state_name(cmd->cmd.runtest->end_state));
1501
1502 /* only send the maximum buffer size that FT2232C can handle */
1503 predicted_size = 0;
1504 if (tap_get_state() != TAP_IDLE)
1505 predicted_size += 3;
1506 predicted_size += 3 * CEIL(cmd->cmd.runtest->num_cycles, 7);
1507 if (cmd->cmd.runtest->end_state != TAP_IDLE)
1508 predicted_size += 3;
1509 if (tap_get_end_state() != TAP_IDLE)
1510 predicted_size += 3;
1511 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
1512 {
1513 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1514 retval = ERROR_JTAG_QUEUE_FAILED;
1515 require_send = 0;
1516 first_unsent = cmd;
1517 }
1518 if (tap_get_state() != TAP_IDLE)
1519 {
1520 move_to_state(TAP_IDLE);
1521 require_send = 1;
1522 }
1523 i = cmd->cmd.runtest->num_cycles;
1524 while (i > 0)
1525 {
1526 /* there are no state transitions in this code, so omit state tracking */
1527
1528 /* command "Clock Data to TMS/CS Pin (no Read)" */
1529 buffer_write(0x4b);
1530
1531 /* scan 7 bits */
1532 buffer_write((i > 7) ? 6 : (i - 1));
1533
1534 /* TMS data bits */
1535 buffer_write(0x0);
1536 tap_set_state(TAP_IDLE);
1537
1538 i -= (i > 7) ? 7 : i;
1539 /* LOG_DEBUG("added TMS scan (no read)"); */
1540 }
1541
1542 ft2232_end_state(cmd->cmd.runtest->end_state);
1543
1544 if (tap_get_state() != tap_get_end_state())
1545 {
1546 move_to_state(tap_get_end_state());
1547 }
1548
1549 require_send = 1;
1550 #ifdef _DEBUG_JTAG_IO_
1551 LOG_DEBUG("runtest: %i, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(tap_get_end_state()));
1552 #endif
1553
1554 return retval;
1555 }
1556
1557 static int ft2232_execute_statemove(jtag_command_t *cmd)
1558 {
1559 int predicted_size = 0;
1560 int retval = ERROR_OK;
1561
1562 DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
1563
1564 /* only send the maximum buffer size that FT2232C can handle */
1565 predicted_size = 3;
1566 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
1567 {
1568 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1569 retval = ERROR_JTAG_QUEUE_FAILED;
1570 require_send = 0;
1571 first_unsent = cmd;
1572 }
1573 ft2232_end_state(cmd->cmd.statemove->end_state);
1574
1575 /* move to end state */
1576 if (tap_get_state() != tap_get_end_state())
1577 {
1578 move_to_state(tap_get_end_state());
1579 require_send = 1;
1580 }
1581
1582 return retval;
1583 }
1584
1585 static int ft2232_execute_pathmove(jtag_command_t *cmd)
1586 {
1587 int predicted_size = 0;
1588 int retval = ERROR_OK;
1589
1590 tap_state_t* path = cmd->cmd.pathmove->path;
1591 int num_states = cmd->cmd.pathmove->num_states;
1592
1593 DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
1594 tap_state_name(tap_get_state()),
1595 tap_state_name(path[num_states-1]));
1596
1597 /* only send the maximum buffer size that FT2232C can handle */
1598 predicted_size = 3 * CEIL(num_states, 7);
1599 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
1600 {
1601 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1602 retval = ERROR_JTAG_QUEUE_FAILED;
1603
1604 require_send = 0;
1605 first_unsent = cmd;
1606 }
1607
1608 ft2232_add_pathmove(path, num_states);
1609 require_send = 1;
1610
1611 return retval;
1612 }
1613
1614 static int ft2232_execute_scan(jtag_command_t *cmd)
1615 {
1616 uint8_t* buffer;
1617 int scan_size; /* size of IR or DR scan */
1618 int predicted_size = 0;
1619 int retval = ERROR_OK;
1620
1621 enum scan_type type = jtag_scan_type(cmd->cmd.scan);
1622
1623 DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN", type);
1624
1625 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
1626
1627 predicted_size = ft2232_predict_scan_out(scan_size, type);
1628 if ((predicted_size + 1) > FT2232_BUFFER_SIZE)
1629 {
1630 LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
1631 /* unsent commands before this */
1632 if (first_unsent != cmd)
1633 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1634 retval = ERROR_JTAG_QUEUE_FAILED;
1635
1636 /* current command */
1637 ft2232_end_state(cmd->cmd.scan->end_state);
1638 ft2232_large_scan(cmd->cmd.scan, type, buffer, scan_size);
1639 require_send = 0;
1640 first_unsent = cmd->next;
1641 if (buffer)
1642 free(buffer);
1643 return retval;
1644 }
1645 else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
1646 {
1647 LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
1648 first_unsent,
1649 cmd);
1650 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1651 retval = ERROR_JTAG_QUEUE_FAILED;
1652 require_send = 0;
1653 first_unsent = cmd;
1654 }
1655 ft2232_expect_read += ft2232_predict_scan_in(scan_size, type);
1656 /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */
1657 ft2232_end_state(cmd->cmd.scan->end_state);
1658 ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
1659 require_send = 1;
1660 if (buffer)
1661 free(buffer);
1662 #ifdef _DEBUG_JTAG_IO_
1663 LOG_DEBUG("%s scan, %i bits, end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
1664 tap_state_name(tap_get_end_state()));
1665 #endif
1666 return retval;
1667
1668 }
1669
1670 static int ft2232_execute_reset(jtag_command_t *cmd)
1671 {
1672 int retval;
1673 int predicted_size = 0;
1674 retval = ERROR_OK;
1675
1676 DEBUG_JTAG_IO("reset trst: %i srst %i",
1677 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1678
1679 /* only send the maximum buffer size that FT2232C can handle */
1680 predicted_size = 3;
1681 if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
1682 {
1683 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1684 retval = ERROR_JTAG_QUEUE_FAILED;
1685 require_send = 0;
1686 first_unsent = cmd;
1687 }
1688
1689 layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1690 require_send = 1;
1691
1692 #ifdef _DEBUG_JTAG_IO_
1693 LOG_DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1694 #endif
1695 return retval;
1696 }
1697
1698 static int ft2232_execute_sleep(jtag_command_t *cmd)
1699 {
1700 int retval;
1701 retval = ERROR_OK;
1702
1703 DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
1704
1705 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1706 retval = ERROR_JTAG_QUEUE_FAILED;
1707 first_unsent = cmd->next;
1708 jtag_sleep(cmd->cmd.sleep->us);
1709 #ifdef _DEBUG_JTAG_IO_
1710 LOG_DEBUG("sleep %i usec while in %s", cmd->cmd.sleep->us, tap_state_name(tap_get_state()));
1711 #endif
1712
1713 return retval;
1714 }
1715
1716 static int ft2232_execute_stableclocks(jtag_command_t *cmd)
1717 {
1718 int retval;
1719 retval = ERROR_OK;
1720
1721 /* this is only allowed while in a stable state. A check for a stable
1722 * state was done in jtag_add_clocks()
1723 */
1724 if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
1725 retval = ERROR_JTAG_QUEUE_FAILED;
1726 #ifdef _DEBUG_JTAG_IO_
1727 LOG_DEBUG("clocks %i while in %s", cmd->cmd.stableclocks->num_cycles, tap_state_name(tap_get_state()));
1728 #endif
1729
1730 return retval;
1731 }
1732
1733 static int ft2232_execute_command(jtag_command_t *cmd)
1734 {
1735 int retval;
1736 retval = ERROR_OK;
1737
1738 switch (cmd->type)
1739 {
1740 case JTAG_RESET: retval = ft2232_execute_reset(cmd); break;
1741 case JTAG_RUNTEST: retval = ft2232_execute_runtest(cmd); break;
1742 case JTAG_STATEMOVE: retval = ft2232_execute_statemove(cmd); break;
1743 case JTAG_PATHMOVE: retval = ft2232_execute_pathmove(cmd); break;
1744 case JTAG_SCAN: retval = ft2232_execute_scan(cmd); break;
1745 case JTAG_SLEEP: retval = ft2232_execute_sleep(cmd); break;
1746 case JTAG_STABLECLOCKS: retval = ft2232_execute_stableclocks(cmd); break;
1747 default:
1748 LOG_ERROR("BUG: unknown JTAG command type encountered");
1749 exit(-1);
1750 }
1751 return retval;
1752 }
1753
1754 static int ft2232_execute_queue()
1755 {
1756 jtag_command_t* cmd = jtag_command_queue; /* currently processed command */
1757 int retval;
1758
1759 first_unsent = cmd; /* next command that has to be sent */
1760 require_send = 0;
1761
1762 /* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
1763 * that wasn't handled by a caller-provided error handler
1764 */
1765 retval = ERROR_OK;
1766
1767 ft2232_buffer_size = 0;
1768 ft2232_expect_read = 0;
1769
1770 /* blink, if the current layout has that feature */
1771 if (layout->blink)
1772 layout->blink();
1773
1774 while (cmd)
1775 {
1776 if (ft2232_execute_command(cmd) != ERROR_OK)
1777 retval = ERROR_JTAG_QUEUE_FAILED;
1778 /* Start reading input before FT2232 TX buffer fills up */
1779 cmd = cmd->next;
1780 if (ft2232_expect_read > 256)
1781 {
1782 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1783 retval = ERROR_JTAG_QUEUE_FAILED;
1784 first_unsent = cmd;
1785 }
1786 }
1787
1788 if (require_send > 0)
1789 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
1790 retval = ERROR_JTAG_QUEUE_FAILED;
1791
1792 return retval;
1793 }
1794
1795 #if BUILD_FT2232_FTD2XX == 1
1796 static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_more)
1797 {
1798 FT_STATUS status;
1799 DWORD deviceID;
1800 char SerialNumber[16];
1801 char Description[64];
1802 DWORD openex_flags = 0;
1803 char* openex_string = NULL;
1804 uint8_t latency_timer;
1805
1806 LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)", ft2232_layout, vid, pid);
1807
1808 #if IS_WIN32 == 0
1809 /* Add non-standard Vid/Pid to the linux driver */
1810 if ((status = FT_SetVIDPID(vid, pid)) != FT_OK)
1811 {
1812 LOG_WARNING("couldn't add %4.4x:%4.4x", vid, pid);
1813 }
1814 #endif
1815
1816 if (ft2232_device_desc && ft2232_serial)
1817 {
1818 LOG_WARNING("can't open by device description and serial number, giving precedence to serial");
1819 ft2232_device_desc = NULL;
1820 }
1821
1822 if (ft2232_device_desc)
1823 {
1824 openex_string = ft2232_device_desc;
1825 openex_flags = FT_OPEN_BY_DESCRIPTION;
1826 }
1827 else if (ft2232_serial)
1828 {
1829 openex_string = ft2232_serial;
1830 openex_flags = FT_OPEN_BY_SERIAL_NUMBER;
1831 }
1832 else
1833 {
1834 LOG_ERROR("neither device description nor serial number specified");
1835 LOG_ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
1836
1837 return ERROR_JTAG_INIT_FAILED;
1838 }
1839
1840 status = FT_OpenEx(openex_string, openex_flags, &ftdih);
1841 if (status != FT_OK) {
1842 /* under Win32, the FTD2XX driver appends an "A" to the end
1843 * of the description, if we tried by the desc, then
1844 * try by the alternate "A" description. */
1845 if (openex_string == ft2232_device_desc) {
1846 /* Try the alternate method. */
1847 openex_string = ft2232_device_desc_A;
1848 status = FT_OpenEx(openex_string, openex_flags, &ftdih);
1849 if (status == FT_OK) {
1850 /* yea, the "alternate" method worked! */
1851 } else {
1852 /* drat, give the user a meaningfull message.
1853 * telling the use we tried *BOTH* methods. */
1854 LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n",
1855 ft2232_device_desc,
1856 ft2232_device_desc_A);
1857 }
1858 }
1859 }
1860
1861 if (status != FT_OK)
1862 {
1863 DWORD num_devices;
1864
1865 if (more)
1866 {
1867 LOG_WARNING("unable to open ftdi device (trying more): %lu", status);
1868 *try_more = 1;
1869 return ERROR_JTAG_INIT_FAILED;
1870 }
1871 LOG_ERROR("unable to open ftdi device: %lu", status);
1872 status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY);
1873 if (status == FT_OK)
1874 {
1875 char** desc_array = malloc(sizeof(char*) * (num_devices + 1));
1876 uint32_t i;
1877
1878 for (i = 0; i < num_devices; i++)
1879 desc_array[i] = malloc(64);
1880
1881 desc_array[num_devices] = NULL;
1882
1883 status = FT_ListDevices(desc_array, &num_devices, FT_LIST_ALL | openex_flags);
1884
1885 if (status == FT_OK)
1886 {
1887 LOG_ERROR("ListDevices: %lu\n", num_devices);
1888 for (i = 0; i < num_devices; i++)
1889 LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]);
1890 }
1891
1892 for (i = 0; i < num_devices; i++)
1893 free(desc_array[i]);
1894
1895 free(desc_array);
1896 }
1897 else
1898 {
1899 LOG_ERROR("ListDevices: NONE\n");
1900 }
1901 return ERROR_JTAG_INIT_FAILED;
1902 }
1903
1904 if ((status = FT_SetLatencyTimer(ftdih, ft2232_latency)) != FT_OK)
1905 {
1906 LOG_ERROR("unable to set latency timer: %lu", status);
1907 return ERROR_JTAG_INIT_FAILED;
1908 }
1909
1910 if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK)
1911 {
1912 LOG_ERROR("unable to get latency timer: %lu", status);
1913 return ERROR_JTAG_INIT_FAILED;
1914 }
1915 else
1916 {
1917 LOG_DEBUG("current latency timer: %i", latency_timer);
1918 }
1919
1920 if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK)
1921 {
1922 LOG_ERROR("unable to set timeouts: %lu", status);
1923 return ERROR_JTAG_INIT_FAILED;
1924 }
1925
1926 if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK)
1927 {
1928 LOG_ERROR("unable to enable bit i/o mode: %lu", status);
1929 return ERROR_JTAG_INIT_FAILED;
1930 }
1931
1932 if ((status = FT_GetDeviceInfo(ftdih, &ftdi_device, &deviceID, SerialNumber, Description, NULL)) != FT_OK)
1933 {
1934 LOG_ERROR("unable to get FT_GetDeviceInfo: %lu", status);
1935 return ERROR_JTAG_INIT_FAILED;
1936 }
1937 else
1938 {
1939 static const char* type_str[] =
1940 {"BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H"};
1941 unsigned no_of_known_types = sizeof(type_str) / sizeof(type_str[0]) - 1;
1942 unsigned type_index = ((unsigned)ftdi_device <= no_of_known_types)
1943 ? ftdi_device : FT_DEVICE_UNKNOWN;
1944 LOG_INFO("device: %lu \"%s\"", ftdi_device, type_str[type_index]);
1945 LOG_INFO("deviceID: %lu", deviceID);
1946 LOG_INFO("SerialNumber: %s", SerialNumber);
1947 LOG_INFO("Description: %s", Description);
1948 }
1949
1950 return ERROR_OK;
1951 }
1952
1953 static int ft2232_purge_ftd2xx(void)
1954 {
1955 FT_STATUS status;
1956
1957 if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK)
1958 {
1959 LOG_ERROR("error purging ftd2xx device: %lu", status);
1960 return ERROR_JTAG_INIT_FAILED;
1961 }
1962
1963 return ERROR_OK;
1964 }
1965
1966 #endif /* BUILD_FT2232_FTD2XX == 1 */
1967
1968 #if BUILD_FT2232_LIBFTDI == 1
1969 static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_more)
1970 {
1971 uint8_t latency_timer;
1972
1973 LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
1974 ft2232_layout, vid, pid);
1975
1976 if (ftdi_init(&ftdic) < 0)
1977 return ERROR_JTAG_INIT_FAILED;
1978
1979 if (ftdi_set_interface(&ftdic, INTERFACE_A) < 0)
1980 {
1981 LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str);
1982 return ERROR_JTAG_INIT_FAILED;
1983 }
1984
1985 /* context, vendor id, product id */
1986 if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc,
1987 ft2232_serial) < 0)
1988 {
1989 if (more)
1990 LOG_WARNING("unable to open ftdi device (trying more): %s",
1991 ftdic.error_str);
1992 else
1993 LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str);
1994 *try_more = 1;
1995 return ERROR_JTAG_INIT_FAILED;
1996 }
1997
1998 /* There is already a reset in ftdi_usb_open_desc, this should be redundant */
1999 if (ftdi_usb_reset(&ftdic) < 0)
2000 {
2001 LOG_ERROR("unable to reset ftdi device");
2002 return ERROR_JTAG_INIT_FAILED;
2003 }
2004
2005 if (ftdi_set_latency_timer(&ftdic, ft2232_latency) < 0)
2006 {
2007 LOG_ERROR("unable to set latency timer");
2008 return ERROR_JTAG_INIT_FAILED;
2009 }
2010
2011 if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0)
2012 {
2013 LOG_ERROR("unable to get latency timer");
2014 return ERROR_JTAG_INIT_FAILED;
2015 }
2016 else
2017 {
2018 LOG_DEBUG("current latency timer: %i", latency_timer);
2019 }
2020
2021 ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */
2022
2023 ftdi_device = ftdic.type;
2024 static const char* type_str[] =
2025 {"AM", "BM", "2232C", "R", "2232H", "4232H", "Unknown"};
2026 unsigned no_of_known_types = sizeof(type_str) / sizeof(type_str[0]) - 1;
2027 unsigned type_index = ((unsigned)ftdi_device < no_of_known_types)
2028 ? ftdi_device : no_of_known_types;
2029 LOG_DEBUG("FTDI chip type: %i \"%s\"", (int)ftdi_device, type_str[type_index]);
2030 return ERROR_OK;
2031 }
2032
2033 static int ft2232_purge_libftdi(void)
2034 {
2035 if (ftdi_usb_purge_buffers(&ftdic) < 0)
2036 {
2037 LOG_ERROR("ftdi_purge_buffers: %s", ftdic.error_str);
2038 return ERROR_JTAG_INIT_FAILED;
2039 }
2040
2041 return ERROR_OK;
2042 }
2043
2044 #endif /* BUILD_FT2232_LIBFTDI == 1 */
2045
2046 static int ft2232_init(void)
2047 {
2048 uint8_t buf[1];
2049 int retval;
2050 uint32_t bytes_written;
2051 const ft2232_layout_t* cur_layout = ft2232_layouts;
2052 int i;
2053
2054 if (tap_get_tms_path_len(TAP_IRPAUSE,TAP_IRPAUSE) == 7)
2055 {
2056 LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
2057 }
2058 else
2059 {
2060 LOG_DEBUG("ft2232 interface using shortest path jtag state transitions");
2061
2062 }
2063 if ((ft2232_layout == NULL) || (ft2232_layout[0] == 0))
2064 {
2065 ft2232_layout = "usbjtag";
2066 LOG_WARNING("No ft2232 layout specified, using default 'usbjtag'");
2067 }
2068
2069 while (cur_layout->name)
2070 {
2071 if (strcmp(cur_layout->name, ft2232_layout) == 0)
2072 {
2073 layout = cur_layout;
2074 break;
2075 }
2076 cur_layout++;
2077 }
2078
2079 if (!layout)
2080 {
2081 LOG_ERROR("No matching layout found for %s", ft2232_layout);
2082 return ERROR_JTAG_INIT_FAILED;
2083 }
2084
2085 for (i = 0; 1; i++)
2086 {
2087 /*
2088 * "more indicates that there are more IDs to try, so we should
2089 * not print an error for an ID mismatch (but for anything
2090 * else, we should).
2091 *
2092 * try_more indicates that the error code returned indicates an
2093 * ID mismatch (and nothing else) and that we should proceeed
2094 * with the next ID pair.
2095 */
2096 int more = ft2232_vid[i + 1] || ft2232_pid[i + 1];
2097 int try_more = 0;
2098
2099 #if BUILD_FT2232_FTD2XX == 1
2100 retval = ft2232_init_ftd2xx(ft2232_vid[i], ft2232_pid[i],
2101 more, &try_more);
2102 #elif BUILD_FT2232_LIBFTDI == 1
2103 retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
2104 more, &try_more);
2105 #endif
2106 if (retval >= 0)
2107 break;
2108 if (!more || !try_more)
2109 return retval;
2110 }
2111
2112 ft2232_buffer_size = 0;
2113 ft2232_buffer = malloc(FT2232_BUFFER_SIZE);
2114
2115 if (layout->init() != ERROR_OK)
2116 return ERROR_JTAG_INIT_FAILED;
2117
2118 if (ft2232_device_is_highspeed())
2119 {
2120 #ifndef BUILD_FT2232_HIGHSPEED
2121 #if BUILD_FT2232_FTD2XX == 1
2122 LOG_WARNING("High Speed device found - You need a newer FTD2XX driver (version 2.04.16 or later)");
2123 #elif BUILD_FT2232_LIBFTDI == 1
2124 LOG_WARNING("High Speed device found - You need a newer libftdi version (0.16 or later)");
2125 #endif
2126 #endif
2127 /* make sure the legacy mode is disabled */
2128 if (ft2232h_ft4232h_clk_divide_by_5(false) != ERROR_OK)
2129 return ERROR_JTAG_INIT_FAILED;
2130 }
2131
2132 ft2232_speed(jtag_get_speed());
2133
2134 buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
2135 if (((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) || (bytes_written != 1))
2136 {
2137 LOG_ERROR("couldn't write to FT2232 to disable loopback");
2138 return ERROR_JTAG_INIT_FAILED;
2139 }
2140
2141 #if BUILD_FT2232_FTD2XX == 1
2142 return ft2232_purge_ftd2xx();
2143 #elif BUILD_FT2232_LIBFTDI == 1
2144 return ft2232_purge_libftdi();
2145 #endif
2146
2147 return ERROR_OK;
2148 }
2149
2150 static int usbjtag_init(void)
2151 {
2152 uint8_t buf[3];
2153 uint32_t bytes_written;
2154
2155 low_output = 0x08;
2156 low_direction = 0x0b;
2157
2158 if (strcmp(ft2232_layout, "usbjtag") == 0)
2159 {
2160 nTRST = 0x10;
2161 nTRSTnOE = 0x10;
2162 nSRST = 0x40;
2163 nSRSTnOE = 0x40;
2164 }
2165 else if (strcmp(ft2232_layout, "signalyzer") == 0)
2166 {
2167 nTRST = 0x10;
2168 nTRSTnOE = 0x10;
2169 nSRST = 0x20;
2170 nSRSTnOE = 0x20;
2171 }
2172 else if (strcmp(ft2232_layout, "evb_lm3s811") == 0)
2173 {
2174 nTRST = 0x0;
2175 nTRSTnOE = 0x00;
2176 nSRST = 0x20;
2177 nSRSTnOE = 0x20;
2178 low_output = 0x88;
2179 low_direction = 0x8b;
2180 }
2181 else if (strcmp(ft2232_layout, "luminary_icdi") == 0)
2182 {
2183 nTRST = 0x0;
2184 nTRSTnOE = 0x00;
2185 nSRST = 0x20;
2186 nSRSTnOE = 0x20;
2187 low_output = 0x88;
2188 low_direction = 0xcb;
2189 }
2190 else
2191 {
2192 LOG_ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout);
2193 return ERROR_JTAG_INIT_FAILED;
2194 }
2195
2196 enum reset_types jtag_reset_config = jtag_get_reset_config();
2197 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2198 {
2199 low_direction &= ~nTRSTnOE; /* nTRST input */
2200 low_output &= ~nTRST; /* nTRST = 0 */
2201 }
2202 else
2203 {
2204 low_direction |= nTRSTnOE; /* nTRST output */
2205 low_output |= nTRST; /* nTRST = 1 */
2206 }
2207
2208 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2209 {
2210 low_direction |= nSRSTnOE; /* nSRST output */
2211 low_output |= nSRST; /* nSRST = 1 */
2212 }
2213 else
2214 {
2215 low_direction &= ~nSRSTnOE; /* nSRST input */
2216 low_output &= ~nSRST; /* nSRST = 0 */
2217 }
2218
2219 /* initialize low byte for jtag */
2220 buf[0] = 0x80; /* command "set data bits low byte" */
2221 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, xRST high) */
2222 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
2223 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2224
2225 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2226 {
2227 LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
2228 return ERROR_JTAG_INIT_FAILED;
2229 }
2230
2231 return ERROR_OK;
2232 }
2233
2234 static int axm0432_jtag_init(void)
2235 {
2236 uint8_t buf[3];
2237 uint32_t bytes_written;
2238
2239 low_output = 0x08;
2240 low_direction = 0x2b;
2241
2242 /* initialize low byte for jtag */
2243 buf[0] = 0x80; /* command "set data bits low byte" */
2244 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2245 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2246 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2247
2248 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2249 {
2250 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2251 return ERROR_JTAG_INIT_FAILED;
2252 }
2253
2254 if (strcmp(layout->name, "axm0432_jtag") == 0)
2255 {
2256 nTRST = 0x08;
2257 nTRSTnOE = 0x0; /* No output enable for TRST*/
2258 nSRST = 0x04;
2259 nSRSTnOE = 0x0; /* No output enable for SRST*/
2260 }
2261 else
2262 {
2263 LOG_ERROR("BUG: axm0432_jtag_init called for non axm0432 layout");
2264 exit(-1);
2265 }
2266
2267 high_output = 0x0;
2268 high_direction = 0x0c;
2269
2270 enum reset_types jtag_reset_config = jtag_get_reset_config();
2271 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2272 {
2273 LOG_ERROR("can't set nTRSTOE to push-pull on the Dicarlo jtag");
2274 }
2275 else
2276 {
2277 high_output |= nTRST;
2278 }
2279
2280 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2281 {
2282 LOG_ERROR("can't set nSRST to push-pull on the Dicarlo jtag");
2283 }
2284 else
2285 {
2286 high_output |= nSRST;
2287 }
2288
2289 /* initialize high port */
2290 buf[0] = 0x82; /* command "set data bits high byte" */
2291 buf[1] = high_output; /* value */
2292 buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */
2293 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2294
2295 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2296 {
2297 LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
2298 return ERROR_JTAG_INIT_FAILED;
2299 }
2300
2301 return ERROR_OK;
2302 }
2303
2304 static int jtagkey_init(void)
2305 {
2306 uint8_t buf[3];
2307 uint32_t bytes_written;
2308
2309 low_output = 0x08;
2310 low_direction = 0x1b;
2311
2312 /* initialize low byte for jtag */
2313 buf[0] = 0x80; /* command "set data bits low byte" */
2314 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2315 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2316 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2317
2318 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2319 {
2320 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2321 return ERROR_JTAG_INIT_FAILED;
2322 }
2323
2324 if (strcmp(layout->name, "jtagkey") == 0)
2325 {
2326 nTRST = 0x01;
2327 nTRSTnOE = 0x4;
2328 nSRST = 0x02;
2329 nSRSTnOE = 0x08;
2330 }
2331 else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0)
2332 || (strcmp(layout->name, "oocdlink") == 0))
2333 {
2334 nTRST = 0x02;
2335 nTRSTnOE = 0x1;
2336 nSRST = 0x08;
2337 nSRSTnOE = 0x04;
2338 }
2339 else
2340 {
2341 LOG_ERROR("BUG: jtagkey_init called for non jtagkey layout");
2342 exit(-1);
2343 }
2344
2345 high_output = 0x0;
2346 high_direction = 0x0f;
2347
2348 enum reset_types jtag_reset_config = jtag_get_reset_config();
2349 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2350 {
2351 high_output |= nTRSTnOE;
2352 high_output &= ~nTRST;
2353 }
2354 else
2355 {
2356 high_output &= ~nTRSTnOE;
2357 high_output |= nTRST;
2358 }
2359
2360 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2361 {
2362 high_output &= ~nSRSTnOE;
2363 high_output |= nSRST;
2364 }
2365 else
2366 {
2367 high_output |= nSRSTnOE;
2368 high_output &= ~nSRST;
2369 }
2370
2371 /* initialize high port */
2372 buf[0] = 0x82; /* command "set data bits high byte" */
2373 buf[1] = high_output; /* value */
2374 buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */
2375 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2376
2377 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2378 {
2379 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2380 return ERROR_JTAG_INIT_FAILED;
2381 }
2382
2383 return ERROR_OK;
2384 }
2385
2386 static int olimex_jtag_init(void)
2387 {
2388 uint8_t buf[3];
2389 uint32_t bytes_written;
2390
2391 low_output = 0x08;
2392 low_direction = 0x1b;
2393
2394 /* initialize low byte for jtag */
2395 buf[0] = 0x80; /* command "set data bits low byte" */
2396 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2397 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2398 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2399
2400 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2401 {
2402 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2403 return ERROR_JTAG_INIT_FAILED;
2404 }
2405
2406 nTRST = 0x01;
2407 nTRSTnOE = 0x4;
2408 nSRST = 0x02;
2409 nSRSTnOE = 0x00; /* no output enable for nSRST */
2410
2411 high_output = 0x0;
2412 high_direction = 0x0f;
2413
2414 enum reset_types jtag_reset_config = jtag_get_reset_config();
2415 if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
2416 {
2417 high_output |= nTRSTnOE;
2418 high_output &= ~nTRST;
2419 }
2420 else
2421 {
2422 high_output &= ~nTRSTnOE;
2423 high_output |= nTRST;
2424 }
2425
2426 if (jtag_reset_config & RESET_SRST_PUSH_PULL)
2427 {
2428 LOG_ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
2429 }
2430 else
2431 {
2432 high_output &= ~nSRST;
2433 }
2434
2435 /* turn red LED on */
2436 high_output |= 0x08;
2437
2438 /* initialize high port */
2439 buf[0] = 0x82; /* command "set data bits high byte" */
2440 buf[1] = high_output; /* value */
2441 buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */
2442 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2443
2444 if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) || (bytes_written != 3))
2445 {
2446 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2447 return ERROR_JTAG_INIT_FAILED;
2448 }
2449
2450 return ERROR_OK;
2451 }
2452
2453 static int flyswatter_init(void)
2454 {
2455 uint8_t buf[3];
2456 uint32_t bytes_written;
2457
2458 low_output = 0x18;
2459 low_direction = 0xfb;
2460
2461 /* initialize low byte for jtag */
2462 buf[0] = 0x80; /* command "set data bits low byte" */
2463 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2464 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE[12]=out, n[ST]srst = out */
2465 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2466
2467 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2468 {
2469 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2470 return ERROR_JTAG_INIT_FAILED;
2471 }
2472
2473 nTRST = 0x10;
2474 nTRSTnOE = 0x0; /* not output enable for nTRST */
2475 nSRST = 0x20;
2476 nSRSTnOE = 0x00; /* no output enable for nSRST */
2477
2478 high_output = 0x00;
2479 high_direction = 0x0c;
2480
2481 /* turn red LED3 on, LED2 off */
2482 high_output |= 0x08;
2483
2484 /* initialize high port */
2485 buf[0] = 0x82; /* command "set data bits high byte" */
2486 buf[1] = high_output; /* value */
2487 buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */
2488 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2489
2490 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2491 {
2492 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2493 return ERROR_JTAG_INIT_FAILED;
2494 }
2495
2496 return ERROR_OK;
2497 }
2498
2499 static int turtle_init(void)
2500 {
2501 uint8_t buf[3];
2502 uint32_t bytes_written;
2503
2504 low_output = 0x08;
2505 low_direction = 0x5b;
2506
2507 /* initialize low byte for jtag */
2508 buf[0] = 0x80; /* command "set data bits low byte" */
2509 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2510 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2511 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2512
2513 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2514 {
2515 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2516 return ERROR_JTAG_INIT_FAILED;
2517 }
2518
2519 nSRST = 0x40;
2520
2521 high_output = 0x00;
2522 high_direction = 0x0C;
2523
2524 /* initialize high port */
2525 buf[0] = 0x82; /* command "set data bits high byte" */
2526 buf[1] = high_output;
2527 buf[2] = high_direction;
2528 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2529
2530 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2531 {
2532 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2533 return ERROR_JTAG_INIT_FAILED;
2534 }
2535
2536 return ERROR_OK;
2537 }
2538
2539 static int comstick_init(void)
2540 {
2541 uint8_t buf[3];
2542 uint32_t bytes_written;
2543
2544 low_output = 0x08;
2545 low_direction = 0x0b;
2546
2547 /* initialize low byte for jtag */
2548 buf[0] = 0x80; /* command "set data bits low byte" */
2549 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2550 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2551 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2552
2553 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2554 {
2555 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2556 return ERROR_JTAG_INIT_FAILED;
2557 }
2558
2559 nTRST = 0x01;
2560 nTRSTnOE = 0x00; /* no output enable for nTRST */
2561 nSRST = 0x02;
2562 nSRSTnOE = 0x00; /* no output enable for nSRST */
2563
2564 high_output = 0x03;
2565 high_direction = 0x03;
2566
2567 /* initialize high port */
2568 buf[0] = 0x82; /* command "set data bits high byte" */
2569 buf[1] = high_output;
2570 buf[2] = high_direction;
2571 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2572
2573 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2574 {
2575 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2576 return ERROR_JTAG_INIT_FAILED;
2577 }
2578
2579 return ERROR_OK;
2580 }
2581
2582 static int stm32stick_init(void)
2583 {
2584 uint8_t buf[3];
2585 uint32_t bytes_written;
2586
2587 low_output = 0x88;
2588 low_direction = 0x8b;
2589
2590 /* initialize low byte for jtag */
2591 buf[0] = 0x80; /* command "set data bits low byte" */
2592 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2593 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2594 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2595
2596 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2597 {
2598 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2599 return ERROR_JTAG_INIT_FAILED;
2600 }
2601
2602 nTRST = 0x01;
2603 nTRSTnOE = 0x00; /* no output enable for nTRST */
2604 nSRST = 0x80;
2605 nSRSTnOE = 0x00; /* no output enable for nSRST */
2606
2607 high_output = 0x01;
2608 high_direction = 0x03;
2609
2610 /* initialize high port */
2611 buf[0] = 0x82; /* command "set data bits high byte" */
2612 buf[1] = high_output;
2613 buf[2] = high_direction;
2614 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2615
2616 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2617 {
2618 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2619 return ERROR_JTAG_INIT_FAILED;
2620 }
2621
2622 return ERROR_OK;
2623 }
2624
2625 static int sheevaplug_init(void)
2626 {
2627 uint8_t buf[3];
2628 uint32_t bytes_written;
2629
2630 low_output = 0x08;
2631 low_direction = 0x1b;
2632
2633 /* initialize low byte for jtag */
2634 buf[0] = 0x80; /* command "set data bits low byte" */
2635 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2636 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
2637 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2638
2639 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2640 {
2641 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2642 return ERROR_JTAG_INIT_FAILED;
2643 }
2644
2645 nTRSTnOE = 0x1;
2646 nTRST = 0x02;
2647 nSRSTnOE = 0x4;
2648 nSRST = 0x08;
2649
2650 high_output = 0x0;
2651 high_direction = 0x0f;
2652
2653 /* nTRST is always push-pull */
2654 high_output &= ~nTRSTnOE;
2655 high_output |= nTRST;
2656
2657 /* nSRST is always open-drain */
2658 high_output |= nSRSTnOE;
2659 high_output &= ~nSRST;
2660
2661 /* initialize high port */
2662 buf[0] = 0x82; /* command "set data bits high byte" */
2663 buf[1] = high_output; /* value */
2664 buf[2] = high_direction; /* all outputs - xRST */
2665 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2666
2667 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2668 {
2669 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2670 return ERROR_JTAG_INIT_FAILED;
2671 }
2672
2673 return ERROR_OK;
2674 }
2675
2676 static int cortino_jtag_init(void)
2677 {
2678 uint8_t buf[3];
2679 uint32_t bytes_written;
2680
2681 low_output = 0x08;
2682 low_direction = 0x1b;
2683
2684 /* initialize low byte for jtag */
2685 buf[0] = 0x80; /* command "set data bits low byte" */
2686 buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2687 buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2688 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2689
2690 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2691 {
2692 LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
2693 return ERROR_JTAG_INIT_FAILED;
2694 }
2695
2696 nTRST = 0x01;
2697 nTRSTnOE = 0x00; /* no output enable for nTRST */
2698 nSRST = 0x02;
2699 nSRSTnOE = 0x00; /* no output enable for nSRST */
2700
2701 high_output = 0x03;
2702 high_direction = 0x03;
2703
2704 /* initialize high port */
2705 buf[0] = 0x82; /* command "set data bits high byte" */
2706 buf[1] = high_output;
2707 buf[2] = high_direction;
2708 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2709
2710 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
2711 {
2712 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2713 return ERROR_JTAG_INIT_FAILED;
2714 }
2715
2716 return ERROR_OK;
2717 }
2718
2719 static void olimex_jtag_blink(void)
2720 {
2721 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
2722 * ACBUS3 is bit 3 of the GPIOH port
2723 */
2724 if (high_output & 0x08)
2725 {
2726 /* set port pin high */
2727 high_output &= 0x07;
2728 }
2729 else
2730 {
2731 /* set port pin low */
2732 high_output |= 0x08;
2733 }
2734
2735 buffer_write(0x82);
2736 buffer_write(high_output);
2737 buffer_write(high_direction);
2738 }
2739
2740 static void flyswatter_jtag_blink(void)
2741 {
2742 /*
2743 * Flyswatter has two LEDs connected to ACBUS2 and ACBUS3
2744 */
2745 high_output ^= 0x0c;
2746
2747 buffer_write(0x82);
2748 buffer_write(high_output);
2749 buffer_write(high_direction);
2750 }
2751
2752 static void turtle_jtag_blink(void)
2753 {
2754 /*
2755 * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
2756 */
2757 if (high_output & 0x08)
2758 {
2759 high_output = 0x04;
2760 }
2761 else
2762 {
2763 high_output = 0x08;
2764 }
2765
2766 buffer_write(0x82);
2767 buffer_write(high_output);
2768 buffer_write(high_direction);
2769 }
2770
2771 static int ft2232_quit(void)
2772 {
2773 #if BUILD_FT2232_FTD2XX == 1
2774 FT_STATUS status;
2775
2776 status = FT_Close(ftdih);
2777 #elif BUILD_FT2232_LIBFTDI == 1
2778 ftdi_usb_close(&ftdic);
2779
2780 ftdi_deinit(&ftdic);
2781 #endif
2782
2783 free(ft2232_buffer);
2784 ft2232_buffer = NULL;
2785
2786 return ERROR_OK;
2787 }
2788
2789 static int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
2790 {
2791 char *cp;
2792 char buf[200];
2793 if (argc == 1)
2794 {
2795 ft2232_device_desc = strdup(args[0]);
2796 cp = strchr(ft2232_device_desc, 0);
2797 /* under Win32, the FTD2XX driver appends an "A" to the end
2798 * of the description, this examines the given desc
2799 * and creates the 'missing' _A or non_A variable. */
2800 if ((cp[-1] == 'A') && (cp[-2]==' ')) {
2801 /* it was, so make this the "A" version. */
2802 ft2232_device_desc_A = ft2232_device_desc;
2803 /* and *CREATE* the non-A version. */
2804 strcpy(buf, ft2232_device_desc);
2805 cp = strchr(buf, 0);
2806 cp[-2] = 0;
2807 ft2232_device_desc = strdup(buf);
2808 } else {
2809 /* <space > A not defined
2810 * so create it */
2811 sprintf(buf, "%s A", ft2232_device_desc);
2812 ft2232_device_desc_A = strdup(buf);
2813 }
2814 }
2815 else
2816 {
2817 LOG_ERROR("expected exactly one argument to ft2232_device_desc <description>");
2818 }
2819
2820 return ERROR_OK;
2821 }
2822
2823 static int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
2824 {
2825 if (argc == 1)
2826 {
2827 ft2232_serial = strdup(args[0]);
2828 }
2829 else
2830 {
2831 LOG_ERROR("expected exactly one argument to ft2232_serial <serial-number>");
2832 }
2833
2834 return ERROR_OK;
2835 }
2836
2837 static int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
2838 {
2839 if (argc == 0)
2840 return ERROR_OK;
2841
2842 ft2232_layout = malloc(strlen(args[0]) + 1);
2843 strcpy(ft2232_layout, args[0]);
2844
2845 return ERROR_OK;
2846 }
2847
2848 static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
2849 {
2850 if (argc > MAX_USB_IDS * 2)
2851 {
2852 LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
2853 "(maximum is %d pairs)", MAX_USB_IDS);
2854 argc = MAX_USB_IDS * 2;
2855 }
2856 if (argc < 2 || (argc & 1))
2857 {
2858 LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
2859 if (argc < 2)
2860 return ERROR_COMMAND_SYNTAX_ERROR;
2861 /* remove the incomplete trailing id */
2862 argc -= 1;
2863 }
2864
2865 int i;
2866 int retval = ERROR_OK;
2867 for (i = 0; i < argc; i += 2)
2868 {
2869 retval = parse_u16(args[i], &ft2232_vid[i >> 1]);
2870 if (ERROR_OK != retval)
2871 break;
2872 retval = parse_u16(args[i + 1], &ft2232_pid[i >> 1]);
2873 if (ERROR_OK != retval)
2874 break;
2875 }
2876
2877 /*
2878 * Explicitly terminate, in case there are multiples instances of
2879 * ft2232_vid_pid.
2880 */
2881 ft2232_vid[i >> 1] = ft2232_pid[i >> 1] = 0;
2882
2883 return retval;
2884 }
2885
2886 static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
2887 {
2888 if (argc == 1)
2889 {
2890 ft2232_latency = atoi(args[0]);
2891 }
2892 else
2893 {
2894 LOG_ERROR("expected exactly one argument to ft2232_latency <ms>");
2895 }
2896
2897 return ERROR_OK;
2898 }
2899
2900 static int ft2232_stableclocks(int num_cycles, jtag_command_t* cmd)
2901 {
2902 int retval = 0;
2903
2904 /* 7 bits of either ones or zeros. */
2905 uint8_t tms = (tap_get_state() == TAP_RESET ? 0x7F : 0x00);
2906
2907 while (num_cycles > 0)
2908 {
2909 /* the command 0x4b, "Clock Data to TMS/CS Pin (no Read)" handles
2910 * at most 7 bits per invocation. Here we invoke it potentially
2911 * several times.
2912 */
2913 int bitcount_per_command = (num_cycles > 7) ? 7 : num_cycles;
2914
2915 if (ft2232_buffer_size + 3 >= FT2232_BUFFER_SIZE)
2916 {
2917 if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
2918 retval = ERROR_JTAG_QUEUE_FAILED;
2919
2920 first_unsent = cmd;
2921 }
2922
2923 /* there are no state transitions in this code, so omit state tracking */
2924
2925 /* command "Clock Data to TMS/CS Pin (no Read)" */
2926 buffer_write(0x4b);
2927
2928 /* scan 7 bit */
2929 buffer_write(bitcount_per_command - 1);
2930
2931 /* TMS data bits are either all zeros or ones to stay in the current stable state */
2932 buffer_write(tms);
2933
2934 require_send = 1;
2935
2936 num_cycles -= bitcount_per_command;
2937 }
2938
2939 return retval;
2940 }
2941
2942 /* ---------------------------------------------------------------------
2943 * Support for IceBear JTAG adapter from Section5:
2944 * http://section5.ch/icebear
2945 *
2946 * Author: Sten, debian@sansys-electronic.com
2947 */
2948
2949 /* Icebear pin layout
2950 *
2951 * ADBUS5 (nEMU) nSRST | 2 1| GND (10k->VCC)
2952 * GND GND | 4 3| n.c.
2953 * ADBUS3 TMS | 6 5| ADBUS6 VCC
2954 * ADBUS0 TCK | 8 7| ADBUS7 (GND)
2955 * ADBUS4 nTRST |10 9| ACBUS0 (GND)
2956 * ADBUS1 TDI |12 11| ACBUS1 (GND)
2957 * ADBUS2 TDO |14 13| GND GND
2958 *
2959 * ADBUS0 O L TCK ACBUS0 GND
2960 * ADBUS1 O L TDI ACBUS1 GND
2961 * ADBUS2 I TDO ACBUS2 n.c.
2962 * ADBUS3 O H TMS ACBUS3 n.c.
2963 * ADBUS4 O H nTRST
2964 * ADBUS5 O H nSRST
2965 * ADBUS6 - VCC
2966 * ADBUS7 - GND
2967 */
2968 static int icebear_jtag_init(void) {
2969 uint8_t buf[3];
2970 uint32_t bytes_written;
2971
2972 low_direction = 0x0b; /* output: TCK TDI TMS; input: TDO */
2973 low_output = 0x08; /* high: TMS; low: TCK TDI */
2974 nTRST = 0x10;
2975 nSRST = 0x20;
2976
2977 enum reset_types jtag_reset_config = jtag_get_reset_config();
2978 if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0) {
2979 low_direction &= ~nTRST; /* nTRST high impedance */
2980 }
2981 else {
2982 low_direction |= nTRST;
2983 low_output |= nTRST;
2984 }
2985
2986 low_direction |= nSRST;
2987 low_output |= nSRST;
2988
2989 /* initialize low byte for jtag */
2990 buf[0] = 0x80; /* command "set data bits low byte" */
2991 buf[1] = low_output;
2992 buf[2] = low_direction;
2993 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
2994
2995 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) {
2996 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)");
2997 return ERROR_JTAG_INIT_FAILED;
2998 }
2999
3000 high_output = 0x0;
3001 high_direction = 0x00;
3002
3003
3004 /* initialize high port */
3005 buf[0] = 0x82; /* command "set data bits high byte" */
3006 buf[1] = high_output; /* value */
3007 buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */
3008 LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
3009
3010 if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) {
3011 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)");
3012 return ERROR_JTAG_INIT_FAILED;
3013 }
3014
3015 return ERROR_OK;
3016 }
3017
3018 static void icebear_jtag_reset(int trst, int srst) {
3019
3020 if (trst == 1) {
3021 low_direction |= nTRST;
3022 low_output &= ~nTRST;
3023 }
3024 else if (trst == 0) {
3025 enum reset_types jtag_reset_config = jtag_get_reset_config();
3026 if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0)
3027 low_direction &= ~nTRST;
3028 else
3029 low_output |= nTRST;
3030 }
3031
3032 if (srst == 1) {
3033 low_output &= ~nSRST;
3034 }
3035 else if (srst == 0) {
3036 low_output |= nSRST;
3037 }
3038
3039 /* command "set data bits low byte" */
3040 buffer_write(0x80);
3041 buffer_write(low_output);
3042 buffer_write(low_direction);
3043
3044 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
3045 }

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)