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