1 /***************************************************************************
2 * Copyright (C) 2004, 2006 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
8 * Copyright (C) 2009 by SoftPLC Corporation. http://softplc.com *
9 * Dick Hollenbeck <dick@softplc.com> *
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. *
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. *
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 ***************************************************************************/
27 /* This code uses information contained in the MPSSE specification which was
29 * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
30 * Hereafter this is called the "MPSSE Spec".
32 * The datasheet for the ftdichip.com's FT2232D part is here:
33 * http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
40 /* project specific includes */
41 #include "interface.h"
43 #include "time_support.h"
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"
57 /* FT2232 access library includes */
58 #if BUILD_FT2232_FTD2XX == 1
60 #elif BUILD_FT2232_LIBFTDI == 1
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 */
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 };
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);
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
);
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.
98 * @param num_cycles The number of clocks cycles to send.
99 * @param cmd The command to send.
101 * @returns ERROR_OK on success, or ERROR_JTAG_QUEUE_FAILED on failure.
103 static int ft2232_stableclocks(int num_cycles
, jtag_command_t
* cmd
);
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
;
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 };
117 typedef struct ft2232_layout_s
121 void (*reset
)(int trst
, int srst
);
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);
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
);
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);
155 static const ft2232_layout_t ft2232_layouts
[] =
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
},
176 static uint8_t nTRST
, nTRSTnOE
, nSRST
, nSRSTnOE
;
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;
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
;
192 static jtag_command_t
* first_unsent
; /* next command that has to be sent */
193 static int require_send
;
195 /* http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
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."
204 #define FT2232_BUFFER_SIZE 131072
205 a comment would have been nice.
208 #define FT2232_BUFFER_SIZE 131072
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;
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.
220 static inline void buffer_write(uint8_t val
)
222 assert(ft2232_buffer
);
223 assert((unsigned) ft2232_buffer_size
< (unsigned) FT2232_BUFFER_SIZE
);
224 ft2232_buffer
[ft2232_buffer_size
++] = val
;
228 * Function buffer_read
229 * returns a byte from the byte buffer.
231 static inline uint8_t buffer_read(void)
233 assert(ft2232_buffer
);
234 assert(ft2232_read_pointer
< ft2232_buffer_size
);
235 return ft2232_buffer
[ft2232_read_pointer
++];
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().
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.
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.
253 * See the MPSSE spec referenced above.
255 static void clock_tms(uint8_t mpsse_cmd
, int tms_bits
, int tms_count
, bool tdi_bit
)
259 int tms_ndx
; /* bit index into tms_byte */
261 assert(tms_count
> 0);
264 LOG_DEBUG("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d", mpsse_cmd
, tms_bits
, tms_count
);
267 for (tms_byte
= tms_ndx
= i
= 0; i
< tms_count
; ++i
, tms_bits
>>=1)
269 bool bit
= tms_bits
& 1;
272 tms_byte
|= (1 << tms_ndx
);
274 /* always do state transitions in public view */
275 tap_set_state(tap_state_transition(tap_get_state(), bit
));
277 /* we wrote a bit to tms_byte just above, increment bit index. if bit was zero
282 if (tms_ndx
== 7 || i
== tms_count
-1)
284 buffer_write(mpsse_cmd
);
285 buffer_write(tms_ndx
- 1);
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.
290 buffer_write(tms_byte
| (tdi_bit
<< 7));
296 * Function get_tms_buffer_requirements
297 * returns what clock_tms() will consume if called with
300 static inline int get_tms_buffer_requirements(int bit_count
)
302 return ((bit_count
+ 6)/7) * 3;
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().
311 * @param goal_state is the destination state for the move.
313 static void move_to_state(tap_state_t goal_state
)
315 tap_state_t start_state
= tap_get_state();
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
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
);
326 DEBUG_JTAG_IO("start=%s goal=%s", tap_state_name(start_state
), tap_state_name(goal_state
));
328 clock_tms(0x4b, tms_bits
, tms_count
, 0);
331 jtag_interface_t ft2232_interface
=
334 .execute_queue
= ft2232_execute_queue
,
335 .speed
= ft2232_speed
,
336 .speed_div
= ft2232_speed_div
,
338 .register_commands
= ft2232_register_commands
,
343 static int ft2232_write(uint8_t* buf
, int size
, uint32_t* bytes_written
)
345 #if BUILD_FT2232_FTD2XX == 1
347 DWORD dw_bytes_written
;
348 if ((status
= FT_Write(ftdih
, buf
, size
, &dw_bytes_written
)) != FT_OK
)
350 *bytes_written
= dw_bytes_written
;
351 LOG_ERROR("FT_Write returned: %lu", status
);
352 return ERROR_JTAG_DEVICE_ERROR
;
356 *bytes_written
= dw_bytes_written
;
359 #elif BUILD_FT2232_LIBFTDI == 1
361 if ((retval
= ftdi_write_data(&ftdic
, buf
, size
)) < 0)
364 LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic
));
365 return ERROR_JTAG_DEVICE_ERROR
;
369 *bytes_written
= retval
;
375 static int ft2232_read(uint8_t* buf
, uint32_t size
, uint32_t* bytes_read
)
377 #if BUILD_FT2232_FTD2XX == 1
383 while ((*bytes_read
< size
) && timeout
--)
385 if ((status
= FT_Read(ftdih
, buf
+ *bytes_read
, size
-
386 *bytes_read
, &dw_bytes_read
)) != FT_OK
)
389 LOG_ERROR("FT_Read returned: %lu", status
);
390 return ERROR_JTAG_DEVICE_ERROR
;
392 *bytes_read
+= dw_bytes_read
;
395 #elif BUILD_FT2232_LIBFTDI == 1
400 while ((*bytes_read
< size
) && timeout
--)
402 if ((retval
= ftdi_read_data(&ftdic
, buf
+ *bytes_read
, size
- *bytes_read
)) < 0)
405 LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic
));
406 return ERROR_JTAG_DEVICE_ERROR
;
408 *bytes_read
+= retval
;
413 if (*bytes_read
< size
)
415 LOG_ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)",
416 (unsigned int)(*bytes_read
),
418 return ERROR_JTAG_DEVICE_ERROR
;
424 static bool ft2232_device_is_highspeed(void)
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
);
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
439 static int ft2232h_ft4232h_adaptive_clocking(bool enable
)
441 uint8_t buf
= enable
? 0x96 : 0x97;
442 LOG_DEBUG("%2.2x", buf
);
444 uint32_t bytes_written
;
445 int retval
= ft2232_write(&buf
, 1, &bytes_written
);
446 if ((ERROR_OK
!= retval
) || (bytes_written
!= 1))
448 LOG_ERROR("couldn't write command to %s adaptive clocking"
449 , enable
? "enable" : "disable");
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.
461 static int ft2232h_ft4232h_clk_divide_by_5(bool enable
)
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))
468 LOG_ERROR("couldn't write command to %s clk divide by 5"
469 , enable
? "enable" : "disable");
470 return ERROR_JTAG_INIT_FAILED
;
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
);
478 static int ft2232_speed(int speed
)
482 uint32_t bytes_written
;
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
)
490 LOG_ERROR("ft2232 device %lu does not support RTCK"
491 , (long unsigned int)ftdi_device
);
495 if ((enable_adaptive_clocking
) || (ERROR_OK
!= retval
))
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 */
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))
505 LOG_ERROR("couldn't set FT2232 TCK speed");
512 static int ft2232_speed_div(int speed
, int* khz
)
514 /* Take a look in the FT2232 manual,
515 * AN2232C-01 Command Processor for
516 * MPSSE and MCU Host Bus. Chapter 3.8 */
518 *khz
= (RTCK_SPEED
== speed
) ? 0 : ft2232_max_tck
/ (1 + speed
);
523 static int ft2232_khz(int khz
, int* jtag_speed
)
527 if (ft2232_device_is_highspeed())
529 *jtag_speed
= RTCK_SPEED
;
534 LOG_DEBUG("RCLK not supported");
539 /* Take a look in the FT2232 manual,
540 * AN2232C-01 Command Processor for
541 * MPSSE and MCU Host Bus. Chapter 3.8
543 * We will calc here with a multiplier
544 * of 10 for better rounding later. */
546 /* Calc speed, (ft2232_max_tck / khz) - 1 */
547 /* Use 65000 for better rounding */
548 *jtag_speed
= ((ft2232_max_tck
*10) / khz
) - 10;
550 /* Add 0.9 for rounding */
553 /* Calc real speed */
554 *jtag_speed
= *jtag_speed
/ 10;
556 /* Check if speed is greater than 0 */
562 /* Check max value */
563 if (*jtag_speed
> 0xFFFF)
565 *jtag_speed
= 0xFFFF;
571 static int ft2232_register_commands(struct command_context_s
* cmd_ctx
)
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");
586 static void ft2232_end_state(tap_state_t state
)
588 if (tap_is_state_stable(state
))
589 tap_set_end_state(state
);
592 LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state
));
597 static void ft2232_read_scan(enum scan_type type
, uint8_t* buffer
, int scan_size
)
599 int num_bytes
= (scan_size
+ 7) / 8;
600 int bits_left
= scan_size
;
603 while (num_bytes
-- > 1)
605 buffer
[cur_byte
++] = buffer_read();
609 buffer
[cur_byte
] = 0x0;
611 /* There is one more partial byte left from the clock data in/out instructions */
614 buffer
[cur_byte
] = buffer_read() >> 1;
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
);
620 static void ft2232_debug_dump_buffer(void)
626 for (i
= 0; i
< ft2232_buffer_size
; i
++)
628 line_p
+= snprintf(line_p
, 256 - (line_p
- line
), "%2.2x ", ft2232_buffer
[i
]);
631 LOG_DEBUG("%s", line
);
637 LOG_DEBUG("%s", line
);
640 static int ft2232_send_and_recv(jtag_command_t
* first
, jtag_command_t
* last
)
647 uint32_t bytes_written
= 0;
648 uint32_t bytes_read
= 0;
650 #ifdef _DEBUG_USB_IO_
651 struct timeval start
, inter
, inter2
, end
;
652 struct timeval d_inter
, d_inter2
, d_end
;
655 #ifdef _DEBUG_USB_COMMS_
656 LOG_DEBUG("write buffer (size %i):", ft2232_buffer_size
);
657 ft2232_debug_dump_buffer();
660 #ifdef _DEBUG_USB_IO_
661 gettimeofday(&start
, NULL
);
664 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
666 LOG_ERROR("couldn't write MPSSE commands to FT2232");
670 #ifdef _DEBUG_USB_IO_
671 gettimeofday(&inter
, NULL
);
674 if (ft2232_expect_read
)
677 ft2232_buffer_size
= 0;
679 #ifdef _DEBUG_USB_IO_
680 gettimeofday(&inter2
, NULL
);
683 if ((retval
= ft2232_read(ft2232_buffer
, ft2232_expect_read
, &bytes_read
)) != ERROR_OK
)
685 LOG_ERROR("couldn't read from FT2232");
689 #ifdef _DEBUG_USB_IO_
690 gettimeofday(&end
, NULL
);
692 timeval_subtract(&d_inter
, &inter
, &start
);
693 timeval_subtract(&d_inter2
, &inter2
, &start
);
694 timeval_subtract(&d_end
, &end
, &start
);
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
);
702 ft2232_buffer_size
= bytes_read
;
704 if (ft2232_expect_read
!= ft2232_buffer_size
)
706 LOG_ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read
,
709 ft2232_debug_dump_buffer();
714 #ifdef _DEBUG_USB_COMMS_
715 LOG_DEBUG("read buffer (%i retries): %i bytes", 100 - timeout
, ft2232_buffer_size
);
716 ft2232_debug_dump_buffer();
720 ft2232_expect_read
= 0;
721 ft2232_read_pointer
= 0;
723 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
724 * that wasn't handled by a caller-provided error handler
734 type
= jtag_scan_type(cmd
->cmd
.scan
);
735 if (type
!= SCAN_OUT
)
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
;
753 ft2232_buffer_size
= 0;
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.
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
767 static void ft2232_add_pathmove(tap_state_t
* path
, int num_states
)
771 assert((unsigned) num_states
<= 32u); /* tms_bits only holds 32 bits */
773 /* this loop verifies that the path is legal and logs each state in the path */
776 unsigned char tms_byte
= 0; /* zero this on each MPSSE batch */
780 int num_states_batch
= num_states
> 7 ? 7 : num_states
;
782 /* command "Clock Data to TMS/CS Pin (no Read)" */
785 /* number of states remaining */
786 buffer_write(num_states_batch
- 1);
788 while (num_states_batch
--)
790 if (tap_state_transition(tap_get_state(), false) == path
[state_count
])
791 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x0);
792 else if (tap_state_transition(tap_get_state(), true) == path
[state_count
])
793 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x1);
796 LOG_ERROR( "BUG: %s -> %s isn't a valid TAP transition", tap_state_name(
797 tap_get_state() ), tap_state_name(path
[state_count
]) );
801 tap_set_state(path
[state_count
]);
806 buffer_write(tms_byte
);
808 tap_set_end_state(tap_get_state());
811 static void ft2232_add_scan(bool ir_scan
, enum scan_type type
, uint8_t* buffer
, int scan_size
)
813 int num_bytes
= (scan_size
+ 7) / 8;
814 int bits_left
= scan_size
;
820 if (tap_get_state() != TAP_DRSHIFT
)
822 move_to_state(TAP_DRSHIFT
);
827 if (tap_get_state() != TAP_IRSHIFT
)
829 move_to_state(TAP_IRSHIFT
);
833 /* add command for complete bytes */
834 while (num_bytes
> 1)
839 /* Clock Data Bytes In and Out LSB First */
841 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
843 else if (type
== SCAN_OUT
)
845 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
847 /* LOG_DEBUG("added TDI bytes (o)"); */
849 else if (type
== SCAN_IN
)
851 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
853 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
856 thisrun_bytes
= (num_bytes
> 65537) ? 65536 : (num_bytes
- 1);
857 num_bytes
-= thisrun_bytes
;
859 buffer_write((uint8_t) (thisrun_bytes
- 1));
860 buffer_write((uint8_t) ((thisrun_bytes
- 1) >> 8));
864 /* add complete bytes */
865 while (thisrun_bytes
-- > 0)
867 buffer_write(buffer
[cur_byte
++]);
871 else /* (type == SCAN_IN) */
873 bits_left
-= 8 * (thisrun_bytes
);
877 /* the most signifcant bit is scanned during TAP movement */
879 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
883 /* process remaining bits but the last one */
888 /* Clock Data Bits In and Out LSB First */
890 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
892 else if (type
== SCAN_OUT
)
894 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
896 /* LOG_DEBUG("added TDI bits (o)"); */
898 else if (type
== SCAN_IN
)
900 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
902 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
905 buffer_write(bits_left
- 2);
907 buffer_write(buffer
[cur_byte
]);
910 if ((ir_scan
&& (tap_get_end_state() == TAP_IRSHIFT
))
911 || (!ir_scan
&& (tap_get_end_state() == TAP_DRSHIFT
)))
915 /* Clock Data Bits In and Out LSB First */
917 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
919 else if (type
== SCAN_OUT
)
921 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
923 /* LOG_DEBUG("added TDI bits (o)"); */
925 else if (type
== SCAN_IN
)
927 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
929 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
932 buffer_write(last_bit
);
940 /* move from Shift-IR/DR to end state */
941 if (type
!= SCAN_OUT
)
943 /* We always go to the PAUSE state in two step at the end of an IN or IO scan */
944 /* This must be coordinated with the bit shifts in ft2232_read_scan */
947 /* Clock Data to TMS/CS Pin with Read */
949 /* LOG_DEBUG("added TMS scan (read)"); */
953 tms_bits
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
954 tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
955 /* Clock Data to TMS/CS Pin (no Read) */
957 /* LOG_DEBUG("added TMS scan (no read)"); */
960 clock_tms(mpsse_cmd
, tms_bits
, tms_count
, last_bit
);
963 if (tap_get_state() != tap_get_end_state())
965 move_to_state(tap_get_end_state());
969 static int ft2232_large_scan(scan_command_t
* cmd
, enum scan_type type
, uint8_t* buffer
, int scan_size
)
971 int num_bytes
= (scan_size
+ 7) / 8;
972 int bits_left
= scan_size
;
975 uint8_t* receive_buffer
= malloc(CEIL(scan_size
, 8));
976 uint8_t* receive_pointer
= receive_buffer
;
977 uint32_t bytes_written
;
980 int thisrun_read
= 0;
984 LOG_ERROR("BUG: large IR scans are not supported");
988 if (tap_get_state() != TAP_DRSHIFT
)
990 move_to_state(TAP_DRSHIFT
);
993 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
995 LOG_ERROR("couldn't write MPSSE commands to FT2232");
998 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
999 ft2232_buffer_size
, (int)bytes_written
);
1000 ft2232_buffer_size
= 0;
1002 /* add command for complete bytes */
1003 while (num_bytes
> 1)
1007 if (type
== SCAN_IO
)
1009 /* Clock Data Bytes In and Out LSB First */
1011 /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
1013 else if (type
== SCAN_OUT
)
1015 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
1017 /* LOG_DEBUG("added TDI bytes (o)"); */
1019 else if (type
== SCAN_IN
)
1021 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
1023 /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
1026 thisrun_bytes
= (num_bytes
> 65537) ? 65536 : (num_bytes
- 1);
1027 thisrun_read
= thisrun_bytes
;
1028 num_bytes
-= thisrun_bytes
;
1029 buffer_write((uint8_t) (thisrun_bytes
- 1));
1030 buffer_write((uint8_t) ((thisrun_bytes
- 1) >> 8));
1032 if (type
!= SCAN_IN
)
1034 /* add complete bytes */
1035 while (thisrun_bytes
-- > 0)
1037 buffer_write(buffer
[cur_byte
]);
1042 else /* (type == SCAN_IN) */
1044 bits_left
-= 8 * (thisrun_bytes
);
1047 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
1049 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1052 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1054 (int)bytes_written
);
1055 ft2232_buffer_size
= 0;
1057 if (type
!= SCAN_OUT
)
1059 if ((retval
= ft2232_read(receive_pointer
, thisrun_read
, &bytes_read
)) != ERROR_OK
)
1061 LOG_ERROR("couldn't read from FT2232");
1064 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1067 receive_pointer
+= bytes_read
;
1073 /* the most signifcant bit is scanned during TAP movement */
1074 if (type
!= SCAN_IN
)
1075 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
1079 /* process remaining bits but the last one */
1082 if (type
== SCAN_IO
)
1084 /* Clock Data Bits In and Out LSB First */
1086 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1088 else if (type
== SCAN_OUT
)
1090 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1092 /* LOG_DEBUG("added TDI bits (o)"); */
1094 else if (type
== SCAN_IN
)
1096 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1098 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1100 buffer_write(bits_left
- 2);
1101 if (type
!= SCAN_IN
)
1102 buffer_write(buffer
[cur_byte
]);
1104 if (type
!= SCAN_OUT
)
1108 if (tap_get_end_state() == TAP_DRSHIFT
)
1110 if (type
== SCAN_IO
)
1112 /* Clock Data Bits In and Out LSB First */
1114 /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
1116 else if (type
== SCAN_OUT
)
1118 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
1120 /* LOG_DEBUG("added TDI bits (o)"); */
1122 else if (type
== SCAN_IN
)
1124 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
1126 /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
1129 buffer_write(last_bit
);
1133 int tms_bits
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
1134 int tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1137 /* move from Shift-IR/DR to end state */
1138 if (type
!= SCAN_OUT
)
1140 /* Clock Data to TMS/CS Pin with Read */
1142 /* LOG_DEBUG("added TMS scan (read)"); */
1146 /* Clock Data to TMS/CS Pin (no Read) */
1148 /* LOG_DEBUG("added TMS scan (no read)"); */
1151 clock_tms(mpsse_cmd
, tms_bits
, tms_count
, last_bit
);
1154 if (type
!= SCAN_OUT
)
1157 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
1159 LOG_ERROR("couldn't write MPSSE commands to FT2232");
1162 LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
1164 (int)bytes_written
);
1165 ft2232_buffer_size
= 0;
1167 if (type
!= SCAN_OUT
)
1169 if ((retval
= ft2232_read(receive_pointer
, thisrun_read
, &bytes_read
)) != ERROR_OK
)
1171 LOG_ERROR("couldn't read from FT2232");
1174 LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
1177 receive_pointer
+= bytes_read
;
1183 static int ft2232_predict_scan_out(int scan_size
, enum scan_type type
)
1185 int predicted_size
= 3;
1186 int num_bytes
= (scan_size
- 1) / 8;
1188 if (tap_get_state() != TAP_DRSHIFT
)
1189 predicted_size
+= get_tms_buffer_requirements(tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT
));
1191 if (type
== SCAN_IN
) /* only from device to host */
1193 /* complete bytes */
1194 predicted_size
+= CEIL(num_bytes
, 65536) * 3;
1196 /* remaining bits - 1 (up to 7) */
1197 predicted_size
+= ((scan_size
- 1) % 8) ? 2 : 0;
1199 else /* host to device, or bidirectional */
1201 /* complete bytes */
1202 predicted_size
+= num_bytes
+ CEIL(num_bytes
, 65536) * 3;
1204 /* remaining bits -1 (up to 7) */
1205 predicted_size
+= ((scan_size
- 1) % 8) ? 3 : 0;
1208 return predicted_size
;
1211 static int ft2232_predict_scan_in(int scan_size
, enum scan_type type
)
1213 int predicted_size
= 0;
1215 if (type
!= SCAN_OUT
)
1217 /* complete bytes */
1218 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) - 1) : 0;
1220 /* remaining bits - 1 */
1221 predicted_size
+= ((scan_size
- 1) % 8) ? 1 : 0;
1223 /* last bit (from TMS scan) */
1224 predicted_size
+= 1;
1227 /* LOG_DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size); */
1229 return predicted_size
;
1232 static void usbjtag_reset(int trst
, int srst
)
1234 enum reset_types jtag_reset_config
= jtag_get_reset_config();
1237 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1238 low_direction
|= nTRSTnOE
; /* switch to output pin (output is low) */
1240 low_output
&= ~nTRST
; /* switch output low */
1244 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1245 low_direction
&= ~nTRSTnOE
; /* switch to input pin (high-Z + internal and external pullup) */
1247 low_output
|= nTRST
; /* switch output high */
1252 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1253 low_output
&= ~nSRST
; /* switch output low */
1255 low_direction
|= nSRSTnOE
; /* switch to output pin (output is low) */
1259 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1260 low_output
|= nSRST
; /* switch output high */
1262 low_direction
&= ~nSRSTnOE
; /* switch to input pin (high-Z) */
1265 /* command "set data bits low byte" */
1267 buffer_write(low_output
);
1268 buffer_write(low_direction
);
1271 static void jtagkey_reset(int trst
, int srst
)
1273 enum reset_types jtag_reset_config
= jtag_get_reset_config();
1276 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1277 high_output
&= ~nTRSTnOE
;
1279 high_output
&= ~nTRST
;
1283 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1284 high_output
|= nTRSTnOE
;
1286 high_output
|= nTRST
;
1291 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1292 high_output
&= ~nSRST
;
1294 high_output
&= ~nSRSTnOE
;
1298 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1299 high_output
|= nSRST
;
1301 high_output
|= nSRSTnOE
;
1304 /* command "set data bits high byte" */
1306 buffer_write(high_output
);
1307 buffer_write(high_direction
);
1308 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
,
1312 static void olimex_jtag_reset(int trst
, int srst
)
1314 enum reset_types jtag_reset_config
= jtag_get_reset_config();
1317 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1318 high_output
&= ~nTRSTnOE
;
1320 high_output
&= ~nTRST
;
1324 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1325 high_output
|= nTRSTnOE
;
1327 high_output
|= nTRST
;
1332 high_output
|= nSRST
;
1336 high_output
&= ~nSRST
;
1339 /* command "set data bits high byte" */
1341 buffer_write(high_output
);
1342 buffer_write(high_direction
);
1343 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
,
1347 static void axm0432_jtag_reset(int trst
, int srst
)
1351 tap_set_state(TAP_RESET
);
1352 high_output
&= ~nTRST
;
1356 high_output
|= nTRST
;
1361 high_output
&= ~nSRST
;
1365 high_output
|= nSRST
;
1368 /* command "set data bits low byte" */
1370 buffer_write(high_output
);
1371 buffer_write(high_direction
);
1372 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
,
1376 static void flyswatter_reset(int trst
, int srst
)
1380 low_output
&= ~nTRST
;
1384 low_output
|= nTRST
;
1389 low_output
|= nSRST
;
1393 low_output
&= ~nSRST
;
1396 /* command "set data bits low byte" */
1398 buffer_write(low_output
);
1399 buffer_write(low_direction
);
1400 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst
, srst
, low_output
, low_direction
);
1403 static void turtle_reset(int trst
, int srst
)
1409 low_output
|= nSRST
;
1413 low_output
&= ~nSRST
;
1416 /* command "set data bits low byte" */
1418 buffer_write(low_output
);
1419 buffer_write(low_direction
);
1420 LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst
, low_output
, low_direction
);
1423 static void comstick_reset(int trst
, int srst
)
1427 high_output
&= ~nTRST
;
1431 high_output
|= nTRST
;
1436 high_output
&= ~nSRST
;
1440 high_output
|= nSRST
;
1443 /* command "set data bits high byte" */
1445 buffer_write(high_output
);
1446 buffer_write(high_direction
);
1447 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
,
1451 static void stm32stick_reset(int trst
, int srst
)
1455 high_output
&= ~nTRST
;
1459 high_output
|= nTRST
;
1464 low_output
&= ~nSRST
;
1468 low_output
|= nSRST
;
1471 /* command "set data bits low byte" */
1473 buffer_write(low_output
);
1474 buffer_write(low_direction
);
1476 /* command "set data bits high byte" */
1478 buffer_write(high_output
);
1479 buffer_write(high_direction
);
1480 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
,
1484 static void sheevaplug_reset(int trst
, int srst
)
1487 high_output
&= ~nTRST
;
1489 high_output
|= nTRST
;
1492 high_output
&= ~nSRSTnOE
;
1494 high_output
|= nSRSTnOE
;
1496 /* command "set data bits high byte" */
1498 buffer_write(high_output
);
1499 buffer_write(high_direction
);
1500 LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
1503 static int ft2232_execute_runtest(jtag_command_t
*cmd
)
1507 int predicted_size
= 0;
1510 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
1511 cmd
->cmd
.runtest
->num_cycles
,
1512 tap_state_name(cmd
->cmd
.runtest
->end_state
));
1514 /* only send the maximum buffer size that FT2232C can handle */
1516 if (tap_get_state() != TAP_IDLE
)
1517 predicted_size
+= 3;
1518 predicted_size
+= 3 * CEIL(cmd
->cmd
.runtest
->num_cycles
, 7);
1519 if (cmd
->cmd
.runtest
->end_state
!= TAP_IDLE
)
1520 predicted_size
+= 3;
1521 if (tap_get_end_state() != TAP_IDLE
)
1522 predicted_size
+= 3;
1523 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1525 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1526 retval
= ERROR_JTAG_QUEUE_FAILED
;
1530 if (tap_get_state() != TAP_IDLE
)
1532 move_to_state(TAP_IDLE
);
1535 i
= cmd
->cmd
.runtest
->num_cycles
;
1538 /* there are no state transitions in this code, so omit state tracking */
1540 /* command "Clock Data to TMS/CS Pin (no Read)" */
1544 buffer_write((i
> 7) ? 6 : (i
- 1));
1548 tap_set_state(TAP_IDLE
);
1550 i
-= (i
> 7) ? 7 : i
;
1551 /* LOG_DEBUG("added TMS scan (no read)"); */
1554 ft2232_end_state(cmd
->cmd
.runtest
->end_state
);
1556 if (tap_get_state() != tap_get_end_state())
1558 move_to_state(tap_get_end_state());
1562 #ifdef _DEBUG_JTAG_IO_
1563 LOG_DEBUG("runtest: %i, end in %s", cmd
->cmd
.runtest
->num_cycles
, tap_state_name(tap_get_end_state()));
1569 static int ft2232_execute_statemove(jtag_command_t
*cmd
)
1571 int predicted_size
= 0;
1572 int retval
= ERROR_OK
;
1574 DEBUG_JTAG_IO("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
1576 /* only send the maximum buffer size that FT2232C can handle */
1578 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1580 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1581 retval
= ERROR_JTAG_QUEUE_FAILED
;
1585 ft2232_end_state(cmd
->cmd
.statemove
->end_state
);
1587 /* move to end state */
1588 if (tap_get_state() != tap_get_end_state())
1590 move_to_state(tap_get_end_state());
1597 static int ft2232_execute_pathmove(jtag_command_t
*cmd
)
1599 int predicted_size
= 0;
1600 int retval
= ERROR_OK
;
1602 tap_state_t
* path
= cmd
->cmd
.pathmove
->path
;
1603 int num_states
= cmd
->cmd
.pathmove
->num_states
;
1605 DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states
,
1606 tap_state_name(tap_get_state()),
1607 tap_state_name(path
[num_states
-1]));
1609 /* only send the maximum buffer size that FT2232C can handle */
1610 predicted_size
= 3 * CEIL(num_states
, 7);
1611 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1613 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1614 retval
= ERROR_JTAG_QUEUE_FAILED
;
1620 ft2232_add_pathmove(path
, num_states
);
1626 static int ft2232_execute_scan(jtag_command_t
*cmd
)
1629 int scan_size
; /* size of IR or DR scan */
1630 int predicted_size
= 0;
1631 int retval
= ERROR_OK
;
1633 enum scan_type type
= jtag_scan_type(cmd
->cmd
.scan
);
1635 DEBUG_JTAG_IO("%s type:%d", cmd
->cmd
.scan
->ir_scan
? "IRSCAN" : "DRSCAN", type
);
1637 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
1639 predicted_size
= ft2232_predict_scan_out(scan_size
, type
);
1640 if ((predicted_size
+ 1) > FT2232_BUFFER_SIZE
)
1642 LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
1643 /* unsent commands before this */
1644 if (first_unsent
!= cmd
)
1645 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1646 retval
= ERROR_JTAG_QUEUE_FAILED
;
1648 /* current command */
1649 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
1650 ft2232_large_scan(cmd
->cmd
.scan
, type
, buffer
, scan_size
);
1652 first_unsent
= cmd
->next
;
1657 else if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1659 LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
1662 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1663 retval
= ERROR_JTAG_QUEUE_FAILED
;
1667 ft2232_expect_read
+= ft2232_predict_scan_in(scan_size
, type
);
1668 /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */
1669 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
1670 ft2232_add_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
1674 #ifdef _DEBUG_JTAG_IO_
1675 LOG_DEBUG("%s scan, %i bits, end in %s", (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
,
1676 tap_state_name(tap_get_end_state()));
1682 static int ft2232_execute_reset(jtag_command_t
*cmd
)
1685 int predicted_size
= 0;
1688 DEBUG_JTAG_IO("reset trst: %i srst %i",
1689 cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
1691 /* only send the maximum buffer size that FT2232C can handle */
1693 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1695 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1696 retval
= ERROR_JTAG_QUEUE_FAILED
;
1701 layout
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
1704 #ifdef _DEBUG_JTAG_IO_
1705 LOG_DEBUG("trst: %i, srst: %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
1710 static int ft2232_execute_sleep(jtag_command_t
*cmd
)
1715 DEBUG_JTAG_IO("sleep %i", cmd
->cmd
.sleep
->us
);
1717 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1718 retval
= ERROR_JTAG_QUEUE_FAILED
;
1719 first_unsent
= cmd
->next
;
1720 jtag_sleep(cmd
->cmd
.sleep
->us
);
1721 #ifdef _DEBUG_JTAG_IO_
1722 LOG_DEBUG("sleep %i usec while in %s", cmd
->cmd
.sleep
->us
, tap_state_name(tap_get_state()));
1728 static int ft2232_execute_stableclocks(jtag_command_t
*cmd
)
1733 /* this is only allowed while in a stable state. A check for a stable
1734 * state was done in jtag_add_clocks()
1736 if (ft2232_stableclocks(cmd
->cmd
.stableclocks
->num_cycles
, cmd
) != ERROR_OK
)
1737 retval
= ERROR_JTAG_QUEUE_FAILED
;
1738 #ifdef _DEBUG_JTAG_IO_
1739 LOG_DEBUG("clocks %i while in %s", cmd
->cmd
.stableclocks
->num_cycles
, tap_state_name(tap_get_state()));
1745 static int ft2232_execute_command(jtag_command_t
*cmd
)
1752 case JTAG_RESET
: retval
= ft2232_execute_reset(cmd
); break;
1753 case JTAG_RUNTEST
: retval
= ft2232_execute_runtest(cmd
); break;
1754 case JTAG_STATEMOVE
: retval
= ft2232_execute_statemove(cmd
); break;
1755 case JTAG_PATHMOVE
: retval
= ft2232_execute_pathmove(cmd
); break;
1756 case JTAG_SCAN
: retval
= ft2232_execute_scan(cmd
); break;
1757 case JTAG_SLEEP
: retval
= ft2232_execute_sleep(cmd
); break;
1758 case JTAG_STABLECLOCKS
: retval
= ft2232_execute_stableclocks(cmd
); break;
1760 LOG_ERROR("BUG: unknown JTAG command type encountered");
1766 static int ft2232_execute_queue()
1768 jtag_command_t
* cmd
= jtag_command_queue
; /* currently processed command */
1771 first_unsent
= cmd
; /* next command that has to be sent */
1774 /* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
1775 * that wasn't handled by a caller-provided error handler
1779 ft2232_buffer_size
= 0;
1780 ft2232_expect_read
= 0;
1782 /* blink, if the current layout has that feature */
1788 if (ft2232_execute_command(cmd
) != ERROR_OK
)
1789 retval
= ERROR_JTAG_QUEUE_FAILED
;
1790 /* Start reading input before FT2232 TX buffer fills up */
1792 if (ft2232_expect_read
> 256)
1794 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1795 retval
= ERROR_JTAG_QUEUE_FAILED
;
1800 if (require_send
> 0)
1801 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
1802 retval
= ERROR_JTAG_QUEUE_FAILED
;
1807 #if BUILD_FT2232_FTD2XX == 1
1808 static int ft2232_init_ftd2xx(uint16_t vid
, uint16_t pid
, int more
, int* try_more
)
1812 char SerialNumber
[16];
1813 char Description
[64];
1814 DWORD openex_flags
= 0;
1815 char* openex_string
= NULL
;
1816 uint8_t latency_timer
;
1818 LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)", ft2232_layout
, vid
, pid
);
1821 /* Add non-standard Vid/Pid to the linux driver */
1822 if ((status
= FT_SetVIDPID(vid
, pid
)) != FT_OK
)
1824 LOG_WARNING("couldn't add %4.4x:%4.4x", vid
, pid
);
1828 if (ft2232_device_desc
&& ft2232_serial
)
1830 LOG_WARNING("can't open by device description and serial number, giving precedence to serial");
1831 ft2232_device_desc
= NULL
;
1834 if (ft2232_device_desc
)
1836 openex_string
= ft2232_device_desc
;
1837 openex_flags
= FT_OPEN_BY_DESCRIPTION
;
1839 else if (ft2232_serial
)
1841 openex_string
= ft2232_serial
;
1842 openex_flags
= FT_OPEN_BY_SERIAL_NUMBER
;
1846 LOG_ERROR("neither device description nor serial number specified");
1847 LOG_ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
1849 return ERROR_JTAG_INIT_FAILED
;
1852 status
= FT_OpenEx(openex_string
, openex_flags
, &ftdih
);
1853 if (status
!= FT_OK
) {
1854 /* under Win32, the FTD2XX driver appends an "A" to the end
1855 * of the description, if we tried by the desc, then
1856 * try by the alternate "A" description. */
1857 if (openex_string
== ft2232_device_desc
) {
1858 /* Try the alternate method. */
1859 openex_string
= ft2232_device_desc_A
;
1860 status
= FT_OpenEx(openex_string
, openex_flags
, &ftdih
);
1861 if (status
== FT_OK
) {
1862 /* yea, the "alternate" method worked! */
1864 /* drat, give the user a meaningfull message.
1865 * telling the use we tried *BOTH* methods. */
1866 LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n",
1868 ft2232_device_desc_A
);
1873 if (status
!= FT_OK
)
1879 LOG_WARNING("unable to open ftdi device (trying more): %lu", status
);
1881 return ERROR_JTAG_INIT_FAILED
;
1883 LOG_ERROR("unable to open ftdi device: %lu", status
);
1884 status
= FT_ListDevices(&num_devices
, NULL
, FT_LIST_NUMBER_ONLY
);
1885 if (status
== FT_OK
)
1887 char** desc_array
= malloc(sizeof(char*) * (num_devices
+ 1));
1890 for (i
= 0; i
< num_devices
; i
++)
1891 desc_array
[i
] = malloc(64);
1893 desc_array
[num_devices
] = NULL
;
1895 status
= FT_ListDevices(desc_array
, &num_devices
, FT_LIST_ALL
| openex_flags
);
1897 if (status
== FT_OK
)
1899 LOG_ERROR("ListDevices: %lu\n", num_devices
);
1900 for (i
= 0; i
< num_devices
; i
++)
1901 LOG_ERROR("%" PRIu32
": \"%s\"", i
, desc_array
[i
]);
1904 for (i
= 0; i
< num_devices
; i
++)
1905 free(desc_array
[i
]);
1911 LOG_ERROR("ListDevices: NONE\n");
1913 return ERROR_JTAG_INIT_FAILED
;
1916 if ((status
= FT_SetLatencyTimer(ftdih
, ft2232_latency
)) != FT_OK
)
1918 LOG_ERROR("unable to set latency timer: %lu", status
);
1919 return ERROR_JTAG_INIT_FAILED
;
1922 if ((status
= FT_GetLatencyTimer(ftdih
, &latency_timer
)) != FT_OK
)
1924 LOG_ERROR("unable to get latency timer: %lu", status
);
1925 return ERROR_JTAG_INIT_FAILED
;
1929 LOG_DEBUG("current latency timer: %i", latency_timer
);
1932 if ((status
= FT_SetTimeouts(ftdih
, 5000, 5000)) != FT_OK
)
1934 LOG_ERROR("unable to set timeouts: %lu", status
);
1935 return ERROR_JTAG_INIT_FAILED
;
1938 if ((status
= FT_SetBitMode(ftdih
, 0x0b, 2)) != FT_OK
)
1940 LOG_ERROR("unable to enable bit i/o mode: %lu", status
);
1941 return ERROR_JTAG_INIT_FAILED
;
1944 if ((status
= FT_GetDeviceInfo(ftdih
, &ftdi_device
, &deviceID
, SerialNumber
, Description
, NULL
)) != FT_OK
)
1946 LOG_ERROR("unable to get FT_GetDeviceInfo: %lu", status
);
1947 return ERROR_JTAG_INIT_FAILED
;
1951 static const char* type_str
[] =
1952 {"BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H"};
1953 unsigned no_of_known_types
= sizeof(type_str
) / sizeof(type_str
[0]) - 1;
1954 unsigned type_index
= ((unsigned)ftdi_device
<= no_of_known_types
)
1955 ? ftdi_device
: FT_DEVICE_UNKNOWN
;
1956 LOG_INFO("device: %lu \"%s\"", ftdi_device
, type_str
[type_index
]);
1957 LOG_INFO("deviceID: %lu", deviceID
);
1958 LOG_INFO("SerialNumber: %s", SerialNumber
);
1959 LOG_INFO("Description: %s", Description
);
1965 static int ft2232_purge_ftd2xx(void)
1969 if ((status
= FT_Purge(ftdih
, FT_PURGE_RX
| FT_PURGE_TX
)) != FT_OK
)
1971 LOG_ERROR("error purging ftd2xx device: %lu", status
);
1972 return ERROR_JTAG_INIT_FAILED
;
1978 #endif /* BUILD_FT2232_FTD2XX == 1 */
1980 #if BUILD_FT2232_LIBFTDI == 1
1981 static int ft2232_init_libftdi(uint16_t vid
, uint16_t pid
, int more
, int* try_more
)
1983 uint8_t latency_timer
;
1985 LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
1986 ft2232_layout
, vid
, pid
);
1988 if (ftdi_init(&ftdic
) < 0)
1989 return ERROR_JTAG_INIT_FAILED
;
1991 if (ftdi_set_interface(&ftdic
, INTERFACE_A
) < 0)
1993 LOG_ERROR("unable to select FT2232 channel A: %s", ftdic
.error_str
);
1994 return ERROR_JTAG_INIT_FAILED
;
1997 /* context, vendor id, product id */
1998 if (ftdi_usb_open_desc(&ftdic
, vid
, pid
, ft2232_device_desc
,
2002 LOG_WARNING("unable to open ftdi device (trying more): %s",
2005 LOG_ERROR("unable to open ftdi device: %s", ftdic
.error_str
);
2007 return ERROR_JTAG_INIT_FAILED
;
2010 /* There is already a reset in ftdi_usb_open_desc, this should be redundant */
2011 if (ftdi_usb_reset(&ftdic
) < 0)
2013 LOG_ERROR("unable to reset ftdi device");
2014 return ERROR_JTAG_INIT_FAILED
;
2017 if (ftdi_set_latency_timer(&ftdic
, ft2232_latency
) < 0)
2019 LOG_ERROR("unable to set latency timer");
2020 return ERROR_JTAG_INIT_FAILED
;
2023 if (ftdi_get_latency_timer(&ftdic
, &latency_timer
) < 0)
2025 LOG_ERROR("unable to get latency timer");
2026 return ERROR_JTAG_INIT_FAILED
;
2030 LOG_DEBUG("current latency timer: %i", latency_timer
);
2033 ftdi_set_bitmode(&ftdic
, 0x0b, 2); /* ctx, JTAG I/O mask */
2035 ftdi_device
= ftdic
.type
;
2036 static const char* type_str
[] =
2037 {"AM", "BM", "2232C", "R", "2232H", "4232H", "Unknown"};
2038 unsigned no_of_known_types
= sizeof(type_str
) / sizeof(type_str
[0]) - 1;
2039 unsigned type_index
= ((unsigned)ftdi_device
< no_of_known_types
)
2040 ? ftdi_device
: no_of_known_types
;
2041 LOG_DEBUG("FTDI chip type: %i \"%s\"", (int)ftdi_device
, type_str
[type_index
]);
2045 static int ft2232_purge_libftdi(void)
2047 if (ftdi_usb_purge_buffers(&ftdic
) < 0)
2049 LOG_ERROR("ftdi_purge_buffers: %s", ftdic
.error_str
);
2050 return ERROR_JTAG_INIT_FAILED
;
2056 #endif /* BUILD_FT2232_LIBFTDI == 1 */
2058 static int ft2232_init(void)
2062 uint32_t bytes_written
;
2063 const ft2232_layout_t
* cur_layout
= ft2232_layouts
;
2066 if (tap_get_tms_path_len(TAP_IRPAUSE
,TAP_IRPAUSE
) == 7)
2068 LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
2072 LOG_DEBUG("ft2232 interface using shortest path jtag state transitions");
2075 if ((ft2232_layout
== NULL
) || (ft2232_layout
[0] == 0))
2077 ft2232_layout
= "usbjtag";
2078 LOG_WARNING("No ft2232 layout specified, using default 'usbjtag'");
2081 while (cur_layout
->name
)
2083 if (strcmp(cur_layout
->name
, ft2232_layout
) == 0)
2085 layout
= cur_layout
;
2093 LOG_ERROR("No matching layout found for %s", ft2232_layout
);
2094 return ERROR_JTAG_INIT_FAILED
;
2100 * "more indicates that there are more IDs to try, so we should
2101 * not print an error for an ID mismatch (but for anything
2104 * try_more indicates that the error code returned indicates an
2105 * ID mismatch (and nothing else) and that we should proceeed
2106 * with the next ID pair.
2108 int more
= ft2232_vid
[i
+ 1] || ft2232_pid
[i
+ 1];
2111 #if BUILD_FT2232_FTD2XX == 1
2112 retval
= ft2232_init_ftd2xx(ft2232_vid
[i
], ft2232_pid
[i
],
2114 #elif BUILD_FT2232_LIBFTDI == 1
2115 retval
= ft2232_init_libftdi(ft2232_vid
[i
], ft2232_pid
[i
],
2120 if (!more
|| !try_more
)
2124 ft2232_buffer_size
= 0;
2125 ft2232_buffer
= malloc(FT2232_BUFFER_SIZE
);
2127 if (layout
->init() != ERROR_OK
)
2128 return ERROR_JTAG_INIT_FAILED
;
2130 if (ft2232_device_is_highspeed())
2132 #ifndef BUILD_FT2232_HIGHSPEED
2133 #if BUILD_FT2232_FTD2XX == 1
2134 LOG_WARNING("High Speed device found - You need a newer FTD2XX driver (version 2.04.16 or later)");
2135 #elif BUILD_FT2232_LIBFTDI == 1
2136 LOG_WARNING("High Speed device found - You need a newer libftdi version (0.16 or later)");
2139 /* make sure the legacy mode is disabled */
2140 if (ft2232h_ft4232h_clk_divide_by_5(false) != ERROR_OK
)
2141 return ERROR_JTAG_INIT_FAILED
;
2144 ft2232_speed(jtag_get_speed());
2146 buf
[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
2147 if (((retval
= ft2232_write(buf
, 1, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 1))
2149 LOG_ERROR("couldn't write to FT2232 to disable loopback");
2150 return ERROR_JTAG_INIT_FAILED
;
2153 #if BUILD_FT2232_FTD2XX == 1
2154 return ft2232_purge_ftd2xx();
2155 #elif BUILD_FT2232_LIBFTDI == 1
2156 return ft2232_purge_libftdi();
2162 static int usbjtag_init(void)
2165 uint32_t bytes_written
;
2168 low_direction
= 0x0b;
2170 if (strcmp(ft2232_layout
, "usbjtag") == 0)
2177 else if (strcmp(ft2232_layout
, "signalyzer") == 0)
2184 else if (strcmp(ft2232_layout
, "evb_lm3s811") == 0)
2191 low_direction
= 0x8b;
2193 else if (strcmp(ft2232_layout
, "luminary_icdi") == 0)
2200 low_direction
= 0xcb;
2204 LOG_ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout
);
2205 return ERROR_JTAG_INIT_FAILED
;
2208 enum reset_types jtag_reset_config
= jtag_get_reset_config();
2209 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
2211 low_direction
&= ~nTRSTnOE
; /* nTRST input */
2212 low_output
&= ~nTRST
; /* nTRST = 0 */
2216 low_direction
|= nTRSTnOE
; /* nTRST output */
2217 low_output
|= nTRST
; /* nTRST = 1 */
2220 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
2222 low_direction
|= nSRSTnOE
; /* nSRST output */
2223 low_output
|= nSRST
; /* nSRST = 1 */
2227 low_direction
&= ~nSRSTnOE
; /* nSRST input */
2228 low_output
&= ~nSRST
; /* nSRST = 0 */
2231 /* initialize low byte for jtag */
2232 buf
[0] = 0x80; /* command "set data bits low byte" */
2233 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, xRST high) */
2234 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
2235 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2237 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2239 LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
2240 return ERROR_JTAG_INIT_FAILED
;
2246 static int axm0432_jtag_init(void)
2249 uint32_t bytes_written
;
2252 low_direction
= 0x2b;
2254 /* initialize low byte for jtag */
2255 buf
[0] = 0x80; /* command "set data bits low byte" */
2256 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2257 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2258 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2260 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2262 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2263 return ERROR_JTAG_INIT_FAILED
;
2266 if (strcmp(layout
->name
, "axm0432_jtag") == 0)
2269 nTRSTnOE
= 0x0; /* No output enable for TRST*/
2271 nSRSTnOE
= 0x0; /* No output enable for SRST*/
2275 LOG_ERROR("BUG: axm0432_jtag_init called for non axm0432 layout");
2280 high_direction
= 0x0c;
2282 enum reset_types jtag_reset_config
= jtag_get_reset_config();
2283 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
2285 LOG_ERROR("can't set nTRSTOE to push-pull on the Dicarlo jtag");
2289 high_output
|= nTRST
;
2292 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
2294 LOG_ERROR("can't set nSRST to push-pull on the Dicarlo jtag");
2298 high_output
|= nSRST
;
2301 /* initialize high port */
2302 buf
[0] = 0x82; /* command "set data bits high byte" */
2303 buf
[1] = high_output
; /* value */
2304 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
2305 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2307 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2309 LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
2310 return ERROR_JTAG_INIT_FAILED
;
2316 static int jtagkey_init(void)
2319 uint32_t bytes_written
;
2322 low_direction
= 0x1b;
2324 /* initialize low byte for jtag */
2325 buf
[0] = 0x80; /* command "set data bits low byte" */
2326 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2327 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2328 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2330 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2332 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2333 return ERROR_JTAG_INIT_FAILED
;
2336 if (strcmp(layout
->name
, "jtagkey") == 0)
2343 else if ((strcmp(layout
->name
, "jtagkey_prototype_v1") == 0)
2344 || (strcmp(layout
->name
, "oocdlink") == 0))
2353 LOG_ERROR("BUG: jtagkey_init called for non jtagkey layout");
2358 high_direction
= 0x0f;
2360 enum reset_types jtag_reset_config
= jtag_get_reset_config();
2361 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
2363 high_output
|= nTRSTnOE
;
2364 high_output
&= ~nTRST
;
2368 high_output
&= ~nTRSTnOE
;
2369 high_output
|= nTRST
;
2372 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
2374 high_output
&= ~nSRSTnOE
;
2375 high_output
|= nSRST
;
2379 high_output
|= nSRSTnOE
;
2380 high_output
&= ~nSRST
;
2383 /* initialize high port */
2384 buf
[0] = 0x82; /* command "set data bits high byte" */
2385 buf
[1] = high_output
; /* value */
2386 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
2387 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2389 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2391 LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
2392 return ERROR_JTAG_INIT_FAILED
;
2398 static int olimex_jtag_init(void)
2401 uint32_t bytes_written
;
2404 low_direction
= 0x1b;
2406 /* initialize low byte for jtag */
2407 buf
[0] = 0x80; /* command "set data bits low byte" */
2408 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2409 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2410 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2412 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2414 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2415 return ERROR_JTAG_INIT_FAILED
;
2421 nSRSTnOE
= 0x00; /* no output enable for nSRST */
2424 high_direction
= 0x0f;
2426 enum reset_types jtag_reset_config
= jtag_get_reset_config();
2427 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
2429 high_output
|= nTRSTnOE
;
2430 high_output
&= ~nTRST
;
2434 high_output
&= ~nTRSTnOE
;
2435 high_output
|= nTRST
;
2438 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
2440 LOG_ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
2444 high_output
&= ~nSRST
;
2447 /* turn red LED on */
2448 high_output
|= 0x08;
2450 /* initialize high port */
2451 buf
[0] = 0x82; /* command "set data bits high byte" */
2452 buf
[1] = high_output
; /* value */
2453 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
2454 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2456 if ((ft2232_write(buf
, 3, &bytes_written
) != ERROR_OK
) || (bytes_written
!= 3))
2458 LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
2459 return ERROR_JTAG_INIT_FAILED
;
2465 static int flyswatter_init(void)
2468 uint32_t bytes_written
;
2471 low_direction
= 0xfb;
2473 /* initialize low byte for jtag */
2474 buf
[0] = 0x80; /* command "set data bits low byte" */
2475 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2476 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE[12]=out, n[ST]srst = out */
2477 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2479 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2481 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2482 return ERROR_JTAG_INIT_FAILED
;
2486 nTRSTnOE
= 0x0; /* not output enable for nTRST */
2488 nSRSTnOE
= 0x00; /* no output enable for nSRST */
2491 high_direction
= 0x0c;
2493 /* turn red LED3 on, LED2 off */
2494 high_output
|= 0x08;
2496 /* initialize high port */
2497 buf
[0] = 0x82; /* command "set data bits high byte" */
2498 buf
[1] = high_output
; /* value */
2499 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
2500 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2502 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2504 LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
2505 return ERROR_JTAG_INIT_FAILED
;
2511 static int turtle_init(void)
2514 uint32_t bytes_written
;
2517 low_direction
= 0x5b;
2519 /* initialize low byte for jtag */
2520 buf
[0] = 0x80; /* command "set data bits low byte" */
2521 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2522 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2523 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2525 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2527 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2528 return ERROR_JTAG_INIT_FAILED
;
2534 high_direction
= 0x0C;
2536 /* initialize high port */
2537 buf
[0] = 0x82; /* command "set data bits high byte" */
2538 buf
[1] = high_output
;
2539 buf
[2] = high_direction
;
2540 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2542 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2544 LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
2545 return ERROR_JTAG_INIT_FAILED
;
2551 static int comstick_init(void)
2554 uint32_t bytes_written
;
2557 low_direction
= 0x0b;
2559 /* initialize low byte for jtag */
2560 buf
[0] = 0x80; /* command "set data bits low byte" */
2561 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2562 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2563 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2565 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2567 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2568 return ERROR_JTAG_INIT_FAILED
;
2572 nTRSTnOE
= 0x00; /* no output enable for nTRST */
2574 nSRSTnOE
= 0x00; /* no output enable for nSRST */
2577 high_direction
= 0x03;
2579 /* initialize high port */
2580 buf
[0] = 0x82; /* command "set data bits high byte" */
2581 buf
[1] = high_output
;
2582 buf
[2] = high_direction
;
2583 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2585 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2587 LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
2588 return ERROR_JTAG_INIT_FAILED
;
2594 static int stm32stick_init(void)
2597 uint32_t bytes_written
;
2600 low_direction
= 0x8b;
2602 /* initialize low byte for jtag */
2603 buf
[0] = 0x80; /* command "set data bits low byte" */
2604 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2605 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2606 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2608 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2610 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2611 return ERROR_JTAG_INIT_FAILED
;
2615 nTRSTnOE
= 0x00; /* no output enable for nTRST */
2617 nSRSTnOE
= 0x00; /* no output enable for nSRST */
2620 high_direction
= 0x03;
2622 /* initialize high port */
2623 buf
[0] = 0x82; /* command "set data bits high byte" */
2624 buf
[1] = high_output
;
2625 buf
[2] = high_direction
;
2626 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2628 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2630 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2631 return ERROR_JTAG_INIT_FAILED
;
2637 static int sheevaplug_init(void)
2640 uint32_t bytes_written
;
2643 low_direction
= 0x1b;
2645 /* initialize low byte for jtag */
2646 buf
[0] = 0x80; /* command "set data bits low byte" */
2647 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2648 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
2649 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2651 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2653 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2654 return ERROR_JTAG_INIT_FAILED
;
2663 high_direction
= 0x0f;
2665 /* nTRST is always push-pull */
2666 high_output
&= ~nTRSTnOE
;
2667 high_output
|= nTRST
;
2669 /* nSRST is always open-drain */
2670 high_output
|= nSRSTnOE
;
2671 high_output
&= ~nSRST
;
2673 /* initialize high port */
2674 buf
[0] = 0x82; /* command "set data bits high byte" */
2675 buf
[1] = high_output
; /* value */
2676 buf
[2] = high_direction
; /* all outputs - xRST */
2677 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2679 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2681 LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
2682 return ERROR_JTAG_INIT_FAILED
;
2688 static int cortino_jtag_init(void)
2691 uint32_t bytes_written
;
2694 low_direction
= 0x1b;
2696 /* initialize low byte for jtag */
2697 buf
[0] = 0x80; /* command "set data bits low byte" */
2698 buf
[1] = low_output
; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
2699 buf
[2] = low_direction
; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
2700 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2702 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2704 LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
2705 return ERROR_JTAG_INIT_FAILED
;
2709 nTRSTnOE
= 0x00; /* no output enable for nTRST */
2711 nSRSTnOE
= 0x00; /* no output enable for nSRST */
2714 high_direction
= 0x03;
2716 /* initialize high port */
2717 buf
[0] = 0x82; /* command "set data bits high byte" */
2718 buf
[1] = high_output
;
2719 buf
[2] = high_direction
;
2720 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
2722 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
2724 LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
2725 return ERROR_JTAG_INIT_FAILED
;
2731 static void olimex_jtag_blink(void)
2733 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
2734 * ACBUS3 is bit 3 of the GPIOH port
2736 if (high_output
& 0x08)
2738 /* set port pin high */
2739 high_output
&= 0x07;
2743 /* set port pin low */
2744 high_output
|= 0x08;
2748 buffer_write(high_output
);
2749 buffer_write(high_direction
);
2752 static void flyswatter_jtag_blink(void)
2755 * Flyswatter has two LEDs connected to ACBUS2 and ACBUS3
2757 high_output
^= 0x0c;
2760 buffer_write(high_output
);
2761 buffer_write(high_direction
);
2764 static void turtle_jtag_blink(void)
2767 * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
2769 if (high_output
& 0x08)
2779 buffer_write(high_output
);
2780 buffer_write(high_direction
);
2783 static int ft2232_quit(void)
2785 #if BUILD_FT2232_FTD2XX == 1
2788 status
= FT_Close(ftdih
);
2789 #elif BUILD_FT2232_LIBFTDI == 1
2790 ftdi_usb_close(&ftdic
);
2792 ftdi_deinit(&ftdic
);
2795 free(ft2232_buffer
);
2796 ft2232_buffer
= NULL
;
2801 static int ft2232_handle_device_desc_command(struct command_context_s
* cmd_ctx
, char* cmd
, char** args
, int argc
)
2807 ft2232_device_desc
= strdup(args
[0]);
2808 cp
= strchr(ft2232_device_desc
, 0);
2809 /* under Win32, the FTD2XX driver appends an "A" to the end
2810 * of the description, this examines the given desc
2811 * and creates the 'missing' _A or non_A variable. */
2812 if ((cp
[-1] == 'A') && (cp
[-2]==' ')) {
2813 /* it was, so make this the "A" version. */
2814 ft2232_device_desc_A
= ft2232_device_desc
;
2815 /* and *CREATE* the non-A version. */
2816 strcpy(buf
, ft2232_device_desc
);
2817 cp
= strchr(buf
, 0);
2819 ft2232_device_desc
= strdup(buf
);
2821 /* <space > A not defined
2823 sprintf(buf
, "%s A", ft2232_device_desc
);
2824 ft2232_device_desc_A
= strdup(buf
);
2829 LOG_ERROR("expected exactly one argument to ft2232_device_desc <description>");
2835 static int ft2232_handle_serial_command(struct command_context_s
* cmd_ctx
, char* cmd
, char** args
, int argc
)
2839 ft2232_serial
= strdup(args
[0]);
2843 LOG_ERROR("expected exactly one argument to ft2232_serial <serial-number>");
2849 static int ft2232_handle_layout_command(struct command_context_s
* cmd_ctx
, char* cmd
, char** args
, int argc
)
2854 ft2232_layout
= malloc(strlen(args
[0]) + 1);
2855 strcpy(ft2232_layout
, args
[0]);
2860 static int ft2232_handle_vid_pid_command(struct command_context_s
* cmd_ctx
, char* cmd
, char** args
, int argc
)
2862 if (argc
> MAX_USB_IDS
* 2)
2864 LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
2865 "(maximum is %d pairs)", MAX_USB_IDS
);
2866 argc
= MAX_USB_IDS
* 2;
2868 if (argc
< 2 || (argc
& 1))
2870 LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
2872 return ERROR_COMMAND_SYNTAX_ERROR
;
2873 /* remove the incomplete trailing id */
2878 int retval
= ERROR_OK
;
2879 for (i
= 0; i
< argc
; i
+= 2)
2881 retval
= parse_u16(args
[i
], &ft2232_vid
[i
>> 1]);
2882 if (ERROR_OK
!= retval
)
2884 retval
= parse_u16(args
[i
+ 1], &ft2232_pid
[i
>> 1]);
2885 if (ERROR_OK
!= retval
)
2890 * Explicitly terminate, in case there are multiples instances of
2893 ft2232_vid
[i
>> 1] = ft2232_pid
[i
>> 1] = 0;
2898 static int ft2232_handle_latency_command(struct command_context_s
* cmd_ctx
, char* cmd
, char** args
, int argc
)
2902 ft2232_latency
= atoi(args
[0]);
2906 LOG_ERROR("expected exactly one argument to ft2232_latency <ms>");
2912 static int ft2232_stableclocks(int num_cycles
, jtag_command_t
* cmd
)
2916 /* 7 bits of either ones or zeros. */
2917 uint8_t tms
= (tap_get_state() == TAP_RESET
? 0x7F : 0x00);
2919 while (num_cycles
> 0)
2921 /* the command 0x4b, "Clock Data to TMS/CS Pin (no Read)" handles
2922 * at most 7 bits per invocation. Here we invoke it potentially
2925 int bitcount_per_command
= (num_cycles
> 7) ? 7 : num_cycles
;
2927 if (ft2232_buffer_size
+ 3 >= FT2232_BUFFER_SIZE
)
2929 if (ft2232_send_and_recv(first_unsent
, cmd
) != ERROR_OK
)
2930 retval
= ERROR_JTAG_QUEUE_FAILED
;
2935 /* there are no state transitions in this code, so omit state tracking */
2937 /* command "Clock Data to TMS/CS Pin (no Read)" */
2941 buffer_write(bitcount_per_command
- 1);
2943 /* TMS data bits are either all zeros or ones to stay in the current stable state */
2948 num_cycles
-= bitcount_per_command
;
2954 /* ---------------------------------------------------------------------
2955 * Support for IceBear JTAG adapter from Section5:
2956 * http://section5.ch/icebear
2958 * Author: Sten, debian@sansys-electronic.com
2961 /* Icebear pin layout
2963 * ADBUS5 (nEMU) nSRST | 2 1| GND (10k->VCC)
2964 * GND GND | 4 3| n.c.
2965 * ADBUS3 TMS | 6 5| ADBUS6 VCC
2966 * ADBUS0 TCK | 8 7| ADBUS7 (GND)
2967 * ADBUS4 nTRST |10 9| ACBUS0 (GND)
2968 * ADBUS1 TDI |12 11| ACBUS1 (GND)
2969 * ADBUS2 TDO |14 13| GND GND
2971 * ADBUS0 O L TCK ACBUS0 GND
2972 * ADBUS1 O L TDI ACBUS1 GND
2973 * ADBUS2 I TDO ACBUS2 n.c.
2974 * ADBUS3 O H TMS ACBUS3 n.c.
2980 static int icebear_jtag_init(void) {
2982 uint32_t bytes_written
;
2984 low_direction
= 0x0b; /* output: TCK TDI TMS; input: TDO */
2985 low_output
= 0x08; /* high: TMS; low: TCK TDI */
2989 enum reset_types jtag_reset_config
= jtag_get_reset_config();
2990 if ((jtag_reset_config
& RESET_TRST_OPEN_DRAIN
) != 0) {
2991 low_direction
&= ~nTRST
; /* nTRST high impedance */
2994 low_direction
|= nTRST
;
2995 low_output
|= nTRST
;
2998 low_direction
|= nSRST
;
2999 low_output
|= nSRST
;
3001 /* initialize low byte for jtag */
3002 buf
[0] = 0x80; /* command "set data bits low byte" */
3003 buf
[1] = low_output
;
3004 buf
[2] = low_direction
;
3005 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
3007 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3)) {
3008 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)");
3009 return ERROR_JTAG_INIT_FAILED
;
3013 high_direction
= 0x00;
3016 /* initialize high port */
3017 buf
[0] = 0x82; /* command "set data bits high byte" */
3018 buf
[1] = high_output
; /* value */
3019 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
3020 LOG_DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
3022 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3)) {
3023 LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)");
3024 return ERROR_JTAG_INIT_FAILED
;
3030 static void icebear_jtag_reset(int trst
, int srst
) {
3033 low_direction
|= nTRST
;
3034 low_output
&= ~nTRST
;
3036 else if (trst
== 0) {
3037 enum reset_types jtag_reset_config
= jtag_get_reset_config();
3038 if ((jtag_reset_config
& RESET_TRST_OPEN_DRAIN
) != 0)
3039 low_direction
&= ~nTRST
;
3041 low_output
|= nTRST
;
3045 low_output
&= ~nSRST
;
3047 else if (srst
== 0) {
3048 low_output
|= nSRST
;
3051 /* command "set data bits low byte" */
3053 buffer_write(low_output
);
3054 buffer_write(low_direction
);
3056 LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst
, srst
, low_output
, low_direction
);
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)