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