jtag: remove libftdi enum-compare warning
[fw/openocd] / src / jtag / drivers / ft2232.c
index c7503f8a46c19bebaab118c7048d3c394091f6b6..6758dc790b54ffe56b8b3dd61d38225ffd46e9c8 100644 (file)
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
 
-/* This code uses information contained in the MPSSE specification which was
+/**
+ * @file
+ * JTAG adapters based on the FT2232 full and high speed USB parts are
+ * popular low cost JTAG debug solutions.  Many FT2232 based JTAG adapters
+ * are discrete, but development boards may integrate them as alternatives
+ * to more capable (and expensive) third party JTAG pods.
+ *
+ * JTAG uses only one of the two communications channels ("MPSSE engines")
+ * on these devices.  Adapters based on FT4232 parts have four ports/channels
+ * (A/B/C/D), instead of just two (A/B).
+ *
+ * Especially on development boards integrating one of these chips (as
+ * opposed to discrete pods/dongles), the additional channels can be used
+ * for a variety of purposes, but OpenOCD only uses one channel at a time.
+ *
+ *  - As a USB-to-serial adapter for the target's console UART ...
+ *    which may be able to support ROM boot loaders that load initial
+ *    firmware images to flash (or SRAM).
+ *
+ *  - On systems which support ARM's SWD in addition to JTAG, or instead
+ *    of it, that second port can be used for reading SWV/SWO trace data.
+ *
+ *  - Additional JTAG links, e.g. to a CPLD or * FPGA.
+ *
+ * FT2232 based JTAG adapters are "dumb" not "smart", because most JTAG
+ * request/response interactions involve round trips over the USB link.
+ * A "smart" JTAG adapter has intelligence close to the scan chain, so it
+ * can for example poll quickly for a status change (usually taking on the
+ * order of microseconds not milliseconds) before beginning a queued
+ * transaction which require the previous one to have completed.
+ *
+ * There are dozens of adapters of this type, differing in details which
+ * this driver needs to understand.  Those "layout" details are required
+ * as part of FT2232 driver configuration.
+ *
+ * This code uses information contained in the MPSSE specification which was
  * found here:
  * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
  * Hereafter this is called the "MPSSE Spec".
  *
  * The datasheet for the ftdichip.com's FT2232D part is here:
  * http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
+ *
+ * Also note the issue with code 0x4b (clock data to TMS) noted in
+ * http://developer.intra2net.com/mailarchive/html/libftdi/2009/msg00292.html
+ * which can affect longer JTAG state paths.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -41,8 +80,8 @@
 #endif
 
 /* project specific includes */
-#include "interface.h"
-#include <jtag/commands.h>
+#include <jtag/interface.h>
+#include <transport/transport.h>
 #include <helper/time_support.h>
 
 #if IS_CYGWIN == 1
 /* FT2232 access library includes */
 #if BUILD_FT2232_FTD2XX == 1
 #include <ftd2xx.h>
+#include "ftd2xx_common.h"
+
+enum ftdi_interface {
+       INTERFACE_ANY = 0,
+       INTERFACE_A   = 1,
+       INTERFACE_B   = 2,
+       INTERFACE_C   = 3,
+       INTERFACE_D   = 4
+};
+
 #elif BUILD_FT2232_LIBFTDI == 1
 #include <ftdi.h>
 #endif
 
 /* max TCK for the high speed devices 30000 kHz */
-#define        FTDI_2232H_4232H_MAX_TCK        30000
+#define        FTDI_x232H_MAX_TCK      30000
 /* max TCK for the full speed devices 6000 kHz */
-#define        FTDI_2232C_MAX_TCK 6000
+#define FTDI_2232C_MAX_TCK 6000
 /* this speed value tells that RTCK is requested */
 #define RTCK_SPEED -1
 
 
 #ifndef BUILD_FT2232_HIGHSPEED
  #if BUILD_FT2232_FTD2XX == 1
-       enum { FT_DEVICE_2232H = 6, FT_DEVICE_4232H };
+       enum { FT_DEVICE_2232H = 6, FT_DEVICE_4232H, FT_DEVICE_232H };
  #elif BUILD_FT2232_LIBFTDI == 1
-       enum { TYPE_2232H = 4, TYPE_4232H = 5 };
+       enum ftdi_chip_type { TYPE_2232H = 4, TYPE_4232H = 5, TYPE_232H = 6 };
  #endif
 #endif
 
  *
  * @returns ERROR_OK on success, or ERROR_JTAG_QUEUE_FAILED on failure.
  */
-static int ft2232_stableclocks(int num_cycles, struct jtag_commandcmd);
+static int ft2232_stableclocks(int num_cycles, struct jtag_command *cmd);
 
-static char *       ft2232_device_desc_A = NULL;
-static char*        ft2232_device_desc = NULL;
-static char*        ft2232_serial  = NULL;
-static char*        ft2232_layout  = NULL;
-static uint8_t         ft2232_latency = 2;
-static unsigned                ft2232_max_tck = FTDI_2232C_MAX_TCK;
+static char *ft2232_device_desc_A;
+static char *ft2232_device_desc;
+static char *ft2232_serial;
+static uint8_t ft2232_latency = 2;
+static unsigned ft2232_max_tck = FTDI_2232C_MAX_TCK;
 
 #define MAX_USB_IDS 8
 /* vid = pid = 0 marks the end of the list */
@@ -115,17 +163,22 @@ static uint16_t ft2232_vid[MAX_USB_IDS + 1] = { 0x0403, 0 };
 static uint16_t ft2232_pid[MAX_USB_IDS + 1] = { 0x6010, 0 };
 
 struct ft2232_layout {
-       charname;
+       char *name;
        int (*init)(void);
        void (*reset)(int trst, int srst);
        void (*blink)(void);
+       int channel;
 };
 
 /* init procedures for supported layouts */
 static int usbjtag_init(void);
 static int jtagkey_init(void);
+static int lm3s811_jtag_init(void);
+static int icdi_jtag_init(void);
 static int olimex_jtag_init(void);
-static int flyswatter_init(void);
+static int flyswatter1_init(void);
+static int flyswatter2_init(void);
+static int minimodule_init(void);
 static int turtle_init(void);
 static int comstick_init(void);
 static int stm32stick_init(void);
@@ -133,14 +186,22 @@ static int axm0432_jtag_init(void);
 static int sheevaplug_init(void);
 static int icebear_jtag_init(void);
 static int cortino_jtag_init(void);
+static int signalyzer_init(void);
 static int signalyzer_h_init(void);
 static int ktlink_init(void);
+static int redbee_init(void);
+static int lisa_l_init(void);
+static int flossjtag_init(void);
+static int xds100v2_init(void);
+static int digilent_hs1_init(void);
 
 /* reset procedures for supported layouts */
-static void usbjtag_reset(int trst, int srst);
+static void ftx23_reset(int trst, int srst);
 static void jtagkey_reset(int trst, int srst);
 static void olimex_jtag_reset(int trst, int srst);
-static void flyswatter_reset(int trst, int srst);
+static void flyswatter1_reset(int trst, int srst);
+static void flyswatter2_reset(int trst, int srst);
+static void minimodule_reset(int trst, int srst);
 static void turtle_reset(int trst, int srst);
 static void comstick_reset(int trst, int srst);
 static void stm32stick_reset(int trst, int srst);
@@ -149,55 +210,175 @@ static void sheevaplug_reset(int trst, int srst);
 static void icebear_jtag_reset(int trst, int srst);
 static void signalyzer_h_reset(int trst, int srst);
 static void ktlink_reset(int trst, int srst);
+static void redbee_reset(int trst, int srst);
+static void xds100v2_reset(int trst, int srst);
+static void digilent_hs1_reset(int trst, int srst);
 
 /* blink procedures for layouts that support a blinking led */
 static void olimex_jtag_blink(void);
-static void flyswatter_jtag_blink(void);
+static void flyswatter1_jtag_blink(void);
+static void flyswatter2_jtag_blink(void);
 static void turtle_jtag_blink(void);
 static void signalyzer_h_blink(void);
 static void ktlink_blink(void);
+static void lisa_l_blink(void);
+static void flossjtag_blink(void);
 
-static const struct ft2232_layout  ft2232_layouts[] =
-{
-       { "usbjtag",              usbjtag_init,              usbjtag_reset,      NULL                    },
-       { "jtagkey",              jtagkey_init,              jtagkey_reset,      NULL                    },
-       { "jtagkey_prototype_v1", jtagkey_init,              jtagkey_reset,      NULL                    },
-       { "oocdlink",             jtagkey_init,              jtagkey_reset,      NULL                    },
-       { "signalyzer",           usbjtag_init,              usbjtag_reset,      NULL                    },
-       { "evb_lm3s811",          usbjtag_init,              usbjtag_reset,      NULL                    },
-       { "luminary_icdi",        usbjtag_init,              usbjtag_reset,      NULL                    },
-       { "olimex-jtag",          olimex_jtag_init,          olimex_jtag_reset,  olimex_jtag_blink       },
-       { "flyswatter",           flyswatter_init,           flyswatter_reset,   flyswatter_jtag_blink   },
-       { "turtelizer2",          turtle_init,               turtle_reset,       turtle_jtag_blink       },
-       { "comstick",             comstick_init,             comstick_reset,     NULL                    },
-       { "stm32stick",           stm32stick_init,           stm32stick_reset,   NULL                    },
-       { "axm0432_jtag",         axm0432_jtag_init,         axm0432_jtag_reset, NULL                    },
-       { "sheevaplug",           sheevaplug_init,           sheevaplug_reset,   NULL                    },
-       { "icebear",              icebear_jtag_init,         icebear_jtag_reset, NULL                    },
-       { "cortino",              cortino_jtag_init,         comstick_reset, NULL                        },
-       { "signalyzer-h",         signalyzer_h_init,         signalyzer_h_reset, signalyzer_h_blink      },
-       { "ktlink",               ktlink_init,               ktlink_reset,       ktlink_blink            },
-       { NULL,                   NULL,                      NULL,               NULL                    },
+/* common transport support options */
+
+/* static const char *jtag_and_swd[] = { "jtag", "swd", NULL }; */
+
+static const struct ft2232_layout  ft2232_layouts[] = {
+       { .name = "usbjtag",
+               .init = usbjtag_init,
+               .reset = ftx23_reset,
+       },
+       { .name = "jtagkey",
+               .init = jtagkey_init,
+               .reset = jtagkey_reset,
+       },
+       { .name = "jtagkey_prototype_v1",
+               .init = jtagkey_init,
+               .reset = jtagkey_reset,
+       },
+       { .name = "oocdlink",
+               .init = jtagkey_init,
+               .reset = jtagkey_reset,
+       },
+       { .name = "signalyzer",
+               .init = signalyzer_init,
+               .reset = ftx23_reset,
+       },
+       { .name = "evb_lm3s811",
+               .init = lm3s811_jtag_init,
+               .reset = ftx23_reset,
+       },
+       { .name = "luminary_icdi",
+               .init = icdi_jtag_init,
+               .reset = ftx23_reset,
+       },
+       { .name = "olimex-jtag",
+               .init = olimex_jtag_init,
+               .reset = olimex_jtag_reset,
+               .blink = olimex_jtag_blink
+       },
+       { .name = "flyswatter",
+               .init = flyswatter1_init,
+               .reset = flyswatter1_reset,
+               .blink = flyswatter1_jtag_blink
+       },
+       { .name = "flyswatter2",
+               .init = flyswatter2_init,
+               .reset = flyswatter2_reset,
+               .blink = flyswatter2_jtag_blink
+       },
+       { .name = "minimodule",
+               .init = minimodule_init,
+               .reset = minimodule_reset,
+       },
+       { .name = "turtelizer2",
+               .init = turtle_init,
+               .reset = turtle_reset,
+               .blink = turtle_jtag_blink
+       },
+       { .name = "comstick",
+               .init = comstick_init,
+               .reset = comstick_reset,
+       },
+       { .name = "stm32stick",
+               .init = stm32stick_init,
+               .reset = stm32stick_reset,
+       },
+       { .name = "axm0432_jtag",
+               .init = axm0432_jtag_init,
+               .reset = axm0432_jtag_reset,
+       },
+       { .name = "sheevaplug",
+               .init = sheevaplug_init,
+               .reset = sheevaplug_reset,
+       },
+       { .name = "icebear",
+               .init = icebear_jtag_init,
+               .reset = icebear_jtag_reset,
+       },
+       { .name = "cortino",
+               .init = cortino_jtag_init,
+               .reset = comstick_reset,
+       },
+       { .name = "signalyzer-h",
+               .init = signalyzer_h_init,
+               .reset = signalyzer_h_reset,
+               .blink = signalyzer_h_blink
+       },
+       { .name = "ktlink",
+               .init = ktlink_init,
+               .reset = ktlink_reset,
+               .blink = ktlink_blink
+       },
+       { .name = "redbee-econotag",
+               .init = redbee_init,
+               .reset = redbee_reset,
+       },
+       { .name = "redbee-usb",
+               .init = redbee_init,
+               .reset = redbee_reset,
+               .channel = INTERFACE_B,
+       },
+       { .name = "lisa-l",
+               .init = lisa_l_init,
+               .reset = ftx23_reset,
+               .blink = lisa_l_blink,
+               .channel = INTERFACE_B,
+       },
+       { .name = "flossjtag",
+               .init = flossjtag_init,
+               .reset = ftx23_reset,
+               .blink = flossjtag_blink,
+       },
+       { .name = "xds100v2",
+               .init = xds100v2_init,
+               .reset = xds100v2_reset,
+       },
+       { .name = "digilent-hs1",
+               .init = digilent_hs1_init,
+               .reset = digilent_hs1_reset,
+               .channel = INTERFACE_A,
+       },
+       { .name = NULL, /* END OF TABLE */ },
 };
 
-static uint8_t                  nTRST, nTRSTnOE, nSRST, nSRSTnOE;
+/* bitmask used to drive nTRST; usually a GPIOLx signal */
+static uint8_t nTRST;
+static uint8_t nTRSTnOE;
+/* bitmask used to drive nSRST; usually a GPIOLx signal */
+static uint8_t nSRST;
+static uint8_t nSRSTnOE;
 
+/** the layout being used with this debug session */
 static const struct ft2232_layout *layout;
-static uint8_t                  low_output     = 0x0;
-static uint8_t                  low_direction  = 0x0;
-static uint8_t                  high_output    = 0x0;
-static uint8_t                  high_direction = 0x0;
+
+/** default bitmask values driven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
+static uint8_t low_output;
+
+/* note that direction bit == 1 means that signal is an output */
+
+/** default direction bitmask for DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
+static uint8_t low_direction;
+/** default value bitmask for CBUS GPIOH(0..4) */
+static uint8_t high_output;
+/** default direction bitmask for CBUS GPIOH(0..4) */
+static uint8_t high_direction;
 
 #if BUILD_FT2232_FTD2XX == 1
-static FT_HANDLE       ftdih = NULL;
-static FT_DEVICE       ftdi_device = 0;
+static FT_HANDLE ftdih;
+static FT_DEVICE ftdi_device;
 #elif BUILD_FT2232_LIBFTDI == 1
 static struct ftdi_context ftdic;
 static enum ftdi_chip_type ftdi_device;
 #endif
 
-static struct jtag_command* first_unsent;        /* next command that has to be sent */
-static int             require_send;
+static struct jtag_command *first_unsent;      /* next command that has to be sent */
+static int require_send;
 
 /*     http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
 
@@ -212,12 +393,18 @@ static int             require_send;
        a comment would have been nice.
 */
 
+#if BUILD_FT2232_FTD2XX == 1
+#define FT2232_BUFFER_READ_QUEUE_SIZE (64*64)
+#else
+#define FT2232_BUFFER_READ_QUEUE_SIZE (64*4)
+#endif
+
 #define FT2232_BUFFER_SIZE 131072
 
-static uint8_t*             ft2232_buffer = NULL;
-static int             ft2232_buffer_size  = 0;
-static int             ft2232_read_pointer = 0;
-static int             ft2232_expect_read  = 0;
+static uint8_t *ft2232_buffer;
+static int ft2232_buffer_size;
+static int ft2232_read_pointer;
+static int ft2232_expect_read;
 
 /**
  * Function buffer_write
@@ -261,17 +448,16 @@ static inline uint8_t buffer_read(void)
  */
 static void clock_tms(uint8_t mpsse_cmd, int tms_bits, int tms_count, bool tdi_bit)
 {
-       uint8_t tms_byte;
-       int     i;
-       int     tms_ndx;                                /* bit index into tms_byte */
+       uint8_t tms_byte;
+       int i;
+       int tms_ndx;    /* bit index into tms_byte */
 
        assert(tms_count > 0);
 
        DEBUG_JTAG_IO("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d",
-                       mpsse_cmd, tms_bits, tms_count);
+               mpsse_cmd, tms_bits, tms_count);
 
-       for (tms_byte = tms_ndx = i = 0;   i < tms_count;   ++i, tms_bits>>=1)
-       {
+       for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits >>= 1) {
                bool bit = tms_bits & 1;
 
                if (bit)
@@ -281,17 +467,16 @@ static void clock_tms(uint8_t mpsse_cmd, int tms_bits, int tms_count, bool tdi_b
                tap_set_state(tap_state_transition(tap_get_state(), bit));
 
                /*      we wrote a bit to tms_byte just above, increment bit index.  if bit was zero
-                       also increment.
+                * also increment.
                */
                ++tms_ndx;
 
-               if (tms_ndx == 7  || i == tms_count-1)
-               {
+               if (tms_ndx == 7 || i == tms_count-1) {
                        buffer_write(mpsse_cmd);
                        buffer_write(tms_ndx - 1);
 
                        /*      Bit 7 of the byte is passed on to TDI/DO before the first TCK/SK of
-                               TMS/CS and is held static for the duration of TMS/CS clocking.
+                        * TMS/CS and is held static for the duration of TMS/CS clocking.
                        */
                        buffer_write(tms_byte | (tdi_bit << 7));
                }
@@ -318,11 +503,10 @@ static inline int get_tms_buffer_requirements(int bit_count)
  */
 static void move_to_state(tap_state_t goal_state)
 {
-       tap_state_t     start_state = tap_get_state();
+       tap_state_t start_state = tap_get_state();
 
        /*      goal_state is 1/2 of a tuple/pair of states which allow convenient
-               lookup of the required TMS pattern to move to this state from the
-               start state.
+        * lookup of the required TMS pattern to move to this state from the start state.
        */
 
        /* do the 2 lookups */
@@ -334,39 +518,37 @@ static void move_to_state(tap_state_t goal_state)
        clock_tms(0x4b,  tms_bits, tms_count, 0);
 }
 
-static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written)
+static int ft2232_write(uint8_t *buf, int size, uint32_t *bytes_written)
 {
 #if BUILD_FT2232_FTD2XX == 1
        FT_STATUS status;
-       DWORD dw_bytes_written;
-       if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
-       {
+       DWORD dw_bytes_written = 0;
+       status = FT_Write(ftdih, buf, size, &dw_bytes_written);
+       if (status != FT_OK) {
                *bytes_written = dw_bytes_written;
-               LOG_ERROR("FT_Write returned: %lu", status);
+               LOG_ERROR("FT_Write returned: %s", ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
-       }
-       else
-       {
+       } else
                *bytes_written = dw_bytes_written;
-               return ERROR_OK;
-       }
+
 #elif BUILD_FT2232_LIBFTDI == 1
-       int retval;
-       if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0)
-       {
+       int retval = ftdi_write_data(&ftdic, buf, size);
+       if (retval < 0) {
                *bytes_written = 0;
                LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
                return ERROR_JTAG_DEVICE_ERROR;
-       }
-       else
-       {
+       } else
                *bytes_written = retval;
-               return ERROR_OK;
-       }
+
 #endif
+
+       if (*bytes_written != (uint32_t)size)
+               return ERROR_JTAG_DEVICE_ERROR;
+
+       return ERROR_OK;
 }
 
-static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
+static int ft2232_read(uint8_t *buf, uint32_t size, uint32_t *bytes_read)
 {
 #if BUILD_FT2232_FTD2XX == 1
        DWORD dw_bytes_read;
@@ -374,13 +556,12 @@ static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
        int timeout = 5;
        *bytes_read = 0;
 
-       while ((*bytes_read < size) && timeout--)
-       {
-               if ((status = FT_Read(ftdih, buf + *bytes_read, size -
-                                         *bytes_read, &dw_bytes_read)) != FT_OK)
-               {
+       while ((*bytes_read < size) && timeout--) {
+               status = FT_Read(ftdih, buf + *bytes_read, size -
+                               *bytes_read, &dw_bytes_read);
+               if (status != FT_OK) {
                        *bytes_read = 0;
-                       LOG_ERROR("FT_Read returned: %lu", status);
+                       LOG_ERROR("FT_Read returned: %s", ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
                *bytes_read += dw_bytes_read;
@@ -391,10 +572,9 @@ static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
        int timeout = LIBFTDI_READ_RETRY_COUNT;
        *bytes_read = 0;
 
-       while ((*bytes_read < size) && timeout--)
-       {
-               if ((retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read)) < 0)
-               {
+       while ((*bytes_read < size) && timeout--) {
+               retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read);
+               if (retval < 0) {
                        *bytes_read = 0;
                        LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic));
                        return ERROR_JTAG_DEVICE_ERROR;
@@ -404,12 +584,11 @@ static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
 
 #endif
 
-       if (*bytes_read < size)
-       {
+       if (*bytes_read < size) {
                LOG_ERROR("couldn't read enough bytes from "
-                               "FT2232 device (%i < %i)",
-                               (unsigned)*bytes_read,
-                               (unsigned)size);
+                       "FT2232 device (%i < %i)",
+                       (unsigned)*bytes_read,
+                       (unsigned)size);
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
@@ -419,27 +598,36 @@ static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
 static bool ft2232_device_is_highspeed(void)
 {
 #if BUILD_FT2232_FTD2XX == 1
-       return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H);
+       return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H)
+ #ifdef HAS_ENUM_FT232H
+               || (ftdi_device == FT_DEVICE_232H)
+ #endif
+       ;
 #elif BUILD_FT2232_LIBFTDI == 1
-       return (ftdi_device == TYPE_2232H || ftdi_device == TYPE_4232H);
+       return (ftdi_device == TYPE_2232H || ftdi_device == TYPE_4232H
+ #ifdef HAS_ENUM_FT232H
+               || ftdi_device == TYPE_232H
+ #endif
+       );
 #endif
 }
 
 /*
- * Commands that only apply to the FT2232H and FT4232H devices.
+ * Commands that only apply to the highspeed FTx232H devices (FT2232H, FT4232H, FT232H).
  * See chapter 6 in http://www.ftdichip.com/Documents/AppNotes/
  * AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf
  */
 
-static int ft2232h_ft4232h_adaptive_clocking(bool enable)
+static int ftx232h_adaptive_clocking(bool enable)
 {
        uint8_t buf = enable ? 0x96 : 0x97;
        LOG_DEBUG("%2.2x", buf);
 
        uint32_t bytes_written;
-       int retval = ft2232_write(&buf, 1, &bytes_written);
-       if ((ERROR_OK != retval) || (bytes_written != 1))
-       {
+       int retval;
+
+       retval = ft2232_write(&buf, sizeof(buf), &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't write command to %s adaptive clocking"
                        , enable ? "enable" : "disable");
                return retval;
@@ -453,18 +641,17 @@ static int ft2232h_ft4232h_adaptive_clocking(bool enable)
  * This result in a JTAG clock speed range of 91.553Hz-6MHz
  * respective 457.763Hz-30MHz.
  */
-static int ft2232h_ft4232h_clk_divide_by_5(bool enable)
+static int ftx232h_clk_divide_by_5(bool enable)
 {
        uint32_t bytes_written;
        uint8_t buf = enable ?  0x8b : 0x8a;
-       int retval = ft2232_write(&buf, 1, &bytes_written);
-       if ((ERROR_OK != retval) || (bytes_written != 1))
-       {
+
+       if (ft2232_write(&buf, sizeof(buf), &bytes_written) != ERROR_OK) {
                LOG_ERROR("couldn't write command to %s clk divide by 5"
                        , enable ? "enable" : "disable");
                return ERROR_JTAG_INIT_FAILED;
        }
-       ft2232_max_tck = enable ? FTDI_2232C_MAX_TCK : FTDI_2232H_4232H_MAX_TCK;
+       ft2232_max_tck = enable ? FTDI_2232C_MAX_TCK : FTDI_x232H_MAX_TCK;
        LOG_INFO("max TCK change to: %u kHz", ft2232_max_tck);
 
        return ERROR_OK;
@@ -479,9 +666,8 @@ static int ft2232_speed(int speed)
        retval = ERROR_OK;
        bool enable_adaptive_clocking = (RTCK_SPEED == speed);
        if (ft2232_device_is_highspeed())
-               retval = ft2232h_ft4232h_adaptive_clocking(enable_adaptive_clocking);
-       else if (enable_adaptive_clocking)
-       {
+               retval = ftx232h_adaptive_clocking(enable_adaptive_clocking);
+       else if (enable_adaptive_clocking) {
                LOG_ERROR("ft2232 device %lu does not support RTCK"
                        , (long unsigned int)ftdi_device);
                return ERROR_FAIL;
@@ -495,8 +681,8 @@ static int ft2232_speed(int speed)
        buf[2] = (speed >> 8) & 0xff;   /* valueH */
 
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-       if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       retval = ft2232_write(buf, sizeof(buf), &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't set FT2232 TCK speed");
                return retval;
        }
@@ -504,7 +690,7 @@ static int ft2232_speed(int speed)
        return ERROR_OK;
 }
 
-static int ft2232_speed_div(int speed, intkhz)
+static int ft2232_speed_div(int speed, int *khz)
 {
        /* Take a look in the FT2232 manual,
         * AN2232C-01 Command Processor for
@@ -515,17 +701,13 @@ static int ft2232_speed_div(int speed, int* khz)
        return ERROR_OK;
 }
 
-static int ft2232_khz(int khz, intjtag_speed)
+static int ft2232_khz(int khz, int *jtag_speed)
 {
-       if (khz == 0)
-       {
-               if (ft2232_device_is_highspeed())
-               {
+       if (khz == 0) {
+               if (ft2232_device_is_highspeed()) {
                        *jtag_speed = RTCK_SPEED;
                        return ERROR_OK;
-               }
-               else
-               {
+               } else {
                        LOG_DEBUG("RCLK not supported");
                        return ERROR_FAIL;
                }
@@ -538,8 +720,8 @@ static int ft2232_khz(int khz, int* jtag_speed)
         * We will calc here with a multiplier
         * of 10 for better rounding later. */
 
-       /* Calc speed, (ft2232_max_tck / khz) - 1 */
-       /* Use 65000 for better rounding */
+       /* Calc speed, (ft2232_max_tck / khz) - 1
+        * Use 65000 for better rounding */
        *jtag_speed = ((ft2232_max_tck*10) / khz) - 10;
 
        /* Add 0.9 for rounding */
@@ -550,15 +732,11 @@ static int ft2232_khz(int khz, int* jtag_speed)
 
        /* Check if speed is greater than 0 */
        if (*jtag_speed < 0)
-       {
                *jtag_speed = 0;
-       }
 
        /* Check max value */
        if (*jtag_speed > 0xFFFF)
-       {
                *jtag_speed = 0xFFFF;
-       }
 
        return ERROR_OK;
 }
@@ -567,21 +745,19 @@ static void ft2232_end_state(tap_state_t state)
 {
        if (tap_is_state_stable(state))
                tap_set_end_state(state);
-       else
-       {
+       else {
                LOG_ERROR("BUG: %s is not a stable end state", tap_state_name(state));
                exit(-1);
        }
 }
 
-static void ft2232_read_scan(enum scan_type type, uint8_tbuffer, int scan_size)
+static void ft2232_read_scan(enum scan_type type, uint8_t *buffer, int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
        int cur_byte  = 0;
 
-       while (num_bytes-- > 1)
-       {
+       while (num_bytes-- > 1) {
                buffer[cur_byte++] = buffer_read();
                bits_left -= 8;
        }
@@ -590,10 +766,11 @@ static void ft2232_read_scan(enum scan_type type, uint8_t* buffer, int scan_size
 
        /* There is one more partial byte left from the clock data in/out instructions */
        if (bits_left > 1)
-       {
                buffer[cur_byte] = buffer_read() >> 1;
-       }
-       /* This shift depends on the length of the clock data to tms instruction, insterted at end of the scan, now fixed to a two step transition in ft2232_add_scan */
+       /* This shift depends on the length of the
+        *clock data to tms instruction, insterted
+        *at end of the scan, now fixed to a two
+        *step transition in ft2232_add_scan */
        buffer[cur_byte] = (buffer[cur_byte] | (((buffer_read()) << 1) & 0x80)) >> (8 - bits_left);
 }
 
@@ -601,13 +778,14 @@ static void ft2232_debug_dump_buffer(void)
 {
        int i;
        char line[256];
-       char* line_p = line;
-
-       for (i = 0; i < ft2232_buffer_size; i++)
-       {
-               line_p += snprintf(line_p, 256 - (line_p - line), "%2.2x ", ft2232_buffer[i]);
-               if (i % 16 == 15)
-               {
+       char *line_p = line;
+
+       for (i = 0; i < ft2232_buffer_size; i++) {
+               line_p += snprintf(line_p,
+                               sizeof(line) - (line_p - line),
+                               "%2.2x ",
+                               ft2232_buffer[i]);
+               if (i % 16 == 15) {
                        LOG_DEBUG("%s", line);
                        line_p = line;
                }
@@ -617,19 +795,19 @@ static void ft2232_debug_dump_buffer(void)
                LOG_DEBUG("%s", line);
 }
 
-static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command* last)
+static int ft2232_send_and_recv(struct jtag_command *first, struct jtag_command *last)
 {
-       struct jtag_commandcmd;
-       uint8_tbuffer;
+       struct jtag_command *cmd;
+       uint8_t *buffer;
        int scan_size;
-       enum scan_type  type;
+       enum scan_type type;
        int retval;
        uint32_t bytes_written = 0;
        uint32_t bytes_read = 0;
 
 #ifdef _DEBUG_USB_IO_
-       struct timeval  start, inter, inter2, end;
-       struct timeval  d_inter, d_inter2, d_end;
+       struct timeval start, inter, inter2, end;
+       struct timeval d_inter, d_inter2, d_end;
 #endif
 
 #ifdef _DEBUG_USB_COMMS_
@@ -641,8 +819,8 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
        gettimeofday(&start, NULL);
 #endif
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
-       {
+       retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                return retval;
        }
@@ -651,8 +829,7 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
        gettimeofday(&inter, NULL);
 #endif
 
-       if (ft2232_expect_read)
-       {
+       if (ft2232_expect_read) {
                /* FIXME this "timeout" is never changed ... */
                int timeout = LIBFTDI_READ_RETRY_COUNT;
                ft2232_buffer_size = 0;
@@ -661,8 +838,8 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
                gettimeofday(&inter2, NULL);
 #endif
 
-               if ((retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read)) != ERROR_OK)
-               {
+               retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read);
+               if (retval != ERROR_OK) {
                        LOG_ERROR("couldn't read from FT2232");
                        return retval;
                }
@@ -682,14 +859,13 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
 
                ft2232_buffer_size = bytes_read;
 
-               if (ft2232_expect_read != ft2232_buffer_size)
-               {
+               if (ft2232_expect_read != ft2232_buffer_size) {
                        LOG_ERROR("ft2232_expect_read (%i) != "
-                                       "ft2232_buffer_size (%i) "
-                                       "(%i retries)",
-                                       ft2232_expect_read,
-                                       ft2232_buffer_size,
-                                       LIBFTDI_READ_RETRY_COUNT - timeout);
+                               "ft2232_buffer_size (%i) "
+                               "(%i retries)",
+                               ft2232_expect_read,
+                               ft2232_buffer_size,
+                               LIBFTDI_READ_RETRY_COUNT - timeout);
                        ft2232_debug_dump_buffer();
 
                        exit(-1);
@@ -697,8 +873,8 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
 
 #ifdef _DEBUG_USB_COMMS_
                LOG_DEBUG("read buffer (%i retries): %i bytes",
-                               LIBFTDI_READ_RETRY_COUNT - timeout,
-                               ft2232_buffer_size);
+                       LIBFTDI_READ_RETRY_COUNT - timeout,
+                       ft2232_buffer_size);
                ft2232_debug_dump_buffer();
 #endif
        }
@@ -712,25 +888,22 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
        retval = ERROR_OK;
 
        cmd = first;
-       while (cmd != last)
-       {
-               switch (cmd->type)
-               {
-               case JTAG_SCAN:
-                       type = jtag_scan_type(cmd->cmd.scan);
-                       if (type != SCAN_OUT)
-                       {
-                               scan_size = jtag_scan_size(cmd->cmd.scan);
-                               buffer    = calloc(DIV_ROUND_UP(scan_size, 8), 1);
-                               ft2232_read_scan(type, buffer, scan_size);
-                               if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
-                                       retval = ERROR_JTAG_QUEUE_FAILED;
-                               free(buffer);
-                       }
-                       break;
-
-               default:
-                       break;
+       while (cmd != last) {
+               switch (cmd->type) {
+                       case JTAG_SCAN:
+                               type = jtag_scan_type(cmd->cmd.scan);
+                               if (type != SCAN_OUT) {
+                                       scan_size = jtag_scan_size(cmd->cmd.scan);
+                                       buffer = calloc(DIV_ROUND_UP(scan_size, 8), 1);
+                                       ft2232_read_scan(type, buffer, scan_size);
+                                       if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
+                                               retval = ERROR_JTAG_QUEUE_FAILED;
+                                       free(buffer);
+                               }
+                               break;
+
+                       default:
+                               break;
                }
 
                cmd = cmd->next;
@@ -750,7 +923,7 @@ static int ft2232_send_and_recv(struct jtag_command* first, struct jtag_command*
  *   ending with the last state at path[num_states-1]
  * @param num_states is the count of state steps to move through
  */
-static void ft2232_add_pathmove(tap_state_tpath, int num_states)
+static void ft2232_add_pathmove(tap_state_t *path, int num_states)
 {
        int state_count = 0;
 
@@ -759,11 +932,10 @@ static void ft2232_add_pathmove(tap_state_t* path, int num_states)
        DEBUG_JTAG_IO("-");
 
        /* this loop verifies that the path is legal and logs each state in the path */
-       while (num_states)
-       {
-               unsigned char   tms_byte = 0;       /* zero this on each MPSSE batch */
-               int             bit_count = 0;
-               int             num_states_batch = num_states > 7 ? 7 : num_states;
+       while (num_states) {
+               unsigned char tms_byte = 0;             /* zero this on each MPSSE batch */
+               int bit_count = 0;
+               int num_states_batch = num_states > 7 ? 7 : num_states;
 
                /* command "Clock Data to TMS/CS Pin (no Read)" */
                buffer_write(0x4b);
@@ -773,17 +945,15 @@ static void ft2232_add_pathmove(tap_state_t* path, int num_states)
 
                while (num_states_batch--) {
                        /* either TMS=0 or TMS=1 must work ... */
-                       if (tap_state_transition(tap_get_state(), false)
-                                               == path[state_count])
+                       if (tap_state_transition(tap_get_state(), false) == path[state_count])
                                buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
-                       else if (tap_state_transition(tap_get_state(), true)
-                                               == path[state_count])
+                       else if (tap_state_transition(tap_get_state(), true) == path[state_count])
                                buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
 
                        /* ... or else the caller goofed BADLY */
                        else {
                                LOG_ERROR("BUG: %s -> %s isn't a valid "
-                                               "TAP state transition",
+                                       "TAP state transition",
                                        tap_state_name(tap_get_state()),
                                        tap_state_name(path[state_count]));
                                exit(-1);
@@ -799,70 +969,52 @@ static void ft2232_add_pathmove(tap_state_t* path, int num_states)
        tap_set_end_state(tap_get_state());
 }
 
-static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_tbuffer, int scan_size)
+static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
        int cur_byte  = 0;
        int last_bit;
 
-       if (!ir_scan)
-       {
+       if (!ir_scan) {
                if (tap_get_state() != TAP_DRSHIFT)
-               {
                        move_to_state(TAP_DRSHIFT);
-               }
-       }
-       else
-       {
+       } else {
                if (tap_get_state() != TAP_IRSHIFT)
-               {
                        move_to_state(TAP_IRSHIFT);
-               }
        }
 
        /* add command for complete bytes */
-       while (num_bytes > 1)
-       {
+       while (num_bytes > 1) {
                int thisrun_bytes;
-               if (type == SCAN_IO)
-               {
+               if (type == SCAN_IO) {
                        /* Clock Data Bytes In and Out LSB First */
                        buffer_write(0x39);
                        /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x19);
                        /* LOG_DEBUG("added TDI bytes (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x28);
                        /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
                }
 
                thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
-               num_bytes    -= thisrun_bytes;
+               num_bytes -= thisrun_bytes;
 
                buffer_write((uint8_t) (thisrun_bytes - 1));
                buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
 
-               if (type != SCAN_IN)
-               {
+               if (type != SCAN_IN) {
                        /* add complete bytes */
-                       while (thisrun_bytes-- > 0)
-                       {
+                       while (thisrun_bytes-- > 0) {
                                buffer_write(buffer[cur_byte++]);
                                bits_left -= 8;
                        }
-               }
-               else /* (type == SCAN_IN) */
-               {
+               } else /* (type == SCAN_IN) */
                        bits_left -= 8 * (thisrun_bytes);
-               }
        }
 
        /* the most signifcant bit is scanned during TAP movement */
@@ -872,22 +1024,16 @@ static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer,
                last_bit = 0;
 
        /* process remaining bits but the last one */
-       if (bits_left > 1)
-       {
-               if (type == SCAN_IO)
-               {
+       if (bits_left > 1) {
+               if (type == SCAN_IO) {
                        /* Clock Data Bits In and Out LSB First */
                        buffer_write(0x3b);
                        /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x1b);
                        /* LOG_DEBUG("added TDI bits (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x2a);
                        /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
@@ -899,47 +1045,37 @@ static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer,
        }
 
        if ((ir_scan && (tap_get_end_state() == TAP_IRSHIFT))
-         || (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT)))
-       {
-               if (type == SCAN_IO)
-               {
+                       || (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT))) {
+               if (type == SCAN_IO) {
                        /* Clock Data Bits In and Out LSB First */
                        buffer_write(0x3b);
                        /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x1b);
                        /* LOG_DEBUG("added TDI bits (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x2a);
                        /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
                }
                buffer_write(0x0);
                buffer_write(last_bit);
-       }
-       else
-       {
+       } else {
                int tms_bits;
                int tms_count;
-               uint8_t mpsse_cmd;
+               uint8_t mpsse_cmd;
 
                /* move from Shift-IR/DR to end state */
-               if (type != SCAN_OUT)
-               {
-                       /* We always go to the PAUSE state in two step at the end of an IN or IO scan */
-                       /* This must be coordinated with the bit shifts in ft2232_read_scan    */
+               if (type != SCAN_OUT) {
+                       /* We always go to the PAUSE state in two step at the end of an IN or IO
+                        *scan
+                        * This must be coordinated with the bit shifts in ft2232_read_scan    */
                        tms_bits  = 0x01;
                        tms_count = 2;
                        /* Clock Data to TMS/CS Pin with Read */
                        mpsse_cmd = 0x6b;
-               }
-               else
-               {
+               } else {
                        tms_bits  = tap_get_tms_path(tap_get_state(), tap_get_end_state());
                        tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
                        /* Clock Data to TMS/CS Pin (no Read) */
@@ -951,63 +1087,55 @@ static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer,
        }
 
        if (tap_get_state() != tap_get_end_state())
-       {
                move_to_state(tap_get_end_state());
-       }
 }
 
-static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint8_t* buffer, int scan_size)
+static int ft2232_large_scan(struct scan_command *cmd,
+       enum scan_type type,
+       uint8_t *buffer,
+       int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
        int cur_byte  = 0;
        int last_bit;
-       uint8_treceive_buffer  = malloc(DIV_ROUND_UP(scan_size, 8));
-       uint8_treceive_pointer = receive_buffer;
+       uint8_t *receive_buffer  = malloc(DIV_ROUND_UP(scan_size, 8));
+       uint8_t *receive_pointer = receive_buffer;
        uint32_t bytes_written;
        uint32_t bytes_read;
        int retval;
        int thisrun_read = 0;
 
-       if (cmd->ir_scan)
-       {
+       if (cmd->ir_scan) {
                LOG_ERROR("BUG: large IR scans are not supported");
                exit(-1);
        }
 
        if (tap_get_state() != TAP_DRSHIFT)
-       {
                move_to_state(TAP_DRSHIFT);
-       }
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
-       {
+       retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                exit(-1);
        }
        LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
-                 ft2232_buffer_size, (int)bytes_written);
+               ft2232_buffer_size, (int)bytes_written);
        ft2232_buffer_size = 0;
 
        /* add command for complete bytes */
-       while (num_bytes > 1)
-       {
+       while (num_bytes > 1) {
                int thisrun_bytes;
 
-               if (type == SCAN_IO)
-               {
+               if (type == SCAN_IO) {
                        /* Clock Data Bytes In and Out LSB First */
                        buffer_write(0x39);
                        /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x19);
                        /* LOG_DEBUG("added TDI bytes (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x28);
                        /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
@@ -1019,41 +1147,35 @@ static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint
                buffer_write((uint8_t) (thisrun_bytes - 1));
                buffer_write((uint8_t) ((thisrun_bytes - 1) >> 8));
 
-               if (type != SCAN_IN)
-               {
+               if (type != SCAN_IN) {
                        /* add complete bytes */
-                       while (thisrun_bytes-- > 0)
-                       {
+                       while (thisrun_bytes-- > 0) {
                                buffer_write(buffer[cur_byte]);
                                cur_byte++;
                                bits_left -= 8;
                        }
-               }
-               else /* (type == SCAN_IN) */
-               {
+               } else /* (type == SCAN_IN) */
                        bits_left -= 8 * (thisrun_bytes);
-               }
 
-               if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
-               {
+               retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
+               if (retval != ERROR_OK) {
                        LOG_ERROR("couldn't write MPSSE commands to FT2232");
                        exit(-1);
                }
                LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
-                         ft2232_buffer_size,
-                         (int)bytes_written);
+                       ft2232_buffer_size,
+                       (int)bytes_written);
                ft2232_buffer_size = 0;
 
-               if (type != SCAN_OUT)
-               {
-                       if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
-                       {
+               if (type != SCAN_OUT) {
+                       retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read);
+                       if (retval != ERROR_OK) {
                                LOG_ERROR("couldn't read from FT2232");
                                exit(-1);
                        }
                        LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
-                                 thisrun_read,
-                                 (int)bytes_read);
+                               thisrun_read,
+                               (int)bytes_read);
                        receive_pointer += bytes_read;
                }
        }
@@ -1067,22 +1189,16 @@ static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint
                last_bit = 0;
 
        /* process remaining bits but the last one */
-       if (bits_left > 1)
-       {
-               if (type == SCAN_IO)
-               {
+       if (bits_left > 1) {
+               if (type == SCAN_IO) {
                        /* Clock Data Bits In and Out LSB First */
                        buffer_write(0x3b);
                        /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x1b);
                        /* LOG_DEBUG("added TDI bits (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x2a);
                        /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
@@ -1095,44 +1211,33 @@ static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint
                        thisrun_read += 2;
        }
 
-       if (tap_get_end_state() == TAP_DRSHIFT)
-       {
-               if (type == SCAN_IO)
-               {
+       if (tap_get_end_state() == TAP_DRSHIFT) {
+               if (type == SCAN_IO) {
                        /* Clock Data Bits In and Out LSB First */
                        buffer_write(0x3b);
                        /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */
-               }
-               else if (type == SCAN_OUT)
-               {
+               } else if (type == SCAN_OUT) {
                        /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
                        buffer_write(0x1b);
                        /* LOG_DEBUG("added TDI bits (o)"); */
-               }
-               else if (type == SCAN_IN)
-               {
+               } else if (type == SCAN_IN) {
                        /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
                        buffer_write(0x2a);
                        /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
                }
                buffer_write(0x0);
                buffer_write(last_bit);
-       }
-       else
-       {
+       } else {
                int tms_bits  = tap_get_tms_path(tap_get_state(), tap_get_end_state());
                int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
-               uint8_t mpsse_cmd;
+               uint8_t mpsse_cmd;
 
                /* move from Shift-IR/DR to end state */
-               if (type != SCAN_OUT)
-               {
+               if (type != SCAN_OUT) {
                        /* Clock Data to TMS/CS Pin with Read */
                        mpsse_cmd = 0x6b;
                        /* LOG_DEBUG("added TMS scan (read)"); */
-               }
-               else
-               {
+               } else {
                        /* Clock Data to TMS/CS Pin (no Read) */
                        mpsse_cmd = 0x4b;
                        /* LOG_DEBUG("added TMS scan (no read)"); */
@@ -1145,27 +1250,25 @@ static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint
        if (type != SCAN_OUT)
                thisrun_read += 1;
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
-       {
+       retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                exit(-1);
        }
        LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i",
-                 ft2232_buffer_size,
-                 (int)bytes_written);
+               ft2232_buffer_size,
+               (int)bytes_written);
        ft2232_buffer_size = 0;
 
-       if (type != SCAN_OUT)
-       {
-               if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
-               {
+       if (type != SCAN_OUT) {
+               retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read);
+               if (retval != ERROR_OK) {
                        LOG_ERROR("couldn't read from FT2232");
                        exit(-1);
                }
                LOG_DEBUG("thisrun_read: %i, bytes_read: %i",
-                         thisrun_read,
-                         (int)bytes_read);
-               receive_pointer += bytes_read;
+                       thisrun_read,
+                       (int)bytes_read);
        }
 
        return ERROR_OK;
@@ -1177,19 +1280,17 @@ static int ft2232_predict_scan_out(int scan_size, enum scan_type type)
        int num_bytes = (scan_size - 1) / 8;
 
        if (tap_get_state() != TAP_DRSHIFT)
-               predicted_size += get_tms_buffer_requirements(tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
+               predicted_size += get_tms_buffer_requirements(
+                               tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
 
-       if (type == SCAN_IN)    /* only from device to host */
-       {
+       if (type == SCAN_IN) {  /* only from device to host */
                /* complete bytes */
                predicted_size += DIV_ROUND_UP(num_bytes, 65536) * 3;
 
                /* remaining bits - 1 (up to 7) */
                predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
-       }
-       else    /* host to device, or bidirectional */
-       {
-               /* complete bytes */
+       } else {/* host to device, or bidirectional
+                * complete bytes */
                predicted_size += num_bytes + DIV_ROUND_UP(num_bytes, 65536) * 3;
 
                /* remaining bits -1 (up to 7) */
@@ -1203,10 +1304,10 @@ static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
 {
        int predicted_size = 0;
 
-       if (type != SCAN_OUT)
-       {
+       if (type != SCAN_OUT) {
                /* complete bytes */
-               predicted_size += (DIV_ROUND_UP(scan_size, 8) > 1) ? (DIV_ROUND_UP(scan_size, 8) - 1) : 0;
+               predicted_size +=
+                       (DIV_ROUND_UP(scan_size, 8) > 1) ? (DIV_ROUND_UP(scan_size, 8) - 1) : 0;
 
                /* remaining bits - 1 */
                predicted_size += ((scan_size - 1) % 8) ? 1 : 0;
@@ -1220,33 +1321,29 @@ static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
        return predicted_size;
 }
 
-static void usbjtag_reset(int trst, int srst)
+/* semi-generic FT2232/FT4232 reset code */
+static void ftx23_reset(int trst, int srst)
 {
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (trst == 1)
-       {
+       if (trst == 1) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        low_direction |= nTRSTnOE;      /* switch to output pin (output is low) */
                else
                        low_output &= ~nTRST;           /* switch output low */
-       }
-       else if (trst == 0)
-       {
+       } else if (trst == 0) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-                       low_direction &= ~nTRSTnOE;     /* switch to input pin (high-Z + internal and external pullup) */
+                       low_direction &= ~nTRSTnOE;     /* switch to input pin (high-Z + internal
+                                                        *and external pullup) */
                else
                        low_output |= nTRST;            /* switch output high */
        }
 
-       if (srst == 1)
-       {
+       if (srst == 1) {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                        low_output &= ~nSRST;           /* switch output low */
                else
                        low_direction |= nSRSTnOE;      /* switch to output pin (output is low) */
-       }
-       else if (srst == 0)
-       {
+       } else if (srst == 0) {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                        low_output |= nSRST;            /* switch output high */
                else
@@ -1262,30 +1359,24 @@ static void usbjtag_reset(int trst, int srst)
 static void jtagkey_reset(int trst, int srst)
 {
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (trst == 1)
-       {
+       if (trst == 1) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        high_output &= ~nTRSTnOE;
                else
                        high_output &= ~nTRST;
-       }
-       else if (trst == 0)
-       {
+       } else if (trst == 0) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        high_output |= nTRSTnOE;
                else
                        high_output |= nTRST;
        }
 
-       if (srst == 1)
-       {
+       if (srst == 1) {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                        high_output &= ~nSRST;
                else
                        high_output &= ~nSRSTnOE;
-       }
-       else if (srst == 0)
-       {
+       } else if (srst == 0) {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                        high_output |= nSRST;
                else
@@ -1296,22 +1387,22 @@ static void jtagkey_reset(int trst, int srst)
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
-                       high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void olimex_jtag_reset(int trst, int srst)
 {
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (trst == 1)
-       {
+       if (trst == 1) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        high_output &= ~nTRSTnOE;
                else
                        high_output &= ~nTRST;
-       }
-       else if (trst == 0)
-       {
+       } else if (trst == 0) {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        high_output |= nTRSTnOE;
                else
@@ -1319,76 +1410,94 @@ static void olimex_jtag_reset(int trst, int srst)
        }
 
        if (srst == 1)
-       {
                high_output |= nSRST;
-       }
        else if (srst == 0)
-       {
                high_output &= ~nSRST;
-       }
 
        /* command "set data bits high byte" */
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
-                       high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void axm0432_jtag_reset(int trst, int srst)
 {
-       if (trst == 1)
-       {
+       if (trst == 1) {
                tap_set_state(TAP_RESET);
                high_output &= ~nTRST;
-       }
-       else if (trst == 0)
-       {
+       } else if (trst == 0)
                high_output |= nTRST;
-       }
 
        if (srst == 1)
-       {
                high_output &= ~nSRST;
-       }
        else if (srst == 0)
-       {
                high_output |= nSRST;
-       }
 
        /* command "set data bits low byte" */
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
-                       high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void flyswatter_reset(int trst, int srst)
 {
        if (trst == 1)
-       {
                low_output &= ~nTRST;
-       }
        else if (trst == 0)
-       {
                low_output |= nTRST;
-       }
 
        if (srst == 1)
-       {
                low_output |= nSRST;
-       }
        else if (srst == 0)
-       {
                low_output &= ~nSRST;
-       }
 
        /* command "set data bits low byte" */
        buffer_write(0x80);
        buffer_write(low_output);
        buffer_write(low_direction);
-       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
+       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
+               trst,
+               srst,
+               low_output,
+               low_direction);
+}
+
+static void flyswatter1_reset(int trst, int srst)
+{
+       flyswatter_reset(trst, srst);
+}
+
+static void flyswatter2_reset(int trst, int srst)
+{
+       flyswatter_reset(trst, !srst);
+}
+
+static void minimodule_reset(int trst, int srst)
+{
+       if (srst == 1)
+               low_output &= ~nSRST;
+       else if (srst == 0)
+               low_output |= nSRST;
+
+       /* command "set data bits low byte" */
+       buffer_write(0x80);
+       buffer_write(low_output);
+       buffer_write(low_direction);
+       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
+               trst,
+               srst,
+               low_output,
+               low_direction);
 }
 
 static void turtle_reset(int trst, int srst)
@@ -1396,68 +1505,54 @@ static void turtle_reset(int trst, int srst)
        trst = trst;
 
        if (srst == 1)
-       {
                low_output |= nSRST;
-       }
        else if (srst == 0)
-       {
                low_output &= ~nSRST;
-       }
 
        /* command "set data bits low byte" */
        buffer_write(0x80);
        buffer_write(low_output);
        buffer_write(low_direction);
-       LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction);
+       LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
+               srst,
+               low_output,
+               low_direction);
 }
 
 static void comstick_reset(int trst, int srst)
 {
        if (trst == 1)
-       {
                high_output &= ~nTRST;
-       }
        else if (trst == 0)
-       {
                high_output |= nTRST;
-       }
 
        if (srst == 1)
-       {
                high_output &= ~nSRST;
-       }
        else if (srst == 0)
-       {
                high_output |= nSRST;
-       }
 
        /* command "set data bits high byte" */
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
-                       high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void stm32stick_reset(int trst, int srst)
 {
        if (trst == 1)
-       {
                high_output &= ~nTRST;
-       }
        else if (trst == 0)
-       {
                high_output |= nTRST;
-       }
 
        if (srst == 1)
-       {
                low_output &= ~nSRST;
-       }
        else if (srst == 0)
-       {
                low_output |= nSRST;
-       }
 
        /* command "set data bits low byte" */
        buffer_write(0x80);
@@ -1468,8 +1563,11 @@ static void stm32stick_reset(int trst, int srst)
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
-                       high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void sheevaplug_reset(int trst, int srst)
@@ -1488,7 +1586,55 @@ static void sheevaplug_reset(int trst, int srst)
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
+}
+
+static void redbee_reset(int trst, int srst)
+{
+       if (trst == 1) {
+               tap_set_state(TAP_RESET);
+               high_output &= ~nTRST;
+       } else if (trst == 0)
+               high_output |= nTRST;
+
+       if (srst == 1)
+               high_output &= ~nSRST;
+       else if (srst == 0)
+               high_output |= nSRST;
+
+       /* command "set data bits low byte" */
+       buffer_write(0x82);
+       buffer_write(high_output);
+       buffer_write(high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, "
+               "high_direction: 0x%2.2x", trst, srst, high_output,
+               high_direction);
+}
+
+static void xds100v2_reset(int trst, int srst)
+{
+       if (trst == 1) {
+               tap_set_state(TAP_RESET);
+               high_output &= ~nTRST;
+       } else if (trst == 0)
+               high_output |= nTRST;
+
+       if (srst == 1)
+               high_output |= nSRST;
+       else if (srst == 0)
+               high_output &= ~nSRST;
+
+       /* command "set data bits low byte" */
+       buffer_write(0x82);
+       buffer_write(high_output);
+       buffer_write(high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, "
+               "high_direction: 0x%2.2x", trst, srst, high_output,
+               high_direction);
 }
 
 static int ft2232_execute_runtest(struct jtag_command *cmd)
@@ -1499,8 +1645,8 @@ static int ft2232_execute_runtest(struct jtag_command *cmd)
        retval = ERROR_OK;
 
        DEBUG_JTAG_IO("runtest %i cycles, end in %s",
-                       cmd->cmd.runtest->num_cycles,
-                       tap_state_name(cmd->cmd.runtest->end_state));
+               cmd->cmd.runtest->num_cycles,
+               tap_state_name(cmd->cmd.runtest->end_state));
 
        /* only send the maximum buffer size that FT2232C can handle */
        predicted_size = 0;
@@ -1511,21 +1657,18 @@ static int ft2232_execute_runtest(struct jtag_command *cmd)
                predicted_size += 3;
        if (tap_get_end_state() != TAP_IDLE)
                predicted_size += 3;
-       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-       {
+       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
                require_send = 0;
                first_unsent = cmd;
        }
-       if (tap_get_state() != TAP_IDLE)
-       {
+       if (tap_get_state() != TAP_IDLE) {
                move_to_state(TAP_IDLE);
                require_send = 1;
        }
        i = cmd->cmd.runtest->num_cycles;
-       while (i > 0)
-       {
+       while (i > 0) {
                /* there are no state transitions in this code, so omit state tracking */
 
                /* command "Clock Data to TMS/CS Pin (no Read)" */
@@ -1544,29 +1687,26 @@ static int ft2232_execute_runtest(struct jtag_command *cmd)
        ft2232_end_state(cmd->cmd.runtest->end_state);
 
        if (tap_get_state() != tap_get_end_state())
-       {
                move_to_state(tap_get_end_state());
-       }
 
        require_send = 1;
        DEBUG_JTAG_IO("runtest: %i, end in %s",
-                       cmd->cmd.runtest->num_cycles,
-                       tap_state_name(tap_get_end_state()));
+               cmd->cmd.runtest->num_cycles,
+               tap_state_name(tap_get_end_state()));
        return retval;
 }
 
 static int ft2232_execute_statemove(struct jtag_command *cmd)
 {
-       int     predicted_size = 0;
-       int     retval = ERROR_OK;
+       int predicted_size = 0;
+       int retval = ERROR_OK;
 
        DEBUG_JTAG_IO("statemove end in %s",
-                       tap_state_name(cmd->cmd.statemove->end_state));
+               tap_state_name(cmd->cmd.statemove->end_state));
 
        /* only send the maximum buffer size that FT2232C can handle */
        predicted_size = 3;
-       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-       {
+       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
                require_send = 0;
@@ -1582,9 +1722,8 @@ static int ft2232_execute_statemove(struct jtag_command *cmd)
                clock_tms(0x4b,  0xff, 5, 0);
                require_send = 1;
 
-       /* shortest-path move to desired end state */
-       } else if (tap_get_state() != tap_get_end_state())
-       {
+               /* shortest-path move to desired end state */
+       } else if (tap_get_state() != tap_get_end_state()) {
                move_to_state(tap_get_end_state());
                require_send = 1;
        }
@@ -1592,22 +1731,87 @@ static int ft2232_execute_statemove(struct jtag_command *cmd)
        return retval;
 }
 
+/**
+ * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG
+ * (or SWD) state machine.
+ */
+static int ft2232_execute_tms(struct jtag_command *cmd)
+{
+       int retval = ERROR_OK;
+       unsigned num_bits = cmd->cmd.tms->num_bits;
+       const uint8_t *bits = cmd->cmd.tms->bits;
+       unsigned count;
+
+       DEBUG_JTAG_IO("TMS: %d bits", num_bits);
+
+       /* only send the maximum buffer size that FT2232C can handle */
+       count = 3 * DIV_ROUND_UP(num_bits, 4);
+       if (ft2232_buffer_size + 3*count + 1 > FT2232_BUFFER_SIZE) {
+               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                       retval = ERROR_JTAG_QUEUE_FAILED;
+
+               require_send = 0;
+               first_unsent = cmd;
+       }
+
+       /* Shift out in batches of at most 6 bits; there's a report of an
+        * FT2232 bug in this area, where shifting exactly 7 bits can make
+        * problems with TMS signaling for the last clock cycle:
+        *
+        *    http://developer.intra2net.com/mailarchive/html/
+        *              libftdi/2009/msg00292.html
+        *
+        * Command 0x4b is: "Clock Data to TMS/CS Pin (no Read)"
+        *
+        * Note that pathmoves in JTAG are not often seven bits, so that
+        * isn't a particularly likely situation outside of "special"
+        * signaling such as switching between JTAG and SWD modes.
+        */
+       while (num_bits) {
+               if (num_bits <= 6) {
+                       buffer_write(0x4b);
+                       buffer_write(num_bits - 1);
+                       buffer_write(*bits & 0x3f);
+                       break;
+               }
+
+               /* Yes, this is lazy ... we COULD shift out more data
+                * bits per operation, but doing it in nybbles is easy
+                */
+               buffer_write(0x4b);
+               buffer_write(3);
+               buffer_write(*bits & 0xf);
+               num_bits -= 4;
+
+               count  = (num_bits > 4) ? 4 : num_bits;
+
+               buffer_write(0x4b);
+               buffer_write(count - 1);
+               buffer_write((*bits >> 4) & 0xf);
+               num_bits -= count;
+
+               bits++;
+       }
+
+       require_send = 1;
+       return retval;
+}
+
 static int ft2232_execute_pathmove(struct jtag_command *cmd)
 {
-       int     predicted_size = 0;
-       int     retval = ERROR_OK;
+       int predicted_size = 0;
+       int retval = ERROR_OK;
 
-       tap_state_t*     path = cmd->cmd.pathmove->path;
-       int     num_states    = cmd->cmd.pathmove->num_states;
+       tap_state_t *path = cmd->cmd.pathmove->path;
+       int num_states    = cmd->cmd.pathmove->num_states;
 
        DEBUG_JTAG_IO("pathmove: %i states, current: %s  end: %s", num_states,
-                       tap_state_name(tap_get_state()),
-                       tap_state_name(path[num_states-1]));
+               tap_state_name(tap_get_state()),
+               tap_state_name(path[num_states-1]));
 
        /* only send the maximum buffer size that FT2232C can handle */
        predicted_size = 3 * DIV_ROUND_UP(num_states, 7);
-       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-       {
+       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
 
@@ -1623,20 +1827,19 @@ static int ft2232_execute_pathmove(struct jtag_command *cmd)
 
 static int ft2232_execute_scan(struct jtag_command *cmd)
 {
-       uint8_tbuffer;
+       uint8_t *buffer;
        int scan_size;                          /* size of IR or DR scan */
        int predicted_size = 0;
        int retval = ERROR_OK;
 
-       enum scan_type  type = jtag_scan_type(cmd->cmd.scan);
+       enum scan_type type = jtag_scan_type(cmd->cmd.scan);
 
        DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN", type);
 
        scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
 
        predicted_size = ft2232_predict_scan_out(scan_size, type);
-       if ((predicted_size + 1) > FT2232_BUFFER_SIZE)
-       {
+       if ((predicted_size + 1) > FT2232_BUFFER_SIZE) {
                LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
                /* unsent commands before this */
                if (first_unsent != cmd)
@@ -1651,12 +1854,11 @@ static int ft2232_execute_scan(struct jtag_command *cmd)
                if (buffer)
                        free(buffer);
                return retval;
-       }
-       else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-       {
-               LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
-                               first_unsent,
-                               cmd);
+       } else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
+               LOG_DEBUG(
+                       "ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
+                       first_unsent,
+                       cmd);
                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
                require_send = 0;
@@ -1670,8 +1872,8 @@ static int ft2232_execute_scan(struct jtag_command *cmd)
        if (buffer)
                free(buffer);
        DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
-                       (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
-                       tap_state_name(tap_get_end_state()));
+               (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
+               tap_state_name(tap_get_end_state()));
        return retval;
 
 }
@@ -1683,28 +1885,26 @@ static int ft2232_execute_reset(struct jtag_command *cmd)
        retval = ERROR_OK;
 
        DEBUG_JTAG_IO("reset trst: %i srst %i",
-                       cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+               cmd->cmd.reset->trst, cmd->cmd.reset->srst);
 
        /* only send the maximum buffer size that FT2232C can handle */
        predicted_size = 3;
-       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-       {
+       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) {
                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
                require_send = 0;
                first_unsent = cmd;
        }
 
-       if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
-       {
+       if ((cmd->cmd.reset->trst == 1) ||
+           (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
                tap_set_state(TAP_RESET);
-       }
 
        layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
        require_send = 1;
 
        DEBUG_JTAG_IO("trst: %i, srst: %i",
-                       cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+               cmd->cmd.reset->trst, cmd->cmd.reset->srst);
        return retval;
 }
 
@@ -1716,12 +1916,12 @@ static int ft2232_execute_sleep(struct jtag_command *cmd)
        DEBUG_JTAG_IO("sleep %" PRIi32, cmd->cmd.sleep->us);
 
        if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                               retval = ERROR_JTAG_QUEUE_FAILED;
+               retval = ERROR_JTAG_QUEUE_FAILED;
        first_unsent = cmd->next;
        jtag_sleep(cmd->cmd.sleep->us);
        DEBUG_JTAG_IO("sleep %" PRIi32 " usec while in %s",
-                       cmd->cmd.sleep->us,
-                       tap_state_name(tap_get_state()));
+               cmd->cmd.sleep->us,
+               tap_state_name(tap_get_state()));
        return retval;
 }
 
@@ -1736,35 +1936,51 @@ static int ft2232_execute_stableclocks(struct jtag_command *cmd)
        if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
                retval = ERROR_JTAG_QUEUE_FAILED;
        DEBUG_JTAG_IO("clocks %i while in %s",
-                       cmd->cmd.stableclocks->num_cycles,
-                       tap_state_name(tap_get_state()));
+               cmd->cmd.stableclocks->num_cycles,
+               tap_state_name(tap_get_state()));
        return retval;
 }
 
 static int ft2232_execute_command(struct jtag_command *cmd)
 {
        int retval;
-       retval = ERROR_OK;
 
-       switch (cmd->type)
-       {
-       case JTAG_RESET:        retval = ft2232_execute_reset(cmd); break;
-       case JTAG_RUNTEST:      retval = ft2232_execute_runtest(cmd); break;
-       case JTAG_STATEMOVE: retval = ft2232_execute_statemove(cmd); break;
-       case JTAG_PATHMOVE:     retval = ft2232_execute_pathmove(cmd); break;
-       case JTAG_SCAN:         retval = ft2232_execute_scan(cmd); break;
-       case JTAG_SLEEP:        retval = ft2232_execute_sleep(cmd); break;
-       case JTAG_STABLECLOCKS: retval = ft2232_execute_stableclocks(cmd); break;
-       default:
-               LOG_ERROR("BUG: unknown JTAG command type encountered");
-               exit(-1);
+       switch (cmd->type) {
+               case JTAG_RESET:
+                       retval = ft2232_execute_reset(cmd);
+                       break;
+               case JTAG_RUNTEST:
+                       retval = ft2232_execute_runtest(cmd);
+                       break;
+               case JTAG_TLR_RESET:
+                       retval = ft2232_execute_statemove(cmd);
+                       break;
+               case JTAG_PATHMOVE:
+                       retval = ft2232_execute_pathmove(cmd);
+                       break;
+               case JTAG_SCAN:
+                       retval = ft2232_execute_scan(cmd);
+                       break;
+               case JTAG_SLEEP:
+                       retval = ft2232_execute_sleep(cmd);
+                       break;
+               case JTAG_STABLECLOCKS:
+                       retval = ft2232_execute_stableclocks(cmd);
+                       break;
+               case JTAG_TMS:
+                       retval = ft2232_execute_tms(cmd);
+                       break;
+               default:
+                       LOG_ERROR("BUG: unknown JTAG command type encountered");
+                       retval = ERROR_JTAG_QUEUE_FAILED;
+                       break;
        }
        return retval;
 }
 
 static int ft2232_execute_queue(void)
 {
-       struct jtag_commandcmd = jtag_command_queue;  /* currently processed command */
+       struct jtag_command *cmd = jtag_command_queue;  /* currently processed command */
        int retval;
 
        first_unsent = cmd;             /* next command that has to be sent */
@@ -1782,14 +1998,22 @@ static int ft2232_execute_queue(void)
        if (layout->blink)
                layout->blink();
 
-       while (cmd)
-       {
+       while (cmd) {
+               /* fill the write buffer with the desired command */
                if (ft2232_execute_command(cmd) != ERROR_OK)
                        retval = ERROR_JTAG_QUEUE_FAILED;
-               /* Start reading input before FT2232 TX buffer fills up */
+               /* Start reading input before FT2232 TX buffer fills up.
+                * Sometimes this happens because we don't know the
+                * length of the last command before we execute it. So
+                * we simple inform the user.
+                */
                cmd = cmd->next;
-               if (ft2232_expect_read > 256)
-               {
+
+               if (ft2232_expect_read >= FT2232_BUFFER_READ_QUEUE_SIZE) {
+                       if (ft2232_expect_read > (FT2232_BUFFER_READ_QUEUE_SIZE+1))
+                               LOG_DEBUG("read buffer size looks too high %d/%d",
+                                       ft2232_expect_read,
+                                       (FT2232_BUFFER_READ_QUEUE_SIZE+1));
                        if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                                retval = ERROR_JTAG_QUEUE_FAILED;
                        first_unsent = cmd;
@@ -1804,46 +2028,48 @@ static int ft2232_execute_queue(void)
 }
 
 #if BUILD_FT2232_FTD2XX == 1
-static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, inttry_more)
+static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int *try_more)
 {
-       FT_STATUS       status;
-       DWORD           deviceID;
-       char            SerialNumber[16];
-       char            Description[64];
-       DWORD   openex_flags  = 0;
-       char*   openex_string = NULL;
-       uint8_t latency_timer;
+       FT_STATUS status;
+       DWORD deviceID;
+       char SerialNumber[16];
+       char Description[64];
+       DWORD openex_flags  = 0;
+       char *openex_string = NULL;
+       uint8_t latency_timer;
 
-       LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)", ft2232_layout, vid, pid);
+       if (layout == NULL) {
+               LOG_WARNING("No ft2232 layout specified'");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)",
+                       layout->name, vid, pid);
 
 #if IS_WIN32 == 0
        /* Add non-standard Vid/Pid to the linux driver */
-       if ((status = FT_SetVIDPID(vid, pid)) != FT_OK)
-       {
+       status = FT_SetVIDPID(vid, pid);
+       if (status != FT_OK)
                LOG_WARNING("couldn't add %4.4x:%4.4x", vid, pid);
-       }
+
 #endif
 
-       if (ft2232_device_desc && ft2232_serial)
-       {
-               LOG_WARNING("can't open by device description and serial number, giving precedence to serial");
+       if (ft2232_device_desc && ft2232_serial) {
+               LOG_WARNING(
+                       "can't open by device description and serial number, giving precedence to serial");
                ft2232_device_desc = NULL;
        }
 
-       if (ft2232_device_desc)
-       {
+       if (ft2232_device_desc) {
                openex_string = ft2232_device_desc;
                openex_flags  = FT_OPEN_BY_DESCRIPTION;
-       }
-       else if (ft2232_serial)
-       {
+       } else if (ft2232_serial) {
                openex_string = ft2232_serial;
                openex_flags  = FT_OPEN_BY_SERIAL_NUMBER;
-       }
-       else
-       {
+       } else {
                LOG_ERROR("neither device description nor serial number specified");
-               LOG_ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
+               LOG_ERROR(
+                       "please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
 
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -1862,28 +2088,27 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor
                        } else {
                                /* drat, give the user a meaningfull message.
                                 * telling the use we tried *BOTH* methods. */
-                               LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n",
-                                                       ft2232_device_desc,
-                                                       ft2232_device_desc_A);
+                               LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'",
+                                       ft2232_device_desc,
+                                       ft2232_device_desc_A);
                        }
                }
        }
 
-       if (status != FT_OK)
-       {
+       if (status != FT_OK) {
                DWORD num_devices;
 
-               if (more)
-               {
-                       LOG_WARNING("unable to open ftdi device (trying more): %lu", status);
+               if (more) {
+                       LOG_WARNING("unable to open ftdi device (trying more): %s",
+                               ftd2xx_status_string(status));
                        *try_more = 1;
                        return ERROR_JTAG_INIT_FAILED;
                }
-               LOG_ERROR("unable to open ftdi device: %lu", status);
+               LOG_ERROR("unable to open ftdi device: %s",
+                       ftd2xx_status_string(status));
                status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY);
-               if (status == FT_OK)
-               {
-                       char** desc_array = malloc(sizeof(char*) * (num_devices + 1));
+               if (status == FT_OK) {
+                       char **desc_array = malloc(sizeof(char *) * (num_devices + 1));
                        uint32_t i;
 
                        for (i = 0; i < num_devices; i++)
@@ -1893,9 +2118,8 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor
 
                        status = FT_ListDevices(desc_array, &num_devices, FT_LIST_ALL | openex_flags);
 
-                       if (status == FT_OK)
-                       {
-                               LOG_ERROR("ListDevices: %lu\n", num_devices);
+                       if (status == FT_OK) {
+                               LOG_ERROR("ListDevices: %" PRIu32, (uint32_t)num_devices);
                                for (i = 0; i < num_devices; i++)
                                        LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]);
                        }
@@ -1904,56 +2128,65 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor
                                free(desc_array[i]);
 
                        free(desc_array);
-               }
-               else
-               {
-                       LOG_ERROR("ListDevices: NONE\n");
-               }
+               } else
+                       LOG_ERROR("ListDevices: NONE");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_SetLatencyTimer(ftdih, ft2232_latency)) != FT_OK)
-       {
-               LOG_ERROR("unable to set latency timer: %lu", status);
+       status = FT_SetLatencyTimer(ftdih, ft2232_latency);
+       if (status != FT_OK) {
+               LOG_ERROR("unable to set latency timer: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK)
-       {
-               LOG_ERROR("unable to get latency timer: %lu", status);
-               return ERROR_JTAG_INIT_FAILED;
-       }
-       else
-       {
+       status = FT_GetLatencyTimer(ftdih, &latency_timer);
+       if (status != FT_OK) {
+               /* ftd2xx 1.04 (linux) has a bug when calling FT_GetLatencyTimer
+                * so ignore errors if using this driver version */
+               DWORD dw_version;
+
+               status = FT_GetDriverVersion(ftdih, &dw_version);
+               LOG_ERROR("unable to get latency timer: %s",
+                       ftd2xx_status_string(status));
+
+               if ((status == FT_OK) && (dw_version == 0x10004)) {
+                       LOG_ERROR("ftd2xx 1.04 detected - this has known issues " \
+                               "with FT_GetLatencyTimer, upgrade to a newer version");
+               } else
+                       return ERROR_JTAG_INIT_FAILED;
+       } else
                LOG_DEBUG("current latency timer: %i", latency_timer);
-       }
 
-       if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK)
-       {
-               LOG_ERROR("unable to set timeouts: %lu", status);
+       status = FT_SetTimeouts(ftdih, 5000, 5000);
+       if (status != FT_OK) {
+               LOG_ERROR("unable to set timeouts: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK)
-       {
-               LOG_ERROR("unable to enable bit i/o mode: %lu", status);
+       status = FT_SetBitMode(ftdih, 0x0b, 2);
+       if (status != FT_OK) {
+               LOG_ERROR("unable to enable bit i/o mode: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_GetDeviceInfo(ftdih, &ftdi_device, &deviceID, SerialNumber, Description, NULL)) != FT_OK)
-       {
-               LOG_ERROR("unable to get FT_GetDeviceInfo: %lu", status);
+       status = FT_GetDeviceInfo(ftdih, &ftdi_device, &deviceID,
+                       SerialNumber, Description, NULL);
+       if (status != FT_OK) {
+               LOG_ERROR("unable to get FT_GetDeviceInfo: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_INIT_FAILED;
-       }
-       else
-       {
-               static const char* type_str[] =
-                       {"BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H"};
+       } else {
+               static const char *type_str[] = {
+                       "BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H", "232H"
+               };
                unsigned no_of_known_types = ARRAY_SIZE(type_str) - 1;
                unsigned type_index = ((unsigned)ftdi_device <= no_of_known_types)
                        ? ftdi_device : FT_DEVICE_UNKNOWN;
-               LOG_INFO("device: %lu \"%s\"", ftdi_device, type_str[type_index]);
-               LOG_INFO("deviceID: %lu", deviceID);
+               LOG_INFO("device: %" PRIu32 " \"%s\"", (uint32_t)ftdi_device, type_str[type_index]);
+               LOG_INFO("deviceID: %" PRIu32, (uint32_t)deviceID);
                LOG_INFO("SerialNumber: %s", SerialNumber);
                LOG_INFO("Description: %s", Description);
        }
@@ -1965,41 +2198,47 @@ static int ft2232_purge_ftd2xx(void)
 {
        FT_STATUS status;
 
-       if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK)
-       {
-               LOG_ERROR("error purging ftd2xx device: %lu", status);
+       status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX);
+       if (status != FT_OK) {
+               LOG_ERROR("error purging ftd2xx device: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_INIT_FAILED;
        }
 
        return ERROR_OK;
 }
 
-#endif /* BUILD_FT2232_FTD2XX == 1 */
+#endif /* BUILD_FT2232_FTD2XX == 1 */
 
 #if BUILD_FT2232_LIBFTDI == 1
-static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_more)
+static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int *try_more, int channel)
 {
        uint8_t latency_timer;
 
+       if (layout == NULL) {
+               LOG_WARNING("No ft2232 layout specified'");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
        LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
-                       ft2232_layout, vid, pid);
+               layout->name, vid, pid);
 
        if (ftdi_init(&ftdic) < 0)
                return ERROR_JTAG_INIT_FAILED;
 
-       if (ftdi_set_interface(&ftdic, INTERFACE_A) < 0)
-       {
+       /* default to INTERFACE_A */
+       if (channel == INTERFACE_ANY)
+               channel = INTERFACE_A;
+       if (ftdi_set_interface(&ftdic, channel) < 0) {
                LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str);
                return ERROR_JTAG_INIT_FAILED;
        }
 
        /* context, vendor id, product id */
-       if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc,
-                               ft2232_serial) < 0)
-       {
+       if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc, ft2232_serial) < 0) {
                if (more)
                        LOG_WARNING("unable to open ftdi device (trying more): %s",
-                                       ftdic.error_str);
+                               ftdic.error_str);
                else
                        LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str);
                *try_more = 1;
@@ -2007,33 +2246,28 @@ static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_mo
        }
 
        /* There is already a reset in ftdi_usb_open_desc, this should be redundant */
-       if (ftdi_usb_reset(&ftdic) < 0)
-       {
+       if (ftdi_usb_reset(&ftdic) < 0) {
                LOG_ERROR("unable to reset ftdi device");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if (ftdi_set_latency_timer(&ftdic, ft2232_latency) < 0)
-       {
+       if (ftdi_set_latency_timer(&ftdic, ft2232_latency) < 0) {
                LOG_ERROR("unable to set latency timer");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0)
-       {
+       if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0) {
                LOG_ERROR("unable to get latency timer");
                return ERROR_JTAG_INIT_FAILED;
-       }
-       else
-       {
+       } else
                LOG_DEBUG("current latency timer: %i", latency_timer);
-       }
 
-       ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */
+       ftdi_set_bitmode(&ftdic, 0x0b, 2);      /* ctx, JTAG I/O mask */
 
        ftdi_device = ftdic.type;
-       static const char* type_str[] =
-               {"AM", "BM", "2232C", "R", "2232H", "4232H", "Unknown"};
+       static const char *type_str[] = {
+               "AM", "BM", "2232C", "R", "2232H", "4232H", "232H", "Unknown"
+       };
        unsigned no_of_known_types = ARRAY_SIZE(type_str) - 1;
        unsigned type_index = ((unsigned)ftdi_device < no_of_known_types)
                ? ftdi_device : no_of_known_types;
@@ -2043,8 +2277,7 @@ static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_mo
 
 static int ft2232_purge_libftdi(void)
 {
-       if (ftdi_usb_purge_buffers(&ftdic) < 0)
-       {
+       if (ftdi_usb_purge_buffers(&ftdic) < 0) {
                LOG_ERROR("ftdi_purge_buffers: %s", ftdic.error_str);
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2052,49 +2285,62 @@ static int ft2232_purge_libftdi(void)
        return ERROR_OK;
 }
 
-#endif /* BUILD_FT2232_LIBFTDI == 1 */
+#endif /* BUILD_FT2232_LIBFTDI == 1 */
 
-static int ft2232_init(void)
+static int ft2232_set_data_bits_low_byte(uint8_t value, uint8_t direction)
 {
-       uint8_t  buf[1];
-       int retval;
+       uint8_t buf[3];
        uint32_t bytes_written;
-       const struct ft2232_layout* cur_layout = ft2232_layouts;
-       int i;
 
-       if (tap_get_tms_path_len(TAP_IRPAUSE,TAP_IRPAUSE) == 7)
-       {
-               LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
-       }
-       else
-       {
-               LOG_DEBUG("ft2232 interface using shortest path jtag state transitions");
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = value;         /* value */
+       buf[2] = direction;     /* direction */
 
-       }
-       if ((ft2232_layout == NULL) || (ft2232_layout[0] == 0))
-       {
-               ft2232_layout = "usbjtag";
-               LOG_WARNING("No ft2232 layout specified, using default 'usbjtag'");
+       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize data bits low byte");
+               return ERROR_JTAG_INIT_FAILED;
        }
 
-       while (cur_layout->name)
-       {
-               if (strcmp(cur_layout->name, ft2232_layout) == 0)
-               {
-                       layout = cur_layout;
-                       break;
-               }
-               cur_layout++;
+       return ERROR_OK;
+}
+
+static int ft2232_set_data_bits_high_byte(uint8_t value, uint8_t direction)
+{
+       uint8_t buf[3];
+       uint32_t bytes_written;
+
+       buf[0] = 0x82;          /* command "set data bits high byte" */
+       buf[1] = value;         /* value */
+       buf[2] = direction;     /* direction */
+
+       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize data bits high byte");
+               return ERROR_JTAG_INIT_FAILED;
        }
 
-       if (!layout)
-       {
-               LOG_ERROR("No matching layout found for %s", ft2232_layout);
+       return ERROR_OK;
+}
+
+static int ft2232_init(void)
+{
+       uint8_t buf[1];
+       int retval;
+       uint32_t bytes_written;
+
+       if (tap_get_tms_path_len(TAP_IRPAUSE, TAP_IRPAUSE) == 7)
+               LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
+       else
+               LOG_DEBUG("ft2232 interface using shortest path jtag state transitions");
+       if (layout == NULL) {
+               LOG_WARNING("No ft2232 layout specified'");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       for (i = 0; 1; i++)
-       {
+       for (int i = 0; 1; i++) {
                /*
                 * "more indicates that there are more IDs to try, so we should
                 * not print an error for an ID mismatch (but for anything
@@ -2104,7 +2350,7 @@ static int ft2232_init(void)
                 * ID mismatch (and nothing else) and that we should proceeed
                 * with the next ID pair.
                 */
-               int more     = ft2232_vid[i + 1] || ft2232_pid[i + 1];
+               int more = ft2232_vid[i + 1] || ft2232_pid[i + 1];
                int try_more = 0;
 
 #if BUILD_FT2232_FTD2XX == 1
@@ -2112,7 +2358,7 @@ static int ft2232_init(void)
                                more, &try_more);
 #elif BUILD_FT2232_LIBFTDI == 1
                retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
-                               more, &try_more);
+                               more, &try_more, layout->channel);
 #endif
                if (retval >= 0)
                        break;
@@ -2126,25 +2372,24 @@ static int ft2232_init(void)
        if (layout->init() != ERROR_OK)
                return ERROR_JTAG_INIT_FAILED;
 
-       if (ft2232_device_is_highspeed())
-       {
+       if (ft2232_device_is_highspeed()) {
 #ifndef BUILD_FT2232_HIGHSPEED
  #if BUILD_FT2232_FTD2XX == 1
-               LOG_WARNING("High Speed device found - You need a newer FTD2XX driver (version 2.04.16 or later)");
+               LOG_WARNING(
+                       "High Speed device found - You need a newer FTD2XX driver (version 2.04.16 or later)");
  #elif BUILD_FT2232_LIBFTDI == 1
-               LOG_WARNING("High Speed device found - You need a newer libftdi version (0.16 or later)");
+               LOG_WARNING(
+                       "High Speed device found - You need a newer libftdi version (0.16 or later)");
  #endif
 #endif
                /* make sure the legacy mode is disabled */
-               if (ft2232h_ft4232h_clk_divide_by_5(false) != ERROR_OK)
+               if (ftx232h_clk_divide_by_5(false) != ERROR_OK)
                        return ERROR_JTAG_INIT_FAILED;
        }
 
-       ft2232_speed(jtag_get_speed());
-
-       buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
-       if (((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) || (bytes_written != 1))
-       {
+       buf[0] = 0x85;  /* Disconnect TDI/DO to TDO/DI for Loopback */
+       retval = ft2232_write(buf, 1, &bytes_written);
+       if (retval != ERROR_OK) {
                LOG_ERROR("couldn't write to FT2232 to disable loopback");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2158,119 +2403,153 @@ static int ft2232_init(void)
        return ERROR_OK;
 }
 
-static int usbjtag_init(void)
+/** Updates defaults for DBUS signals:  the four JTAG signals
+ * (TCK, TDI, TDO, TMS) and * the four GPIOL signals.
+ */
+static inline void ftx232_dbus_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x08;
        low_direction = 0x0b;
+}
 
-       if (strcmp(ft2232_layout, "usbjtag") == 0)
-       {
-               nTRST    = 0x10;
-               nTRSTnOE = 0x10;
-               nSRST    = 0x40;
-               nSRSTnOE = 0x40;
-       }
-       else if (strcmp(ft2232_layout, "signalyzer") == 0)
-       {
-               nTRST    = 0x10;
-               nTRSTnOE = 0x10;
-               nSRST    = 0x20;
-               nSRSTnOE = 0x20;
+/** Initializes DBUS signals:  the four JTAG signals (TCK, TDI, TDO, TMS),
+ * the four GPIOL signals.  Initialization covers value and direction,
+ * as customized for each layout.
+ */
+static int ftx232_dbus_write(void)
+{
+       enum reset_types jtag_reset_config = jtag_get_reset_config();
+       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
+               low_direction &= ~nTRSTnOE;     /* nTRST input */
+               low_output &= ~nTRST;   /* nTRST = 0 */
+       } else {
+               low_direction |= nTRSTnOE;      /* nTRST output */
+               low_output |= nTRST;            /* nTRST = 1 */
        }
-       else if (strcmp(ft2232_layout, "evb_lm3s811") == 0)
-       {
-               nTRST = 0x0;
-               nTRSTnOE = 0x00;
-               nSRST = 0x20;
-               nSRSTnOE = 0x20;
-               low_output    = 0x88;
-               low_direction = 0x8b;
+
+       if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
+               low_direction |= nSRSTnOE;      /* nSRST output */
+               low_output |= nSRST;            /* nSRST = 1 */
+       } else {
+               low_direction &= ~nSRSTnOE;     /* nSRST input */
+               low_output &= ~nSRST;   /* nSRST = 0 */
        }
-       else if (strcmp(ft2232_layout, "luminary_icdi") == 0)
-       {
-               nTRST = 0x0;
-               nTRSTnOE = 0x00;
-               nSRST = 0x20;
-               nSRSTnOE = 0x20;
-               low_output    = 0x88;
-               low_direction = 0xcb;
-       }
-       else
-       {
-               LOG_ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout);
-               return ERROR_JTAG_INIT_FAILED;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 DBUS");
+               return ERROR_JTAG_INIT_FAILED;
        }
 
-       enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-       {
-               low_direction &= ~nTRSTnOE; /* nTRST input */
-               low_output    &= ~nTRST;    /* nTRST = 0 */
-       }
-       else
-       {
-               low_direction |= nTRSTnOE;  /* nTRST output */
-               low_output    |= nTRST;     /* nTRST = 1 */
-       }
+       return ERROR_OK;
+}
 
-       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-       {
-               low_direction |= nSRSTnOE;  /* nSRST output */
-               low_output    |= nSRST;     /* nSRST = 1 */
-       }
-       else
-       {
-               low_direction &= ~nSRSTnOE; /* nSRST input */
-               low_output    &= ~nSRST;    /* nSRST = 0 */
-       }
+static int usbjtag_init(void)
+{
+       /*
+        * NOTE:  This is now _specific_ to the "usbjtag" layout.
+        * Don't try cram any more layouts into this.
+        */
+       ftx232_dbus_init();
 
-       /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, xRST high) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x40;
+       nSRSTnOE = 0x40;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
-               return ERROR_JTAG_INIT_FAILED;
-       }
+       return ftx232_dbus_write();
+}
 
-       return ERROR_OK;
+static int lm3s811_jtag_init(void)
+{
+       ftx232_dbus_init();
+
+       /* There are multiple revisions of LM3S811 eval boards:
+        * - Rev B (and older?) boards have no SWO trace support.
+        * - Rev C boards add ADBUS_6 DBG_ENn and BDBUS_4 SWO_EN;
+        *   they should use the "luminary_icdi" layout instead.
+        */
+       nTRST = 0x0;
+       nTRSTnOE = 0x00;
+       nSRST = 0x20;
+       nSRSTnOE = 0x20;
+       low_output    = 0x88;
+       low_direction = 0x8b;
+
+       return ftx232_dbus_write();
 }
 
-static int axm0432_jtag_init(void)
+static int icdi_jtag_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
+       ftx232_dbus_init();
+
+       /* Most Luminary eval boards support SWO trace output,
+        * and should use this "luminary_icdi" layout.
+        *
+        * ADBUS 0..3 are used for JTAG as usual.  GPIOs are used
+        * to switch between JTAG and SWD, or switch the ft2232 UART
+        * on the second MPSSE channel/interface (BDBUS)
+        * between (i) the stellaris UART (on Luminary boards)
+        * or (ii) SWO trace data (generic).
+        *
+        * We come up in JTAG mode and may switch to SWD later (with
+        * SWO/trace option if SWD is active).
+        *
+        * DBUS == GPIO-Lx
+        * CBUS == GPIO-Hx
+        */
+
+
+#define ICDI_JTAG_EN (1 << 7)          /* ADBUS 7 (a.k.a. DBGMOD) */
+#define ICDI_DBG_ENn (1 << 6)          /* ADBUS 6 */
+#define ICDI_SRST (1 << 5)             /* ADBUS 5 */
+
+
+       /* GPIOs on second channel/interface (UART) ... */
+#define ICDI_SWO_EN (1 << 4)           /* BDBUS 4 */
+#define ICDI_TX_SWO (1 << 1)           /* BDBUS 1 */
+#define ICDI_VCP_RX (1 << 0)           /* BDBUS 0 (to stellaris UART) */
+
+       nTRST = 0x0;
+       nTRSTnOE = 0x00;
+       nSRST = ICDI_SRST;
+       nSRSTnOE = ICDI_SRST;
+
+       low_direction |= ICDI_JTAG_EN | ICDI_DBG_ENn;
+       low_output    |= ICDI_JTAG_EN;
+       low_output    &= ~ICDI_DBG_ENn;
+
+       return ftx232_dbus_write();
+}
 
+static int signalyzer_init(void)
+{
+       ftx232_dbus_init();
+
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x20;
+       nSRSTnOE = 0x20;
+       return ftx232_dbus_write();
+}
+
+static int axm0432_jtag_init(void)
+{
        low_output    = 0x08;
        low_direction = 0x2b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if (strcmp(layout->name, "axm0432_jtag") == 0)
-       {
+       if (strcmp(layout->name, "axm0432_jtag") == 0) {
                nTRST    = 0x08;
-               nTRSTnOE = 0x0;     /* No output enable for TRST*/
+               nTRSTnOE = 0x0;         /* No output enable for TRST*/
                nSRST    = 0x04;
-               nSRSTnOE = 0x0;     /* No output enable for SRST*/
-       }
-       else
-       {
+               nSRSTnOE = 0x0;         /* No output enable for SRST*/
+       } else {
                LOG_ERROR("BUG: axm0432_jtag_init called for non axm0432 layout");
                exit(-1);
        }
@@ -2280,32 +2559,57 @@ static int axm0432_jtag_init(void)
 
        enum reset_types jtag_reset_config = jtag_get_reset_config();
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-       {
                LOG_ERROR("can't set nTRSTOE to push-pull on the Dicarlo jtag");
-       }
        else
-       {
                high_output |= nTRST;
-       }
 
        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-       {
                LOG_ERROR("can't set nSRST to push-pull on the Dicarlo jtag");
-       }
        else
-       {
                high_output |= nSRST;
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
+               return ERROR_JTAG_INIT_FAILED;
        }
 
-       /* initialize high port */
-       buf[0] = 0x82;              /* command "set data bits high byte" */
-       buf[1] = high_output;       /* value */
-       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       return ERROR_OK;
+}
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
+static int redbee_init(void)
+{
+       low_output    = 0x08;
+       low_direction = 0x2b;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       nTRST    = 0x08;
+       nTRSTnOE = 0x0;         /* No output enable for TRST*/
+       nSRST    = 0x04;
+       nSRSTnOE = 0x0;         /* No output enable for SRST*/
+
+       high_output    = 0x0;
+       high_direction = 0x0c;
+
+       enum reset_types jtag_reset_config = jtag_get_reset_config();
+       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+               LOG_ERROR("can't set nTRSTOE to push-pull on redbee");
+       else
+               high_output |= nTRST;
+
+       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+               LOG_ERROR("can't set nSRST to push-pull on redbee");
+       else
+               high_output |= nSRST;
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
@@ -2314,41 +2618,27 @@ static int axm0432_jtag_init(void)
 
 static int jtagkey_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x08;
        low_direction = 0x1b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if (strcmp(layout->name, "jtagkey") == 0)
-       {
+       if (strcmp(layout->name, "jtagkey") == 0) {
                nTRST    = 0x01;
                nTRSTnOE = 0x4;
                nSRST    = 0x02;
                nSRSTnOE = 0x08;
-       }
-       else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0)
-                        || (strcmp(layout->name, "oocdlink") == 0))
-       {
+       } else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0)
+                  || (strcmp(layout->name, "oocdlink") == 0)) {
                nTRST    = 0x02;
                nTRSTnOE = 0x1;
                nSRST    = 0x08;
                nSRSTnOE = 0x04;
-       }
-       else
-       {
+       } else {
                LOG_ERROR("BUG: jtagkey_init called for non jtagkey layout");
                exit(-1);
        }
@@ -2357,36 +2647,24 @@ static int jtagkey_init(void)
        high_direction = 0x0f;
 
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-       {
+       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
                high_output |= nTRSTnOE;
                high_output &= ~nTRST;
-       }
-       else
-       {
+       } else {
                high_output &= ~nTRSTnOE;
                high_output |= nTRST;
        }
 
-       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-       {
+       if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
                high_output &= ~nSRSTnOE;
                high_output |= nSRST;
-       }
-       else
-       {
+       } else {
                high_output |= nSRSTnOE;
                high_output &= ~nSRST;
        }
 
-       /* initialize high port */
-       buf[0] = 0x82;              /* command "set data bits high byte" */
-       buf[1] = high_output;       /* value */
-       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2396,20 +2674,11 @@ static int jtagkey_init(void)
 
 static int olimex_jtag_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x08;
        low_direction = 0x1b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2417,43 +2686,30 @@ static int olimex_jtag_init(void)
        nTRST    = 0x01;
        nTRSTnOE = 0x4;
        nSRST    = 0x02;
-       nSRSTnOE = 0x00; /* no output enable for nSRST */
+       nSRSTnOE = 0x00;/* no output enable for nSRST */
 
        high_output    = 0x0;
        high_direction = 0x0f;
 
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-       {
+       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
                high_output |= nTRSTnOE;
                high_output &= ~nTRST;
-       }
-       else
-       {
+       } else {
                high_output &= ~nTRSTnOE;
                high_output |= nTRST;
        }
 
        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-       {
                LOG_ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
-       }
        else
-       {
                high_output &= ~nSRST;
-       }
 
        /* turn red LED on */
        high_output |= 0x08;
 
-       /* initialize high port */
-       buf[0] = 0x82;              /* command "set data bits high byte" */
-       buf[1] = high_output;       /* value */
-       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2461,45 +2717,42 @@ static int olimex_jtag_init(void)
        return ERROR_OK;
 }
 
-static int flyswatter_init(void)
+static int flyswatter_init(int rev)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x18;
-       low_direction = 0xfb;
+       low_direction = 0x7b;
 
-       /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE[12]=out, n[ST]srst = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       if ((rev < 0) || (rev > 3)) {
+               LOG_ERROR("bogus 'flyswatter' revision supplied (%i)", rev);
+               return ERROR_JTAG_INIT_FAILED;
+       }
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (rev == 1)
+               low_direction |= 1 << 7;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
        nTRST    = 0x10;
-       nTRSTnOE = 0x0;     /* not output enable for nTRST */
+       nTRSTnOE = 0x0;         /* not output enable for nTRST */
        nSRST    = 0x20;
-       nSRSTnOE = 0x00;    /* no output enable for nSRST */
+       nSRSTnOE = 0x00;        /* no output enable for nSRST */
 
        high_output    = 0x00;
-       high_direction = 0x0c;
+
+       if (rev == 1)
+               high_direction = 0x0c;
+       else
+               high_direction = 0x01;
 
        /* turn red LED3 on, LED2 off */
        high_output |= 0x08;
 
-       /* initialize high port */
-       buf[0] = 0x82;              /* command "set data bits high byte" */
-       buf[1] = high_output;       /* value */
-       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2507,22 +2760,53 @@ static int flyswatter_init(void)
        return ERROR_OK;
 }
 
-static int turtle_init(void)
+static int flyswatter1_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
+       return flyswatter_init(1);
+}
 
+static int flyswatter2_init(void)
+{
+       return flyswatter_init(2);
+}
+
+static int minimodule_init(void)
+{
+       low_output    = 0x18;   /* check if srst should be 1 or 0 initially. (0x08) (flyswatter was
+                                * 0x18) */
+       low_direction = 0xfb;   /* 0xfb; */
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'minimodule' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+
+       nSRST    = 0x20;
+
+       high_output    = 0x00;
+       high_direction = 0x05;
+
+       /* turn red LED3 on, LED2 off */
+       /* high_output |= 0x08; */
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'minimodule' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       return ERROR_OK;
+}
+
+static int turtle_init(void)
+{
        low_output    = 0x08;
        low_direction = 0x5b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2532,14 +2816,8 @@ static int turtle_init(void)
        high_output    = 0x00;
        high_direction = 0x0C;
 
-       /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output;
-       buf[2] = high_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2549,40 +2827,25 @@ static int turtle_init(void)
 
 static int comstick_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x08;
        low_direction = 0x0b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
        nTRST    = 0x01;
-       nTRSTnOE = 0x00;    /* no output enable for nTRST */
+       nTRSTnOE = 0x00;        /* no output enable for nTRST */
        nSRST    = 0x02;
-       nSRSTnOE = 0x00;    /* no output enable for nSRST */
+       nSRSTnOE = 0x00;        /* no output enable for nSRST */
 
        high_output    = 0x03;
        high_direction = 0x03;
 
-       /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output;
-       buf[2] = high_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2592,40 +2855,25 @@ static int comstick_init(void)
 
 static int stm32stick_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x88;
        low_direction = 0x8b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
        nTRST    = 0x01;
-       nTRSTnOE = 0x00;    /* no output enable for nTRST */
+       nTRSTnOE = 0x00;        /* no output enable for nTRST */
        nSRST    = 0x80;
-       nSRSTnOE = 0x00;    /* no output enable for nSRST */
+       nSRSTnOE = 0x00;        /* no output enable for nSRST */
 
        high_output    = 0x01;
        high_direction = 0x03;
 
-       /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output;
-       buf[2] = high_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2635,92 +2883,166 @@ static int stm32stick_init(void)
 
 static int sheevaplug_init(void)
 {
-       uint8_t buf[3];
-       uint32_t bytes_written;
-
        low_output = 0x08;
        low_direction = 0x1b;
 
-       /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       nTRSTnOE = 0x1;
+       nTRST = 0x02;
+       nSRSTnOE = 0x4;
+       nSRST = 0x08;
+
+       high_output = 0x0;
+       high_direction = 0x0f;
+
+       /* nTRST is always push-pull */
+       high_output &= ~nTRSTnOE;
+       high_output |= nTRST;
+
+       /* nSRST is always open-drain */
+       high_output |= nSRSTnOE;
+       high_output &= ~nSRST;
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       return ERROR_OK;
+}
+
+static int cortino_jtag_init(void)
+{
+       low_output    = 0x08;
+       low_direction = 0x1b;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       nTRST    = 0x01;
+       nTRSTnOE = 0x00;        /* no output enable for nTRST */
+       nSRST    = 0x02;
+       nSRSTnOE = 0x00;        /* no output enable for nSRST */
+
+       high_output    = 0x03;
+       high_direction = 0x03;
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       return ERROR_OK;
+}
+
+static int lisa_l_init(void)
+{
+       ftx232_dbus_init();
+
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x40;
+       nSRSTnOE = 0x40;
+
+       high_output = 0x00;
+       high_direction = 0x18;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'lisa_l' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRSTnOE = 0x1;
-       nTRST = 0x02;
-       nSRSTnOE = 0x4;
-       nSRST = 0x08;
-
-       high_output = 0x0;
-       high_direction = 0x0f;
+       return ftx232_dbus_write();
+}
 
-       /* nTRST is always push-pull */
-       high_output &= ~nTRSTnOE;
-       high_output |= nTRST;
+static int flossjtag_init(void)
+{
+       ftx232_dbus_init();
 
-       /* nSRST is always open-drain */
-       high_output |= nSRSTnOE;
-       high_output &= ~nSRST;
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x40;
+       nSRSTnOE = 0x40;
 
-       /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output; /* value */
-       buf[2] = high_direction;   /* all outputs - xRST */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       high_output = 0x00;
+       high_direction = 0x18;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'Floss-JTAG' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       return ERROR_OK;
+       return ftx232_dbus_write();
 }
 
-static int cortino_jtag_init(void)
+/*
+ * The reference schematic from TI for the XDS100v2 has a CPLD on which opens
+ * the door for a number of different configurations
+ *
+ * Known Implementations:
+ * http://processors.wiki.ti.com/images/9/93/TMS570LS20216_USB_STICK_Schematic.pdf
+ *
+ * http://processors.wiki.ti.com/index.php/XDS100 (rev2)
+ *     * CLPD logic: Rising edge to enable outputs (XDS100_PWR_RST)
+ *             * ACBUS3 to transition 0->1 (OE rising edge)
+ *     * CPLD logic: Put the EMU0/1 pins in Hi-Z:
+ *             * ADBUS5/GPIOL1 = EMU_EN = 1
+ *             * ADBUS6/GPIOL2 = EMU0 = 0
+ *             * ACBUS4/SPARE0 = EMU1 = 0
+ *     * CPLD logic: Disable loopback
+ *             * ACBUS6/SPARE2 = LOOPBACK = 0
+ */
+#define XDS100_nEMU_EN  (1<<5)
+#define XDS100_nEMU0    (1<<6)
+
+#define XDS100_PWR_RST  (1<<3)
+#define XDS100_nEMU1    (1<<4)
+#define XDS100_LOOPBACK (1<<6)
+static int xds100v2_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
+       /* These are in the lower byte */
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
 
-       low_output    = 0x08;
-       low_direction = 0x1b;
+       /* These aren't actually used on 14 pin connectors
+        * These are in the upper byte */
+       nSRST    = 0x01;
+       nSRSTnOE = 0x01;
 
-       /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;    /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       low_output    = 0x08 | nTRST | XDS100_nEMU_EN;
+       low_direction = 0x0b | nTRSTnOE | XDS100_nEMU_EN | XDS100_nEMU0;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRST    = 0x01;
-       nTRSTnOE = 0x00;    /* no output enable for nTRST */
-       nSRST    = 0x02;
-       nSRSTnOE = 0x00;    /* no output enable for nSRST */
+       high_output = 0;
+       high_direction = nSRSTnOE | XDS100_LOOPBACK | XDS100_PWR_RST | XDS100_nEMU1;
 
-       high_output    = 0x03;
-       high_direction = 0x03;
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't put CPLD in to reset with 'xds100v2' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
 
-       /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output;
-       buf[2] = high_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
+       high_output |= XDS100_PWR_RST;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
-               LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't bring CPLD out of reset with 'xds100v2' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
@@ -2732,32 +3054,34 @@ static void olimex_jtag_blink(void)
        /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
         * ACBUS3 is bit 3 of the GPIOH port
         */
-       if (high_output & 0x08)
-       {
-               /* set port pin high */
-               high_output &= 0x07;
-       }
-       else
-       {
-               /* set port pin low */
-               high_output |= 0x08;
-       }
+       high_output ^= 0x08;
 
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
 }
 
-static void flyswatter_jtag_blink(void)
+static void flyswatter_jtag_blink(unsigned char led)
+{
+       buffer_write(0x82);
+       buffer_write(high_output ^ led);
+       buffer_write(high_direction);
+}
+
+static void flyswatter1_jtag_blink(void)
 {
        /*
         * Flyswatter has two LEDs connected to ACBUS2 and ACBUS3
         */
-       high_output ^= 0x0c;
+       flyswatter_jtag_blink(0xc);
+}
 
-       buffer_write(0x82);
-       buffer_write(high_output);
-       buffer_write(high_direction);
+static void flyswatter2_jtag_blink(void)
+{
+       /*
+        * Flyswatter2 only has one LED connected to ACBUS2
+        */
+       flyswatter_jtag_blink(0x4);
 }
 
 static void turtle_jtag_blink(void)
@@ -2766,13 +3090,39 @@ static void turtle_jtag_blink(void)
         * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
         */
        if (high_output & 0x08)
-       {
                high_output = 0x04;
-       }
        else
-       {
                high_output = 0x08;
-       }
+
+       buffer_write(0x82);
+       buffer_write(high_output);
+       buffer_write(high_direction);
+}
+
+static void lisa_l_blink(void)
+{
+       /*
+        * Lisa/L has two LEDs connected to BCBUS3 and BCBUS4
+        */
+       if (high_output & 0x10)
+               high_output = 0x08;
+       else
+               high_output = 0x10;
+
+       buffer_write(0x82);
+       buffer_write(high_output);
+       buffer_write(high_direction);
+}
+
+static void flossjtag_blink(void)
+{
+       /*
+        * Floss-JTAG has two LEDs connected to ACBUS3 and ACBUS4
+        */
+       if (high_output & 0x10)
+               high_output = 0x08;
+       else
+               high_output = 0x10;
 
        buffer_write(0x82);
        buffer_write(high_output);
@@ -2801,32 +3151,28 @@ COMMAND_HANDLER(ft2232_handle_device_desc_command)
 {
        char *cp;
        char buf[200];
-       if (CMD_ARGC == 1)
-       {
+       if (CMD_ARGC == 1) {
                ft2232_device_desc = strdup(CMD_ARGV[0]);
                cp = strchr(ft2232_device_desc, 0);
                /* under Win32, the FTD2XX driver appends an "A" to the end
                 * of the description, this examines the given desc
                 * and creates the 'missing' _A or non_A variable. */
-               if ((cp[-1] == 'A') && (cp[-2]==' ')) {
+               if ((cp[-1] == 'A') && (cp[-2] == ' ')) {
                        /* it was, so make this the "A" version. */
                        ft2232_device_desc_A = ft2232_device_desc;
                        /* and *CREATE* the non-A version. */
                        strcpy(buf, ft2232_device_desc);
                        cp = strchr(buf, 0);
                        cp[-2] = 0;
-                       ft2232_device_desc =  strdup(buf);
+                       ft2232_device_desc = strdup(buf);
                } else {
                        /* <space > A not defined
                         * so create it */
                        sprintf(buf, "%s A", ft2232_device_desc);
                        ft2232_device_desc_A = strdup(buf);
                }
-       }
-       else
-       {
+       } else
                LOG_ERROR("expected exactly one argument to ft2232_device_desc <description>");
-       }
 
        return ERROR_OK;
 }
@@ -2834,38 +3180,45 @@ COMMAND_HANDLER(ft2232_handle_device_desc_command)
 COMMAND_HANDLER(ft2232_handle_serial_command)
 {
        if (CMD_ARGC == 1)
-       {
                ft2232_serial = strdup(CMD_ARGV[0]);
-       }
        else
-       {
-               LOG_ERROR("expected exactly one argument to ft2232_serial <serial-number>");
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        return ERROR_OK;
 }
 
 COMMAND_HANDLER(ft2232_handle_layout_command)
 {
-       if (CMD_ARGC == 0)
-               return ERROR_OK;
+       if (CMD_ARGC != 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
-       ft2232_layout = malloc(strlen(CMD_ARGV[0]) + 1);
-       strcpy(ft2232_layout, CMD_ARGV[0]);
+       if (layout) {
+               LOG_ERROR("already specified ft2232_layout %s",
+                       layout->name);
+               return (strcmp(layout->name, CMD_ARGV[0]) != 0)
+                      ? ERROR_FAIL
+                      : ERROR_OK;
+       }
 
-       return ERROR_OK;
+       for (const struct ft2232_layout *l = ft2232_layouts; l->name; l++) {
+               if (strcmp(l->name, CMD_ARGV[0]) == 0) {
+                       layout = l;
+                       return ERROR_OK;
+               }
+       }
+
+       LOG_ERROR("No FT2232 layout '%s' found", CMD_ARGV[0]);
+       return ERROR_FAIL;
 }
 
 COMMAND_HANDLER(ft2232_handle_vid_pid_command)
 {
-       if (CMD_ARGC > MAX_USB_IDS * 2)
-       {
+       if (CMD_ARGC > MAX_USB_IDS * 2) {
                LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
-                                       "(maximum is %d pairs)", MAX_USB_IDS);
+                       "(maximum is %d pairs)", MAX_USB_IDS);
                CMD_ARGC = MAX_USB_IDS * 2;
        }
-       if (CMD_ARGC < 2 || (CMD_ARGC & 1))
-       {
+       if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
                LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
                if (CMD_ARGC < 2)
                        return ERROR_COMMAND_SYNTAX_ERROR;
@@ -2874,8 +3227,7 @@ COMMAND_HANDLER(ft2232_handle_vid_pid_command)
        }
 
        unsigned i;
-       for (i = 0; i < CMD_ARGC; i += 2)
-       {
+       for (i = 0; i < CMD_ARGC; i += 2) {
                COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], ft2232_vid[i >> 1]);
                COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], ft2232_pid[i >> 1]);
        }
@@ -2892,34 +3244,28 @@ COMMAND_HANDLER(ft2232_handle_vid_pid_command)
 COMMAND_HANDLER(ft2232_handle_latency_command)
 {
        if (CMD_ARGC == 1)
-       {
                ft2232_latency = atoi(CMD_ARGV[0]);
-       }
        else
-       {
-               LOG_ERROR("expected exactly one argument to ft2232_latency <ms>");
-       }
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        return ERROR_OK;
 }
 
-static int ft2232_stableclocks(int num_cycles, struct jtag_commandcmd)
+static int ft2232_stableclocks(int num_cycles, struct jtag_command *cmd)
 {
        int retval = 0;
 
        /* 7 bits of either ones or zeros. */
-       uint8_t  tms = (tap_get_state() == TAP_RESET ? 0x7F : 0x00);
+       uint8_t tms = (tap_get_state() == TAP_RESET ? 0x7F : 0x00);
 
-       while (num_cycles > 0)
-       {
+       while (num_cycles > 0) {
                /* the command 0x4b, "Clock Data to TMS/CS Pin (no Read)" handles
                 * at most 7 bits per invocation.  Here we invoke it potentially
                 * several times.
                 */
                int bitcount_per_command = (num_cycles > 7) ? 7 : num_cycles;
 
-               if (ft2232_buffer_size + 3 >= FT2232_BUFFER_SIZE)
-               {
+               if (ft2232_buffer_size + 3 >= FT2232_BUFFER_SIZE) {
                        if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                                retval = ERROR_JTAG_QUEUE_FAILED;
 
@@ -2971,34 +3317,26 @@ static int ft2232_stableclocks(int num_cycles, struct jtag_command* cmd)
  * ADBUS6 -   VCC
  * ADBUS7 -   GND
  */
-static int icebear_jtag_init(void) {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
-       low_direction   = 0x0b; /* output: TCK TDI TMS; input: TDO */
-       low_output      = 0x08; /* high: TMS; low: TCK TDI */
-       nTRST           = 0x10;
-       nSRST           = 0x20;
+static int icebear_jtag_init(void)
+{
+       low_direction   = 0x0b; /* output: TCK TDI TMS; input: TDO */
+       low_output      = 0x08; /* high: TMS; low: TCK TDI */
+       nTRST           = 0x10;
+       nSRST           = 0x20;
 
        enum reset_types jtag_reset_config = jtag_get_reset_config();
-       if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0) {
-               low_direction   &= ~nTRST;      /* nTRST high impedance */
-       }
+       if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0)
+               low_direction   &= ~nTRST;      /* nTRST high impedance */
        else {
-               low_direction   |= nTRST;
-               low_output      |= nTRST;
+               low_direction   |= nTRST;
+               low_output      |= nTRST;
        }
 
-       low_direction   |= nSRST;
-       low_output      |= nSRST;
+       low_direction   |= nSRST;
+       low_output      |= nSRST;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80;          /* command "set data bits low byte" */
-       buf[1] = low_output;
-       buf[2] = low_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -3006,14 +3344,8 @@ static int icebear_jtag_init(void) {
        high_output    = 0x0;
        high_direction = 0x00;
 
-
-       /* initialize high port */
-       buf[0] = 0x82;              /* command "set data bits high byte" */
-       buf[1] = high_output;       /* value */
-       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -3021,33 +3353,34 @@ static int icebear_jtag_init(void) {
        return ERROR_OK;
 }
 
-static void icebear_jtag_reset(int trst, int srst) {
-
+static void icebear_jtag_reset(int trst, int srst)
+{
        if (trst == 1) {
-               low_direction   |= nTRST;
-               low_output      &= ~nTRST;
-       }
-       else if (trst == 0) {
+               low_direction   |= nTRST;
+               low_output      &= ~nTRST;
+       } else if (trst == 0) {
                enum reset_types jtag_reset_config = jtag_get_reset_config();
                if ((jtag_reset_config & RESET_TRST_OPEN_DRAIN) != 0)
-                       low_direction   &= ~nTRST;
+                       low_direction   &= ~nTRST;
                else
-                       low_output      |= nTRST;
+                       low_output      |= nTRST;
        }
 
-       if (srst == 1) {
+       if (srst == 1)
                low_output &= ~nSRST;
-       }
-       else if (srst == 0) {
+       else if (srst == 0)
                low_output |= nSRST;
-       }
 
        /* command "set data bits low byte" */
        buffer_write(0x80);
        buffer_write(low_output);
        buffer_write(low_direction);
 
-       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
+       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x",
+               trst,
+               srst,
+               low_output,
+               low_direction);
 }
 
 /* ---------------------------------------------------------------------
@@ -3128,33 +3461,35 @@ static int signalyzer_h_led_set(unsigned char channel, unsigned char led,
 #if BUILD_FT2232_FTD2XX == 1
        FT_STATUS status;
 
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
-                       ((uint32_t)(channel << 8) | led))) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                       ((uint32_t)(channel << 8) | led));
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 1),
-                       ((uint32_t)(on_time << 8) | off_time))) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+       status = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 1),
+                       ((uint32_t)(on_time << 8) | off_time));
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 2),
-                       ((uint32_t)cycles))) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+       status = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 2),
+                       ((uint32_t)cycles));
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                       SIGNALYZER_COMMAND_LED_SET)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                               SIGNALYZER_COMMAND_LED_SET);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
@@ -3162,37 +3497,35 @@ static int signalyzer_h_led_set(unsigned char channel, unsigned char led,
 #elif BUILD_FT2232_LIBFTDI == 1
        int retval;
 
-       if ((retval = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
-                       ((uint32_t)(channel << 8) | led))) < 0)
-       {
+       retval = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               ((uint32_t)(channel << 8) | led));
+       if (retval < 0) {
                LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
-                               ftdi_get_error_string(&ftdic));
+                       ftdi_get_error_string(&ftdic));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((retval = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 1),
-                       ((uint32_t)(on_time << 8) | off_time))) < 0)
-       {
+       retval = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 1),
+                       ((uint32_t)(on_time << 8) | off_time));
+       if (retval < 0) {
                LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
-                               ftdi_get_error_string(&ftdic));
+                       ftdi_get_error_string(&ftdic));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((retval = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 2),
-                       (uint32_t)cycles)) < 0)
-       {
+       retval = signalyzer_h_ctrl_write((SIGNALYZER_DATA_BUFFER_ADDR + 2),
+                       (uint32_t)cycles);
+       if (retval < 0) {
                LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
-                               ftdi_get_error_string(&ftdic));
+                       ftdi_get_error_string(&ftdic));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((retval = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                       SIGNALYZER_COMMAND_LED_SET)) < 0)
-       {
+       retval = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                       SIGNALYZER_COMMAND_LED_SET);
+       if (retval < 0) {
                LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
-                               ftdi_get_error_string(&ftdic));
+                       ftdi_get_error_string(&ftdic));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
@@ -3210,12 +3543,10 @@ static int signalyzer_h_init(void)
        char *end_of_desc;
 
        uint16_t read_buf[12] = { 0 };
-       uint8_t  buf[3];
-       uint32_t bytes_written;
 
        /* turn on center green led */
        signalyzer_h_led_set(SIGNALYZER_CHAN_C, SIGNALYZER_LED_GREEN,
-                       0xFFFF, 0x00, 0x00);
+               0xFFFF, 0x00, 0x00);
 
        /* determine what channel config wants to open
         * TODO: change me... current implementation is made to work
@@ -3223,120 +3554,118 @@ static int signalyzer_h_init(void)
         */
        end_of_desc = strrchr(ft2232_device_desc, 0x00);
 
-       if (end_of_desc)
-       {
+       if (end_of_desc) {
                signalyzer_h_side = *(end_of_desc - 1);
                if (signalyzer_h_side == 'B')
                        signalyzer_h_side = SIGNALYZER_CHAN_B;
                else
                        signalyzer_h_side = SIGNALYZER_CHAN_A;
-       }
-       else
-       {
+       } else {
                LOG_ERROR("No Channel was specified");
                return ERROR_FAIL;
        }
 
        signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_GREEN,
-                       1000, 1000, 0xFF);
+               1000, 1000, 0xFF);
 
 #if BUILD_FT2232_FTD2XX == 1
        /* read signalyzer versionining information */
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                       SIGNALYZER_COMMAND_VERSION)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                       SIGNALYZER_COMMAND_VERSION);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       for (i = 0; i < 10; i++)
-       {
-               if ((status = signalyzer_h_ctrl_read(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + i),
-                       &read_buf[i])) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_read returned: %lu",
-                                       status);
+       for (i = 0; i < 10; i++) {
+               status = signalyzer_h_ctrl_read((SIGNALYZER_DATA_BUFFER_ADDR + i),
+                               &read_buf[i]);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
        }
 
        LOG_INFO("Signalyzer: ID info: { %.4x %.4x %.4x %.4x %.4x %.4x %.4x }",
-                       read_buf[0], read_buf[1], read_buf[2], read_buf[3],
-                       read_buf[4], read_buf[5], read_buf[6]);
+               read_buf[0], read_buf[1], read_buf[2], read_buf[3],
+               read_buf[4], read_buf[5], read_buf[6]);
 
        /* set gpio register */
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
-                       (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                       (uint32_t)(signalyzer_h_side << 8));
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1,
-                       0x0404)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0404);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                       SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                       SIGNALYZER_COMMAND_GPIO_STATE);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
        /* read adapter type information */
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
-                       ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                       ((uint32_t)(signalyzer_h_side << 8) | 0x01));
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 1), 0xA000)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(
+                       (SIGNALYZER_DATA_BUFFER_ADDR + 1), 0xA000);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(
-                       (SIGNALYZER_DATA_BUFFER_ADDR + 2), 0x0008)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(
+                       (SIGNALYZER_DATA_BUFFER_ADDR + 2), 0x0008);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                       SIGNALYZER_COMMAND_I2C)) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+       status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                       SIGNALYZER_COMMAND_I2C);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
        usleep(100000);
 
-       if ((status = signalyzer_h_ctrl_read(SIGNALYZER_COMMAND_ADDR,
-                       &read_buf[0])) != FT_OK)
-       {
-               LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", status);
+       status = signalyzer_h_ctrl_read(SIGNALYZER_COMMAND_ADDR, &read_buf[0]);
+       if (status != FT_OK) {
+               LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
+                       ftd2xx_status_string(status));
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
        if (read_buf[0] != 0x0498)
                signalyzer_h_adapter_type = 0x0000;
-       else
-       {
-               for (i = 0; i < 4; i++)
-               {
-                       if ((status = signalyzer_h_ctrl_read(
-                                       (SIGNALYZER_DATA_BUFFER_ADDR + i),
-                                       &read_buf[i])) != FT_OK)
-                       {
-                               LOG_ERROR("signalyzer_h_ctrl_read returned: %lu",
-                                       status);
+       else {
+               for (i = 0; i < 4; i++) {
+                       status = signalyzer_h_ctrl_read((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i]);
+                       if (status != FT_OK) {
+                               LOG_ERROR("signalyzer_h_ctrl_read returned: %s",
+                                       ftd2xx_status_string(status));
                                return ERROR_JTAG_DEVICE_ERROR;
                        }
                }
@@ -3355,8 +3684,7 @@ static int signalyzer_h_init(void)
        enum reset_types jtag_reset_config = jtag_get_reset_config();
 
        /* ADAPTOR: EM_LT16_A */
-       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A)
-       {
+       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) {
                LOG_INFO("Signalyzer: EM-LT (16-channel level translator) "
                        "detected. (HW: %2x).", (read_buf[1] >> 8));
 
@@ -3371,126 +3699,108 @@ static int signalyzer_h_init(void)
                high_output    = 0x0;
                high_direction = 0x0;
 
-               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-               {
-                       low_direction &= ~nTRSTnOE; /* nTRST input */
-                       low_output    &= ~nTRST;    /* nTRST = 0 */
-               }
-               else
-               {
-                       low_direction |= nTRSTnOE;  /* nTRST output */
-                       low_output    |= nTRST;     /* nTRST = 1 */
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
+                       low_direction &= ~nTRSTnOE;     /* nTRST input */
+                       low_output    &= ~nTRST;        /* nTRST = 0 */
+               } else {
+                       low_direction |= nTRSTnOE;      /* nTRST output */
+                       low_output    |= nTRST;         /* nTRST = 1 */
                }
 
-               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-               {
-                       low_direction |= nSRSTnOE;  /* nSRST output */
-                       low_output    |= nSRST;     /* nSRST = 1 */
-               }
-               else
-               {
-                       low_direction &= ~nSRSTnOE; /* nSRST input */
-                       low_output    &= ~nSRST;    /* nSRST = 0 */
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
+                       low_direction |= nSRSTnOE;      /* nSRST output */
+                       low_output    |= nSRST;         /* nSRST = 1 */
+               } else {
+                       low_direction &= ~nSRSTnOE;     /* nSRST input */
+                       low_output    &= ~nSRST;        /* nSRST = 0 */
                }
 
 #if BUILD_FT2232_FTD2XX == 1
                /* enable power to the module */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               ((uint32_t)(signalyzer_h_side << 8) | 0x01)))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                               status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               ((uint32_t)(signalyzer_h_side << 8) | 0x01));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                               SIGNALYZER_COMMAND_POWERCONTROL_SET);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
                /* set gpio mode register */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               (uint32_t)(signalyzer_h_side << 8));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
                /* set gpio register */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               (uint32_t)(signalyzer_h_side << 8));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                               SIGNALYZER_COMMAND_GPIO_STATE);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 #endif
        }
-
        /* ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */
        else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P))
-       {
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) {
                if (signalyzer_h_adapter_type
-                               == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG)
+                   == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG)
                        LOG_INFO("Signalyzer: EM-ARM-JTAG (ARM JTAG) "
                                "detected. (HW: %2x).", (read_buf[1] >> 8));
                else if (signalyzer_h_adapter_type
-                               == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P)
+                        == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P)
                        LOG_INFO("Signalyzer: EM-ARM-JTAG_P "
                                "(ARM JTAG with PSU) detected. (HW: %2x).",
                                (read_buf[1] >> 8));
                else if (signalyzer_h_adapter_type
-                               == SIGNALYZER_MODULE_TYPE_EM_JTAG)
+                        == SIGNALYZER_MODULE_TYPE_EM_JTAG)
                        LOG_INFO("Signalyzer: EM-JTAG (Generic JTAG) "
                                "detected. (HW: %2x).", (read_buf[1] >> 8));
                else if (signalyzer_h_adapter_type
-                               == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)
+                        == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)
                        LOG_INFO("Signalyzer: EM-JTAG-P "
                                "(Generic JTAG with PSU) detected. (HW: %2x).",
                                (read_buf[1] >> 8));
@@ -3506,113 +3816,91 @@ static int signalyzer_h_init(void)
                high_output    = 0x0;
                high_direction = 0x1f;
 
-               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-               {
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
                        high_output |= nTRSTnOE;
                        high_output &= ~nTRST;
-               }
-               else
-               {
+               } else {
                        high_output &= ~nTRSTnOE;
                        high_output |= nTRST;
                }
 
-               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-               {
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
                        high_output &= ~nSRSTnOE;
                        high_output |= nSRST;
-               }
-               else
-               {
+               } else {
                        high_output |= nSRSTnOE;
                        high_output &= ~nSRST;
                }
 
 #if BUILD_FT2232_FTD2XX == 1
                /* enable power to the module */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               ((uint32_t)(signalyzer_h_side << 8) | 0x01)))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               ((uint32_t)(signalyzer_h_side << 8) | 0x01));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR,
+                               SIGNALYZER_COMMAND_POWERCONTROL_SET);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
                /* set gpio mode register (IO_16 and IO_17 set as analog
                 * inputs, other is gpio)
                 */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               (uint32_t)(signalyzer_h_side << 8));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
                /* set gpio register (all inputs, for -P modules,
                 * PSU will be turned off)
                 */
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR,
-                               (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR,
+                               (uint32_t)(signalyzer_h_side << 8));
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000))
-                       != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               if ((status = signalyzer_h_ctrl_write(
-                               SIGNALYZER_COMMAND_ADDR,
-                               SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
-               {
-                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu",
-                                       status);
+               status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_STATE);
+               if (status != FT_OK) {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s",
+                               ftd2xx_status_string(status));
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 #endif
-       }
-
-       else if (signalyzer_h_adapter_type == 0x0000)
-       {
+       } else if (signalyzer_h_adapter_type == 0x0000) {
                LOG_INFO("Signalyzer: No external modules were detected.");
 
                nTRST    = 0x10;
@@ -3626,73 +3914,45 @@ static int signalyzer_h_init(void)
                high_output    = 0x0;
                high_direction = 0x0;
 
-               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-               {
-                       low_direction &= ~nTRSTnOE; /* nTRST input */
-                       low_output    &= ~nTRST;    /* nTRST = 0 */
-               }
-               else
-               {
-                       low_direction |= nTRSTnOE;  /* nTRST output */
-                       low_output    |= nTRST;     /* nTRST = 1 */
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) {
+                       low_direction &= ~nTRSTnOE;     /* nTRST input */
+                       low_output    &= ~nTRST;        /* nTRST = 0 */
+               } else {
+                       low_direction |= nTRSTnOE;      /* nTRST output */
+                       low_output    |= nTRST;         /* nTRST = 1 */
                }
 
-               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-               {
-                       low_direction |= nSRSTnOE;  /* nSRST output */
-                       low_output    |= nSRST;     /* nSRST = 1 */
-               }
-               else
-               {
-                       low_direction &= ~nSRSTnOE; /* nSRST input */
-                       low_output    &= ~nSRST;    /* nSRST = 0 */
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL) {
+                       low_direction |= nSRSTnOE;      /* nSRST output */
+                       low_output    |= nSRST;         /* nSRST = 1 */
+               } else {
+                       low_direction &= ~nSRSTnOE;     /* nSRST input */
+                       low_output    &= ~nSRST;        /* nSRST = 0 */
                }
-       }
-       else
-       {
+       } else {
                LOG_ERROR("Unknown module type is detected: %.4x",
-                               signalyzer_h_adapter_type);
+                       signalyzer_h_adapter_type);
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
        /* initialize low byte of controller for jtag operation */
-       buf[0] = 0x80;
-       buf[1] = low_output;
-       buf[2] = low_direction;
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK)
-                       || (bytes_written != 3))
-       {
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize Signalyzer-H layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
 #if BUILD_FT2232_FTD2XX == 1
-       if (ftdi_device == FT_DEVICE_2232H)
-       {
+       if (ftdi_device == FT_DEVICE_2232H) {
                /* initialize high byte of controller for jtag operation */
-               buf[0] = 0x82;
-               buf[1] = high_output;
-               buf[2] = high_direction;
-
-               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK)
-                               || (bytes_written != 3))
-               {
+               if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                        LOG_ERROR("couldn't initialize Signalyzer-H layout");
                        return ERROR_JTAG_INIT_FAILED;
                }
        }
 #elif BUILD_FT2232_LIBFTDI == 1
-       if (ftdi_device == TYPE_2232H)
-       {
+       if (ftdi_device == TYPE_2232H) {
                /* initialize high byte of controller for jtag operation */
-               buf[0] = 0x82;
-               buf[1] = high_output;
-               buf[2] = high_direction;
-
-               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK)
-                               || (bytes_written != 3))
-               {
+               if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                        LOG_ERROR("couldn't initialize Signalyzer-H layout");
                        return ERROR_JTAG_INIT_FAILED;
                }
@@ -3706,19 +3966,15 @@ static void signalyzer_h_reset(int trst, int srst)
        enum reset_types jtag_reset_config = jtag_get_reset_config();
 
        /* ADAPTOR: EM_LT16_A */
-       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A)
-       {
-               if (trst == 1)
-               {
+       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A) {
+               if (trst == 1) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                /* switch to output pin (output is low) */
                                low_direction |= nTRSTnOE;
                        else
                                /* switch output low */
                                low_output &= ~nTRST;
-               }
-               else if (trst == 0)
-               {
+               } else if (trst == 0) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                /* switch to input pin (high-Z + internal
                                 * and external pullup) */
@@ -3728,17 +3984,14 @@ static void signalyzer_h_reset(int trst, int srst)
                                low_output |= nTRST;
                }
 
-               if (srst == 1)
-               {
+               if (srst == 1) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                /* switch output low */
                                low_output &= ~nSRST;
                        else
                                /* switch to output pin (output is low) */
                                low_direction |= nSRSTnOE;
-               }
-               else if (srst == 0)
-               {
+               } else if (srst == 0) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                /* switch output high */
                                low_output |= nSRST;
@@ -3752,39 +4005,32 @@ static void signalyzer_h_reset(int trst, int srst)
                buffer_write(low_output);
                buffer_write(low_direction);
                LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, "
-                               "low_direction: 0x%2.2x",
-                               trst, srst, low_output, low_direction);
+                       "low_direction: 0x%2.2x",
+                       trst, srst, low_output, low_direction);
        }
        /* ADAPTOR: EM_ARM_JTAG,  EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P */
        else if ((signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
-                               (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P))
-       {
-               if (trst == 1)
-               {
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
+                (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_JTAG_P)) {
+               if (trst == 1) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                high_output &= ~nTRSTnOE;
                        else
                                high_output &= ~nTRST;
-               }
-               else if (trst == 0)
-               {
+               } else if (trst == 0) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                high_output |= nTRSTnOE;
                        else
                                high_output |= nTRST;
                }
 
-               if (srst == 1)
-               {
+               if (srst == 1) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                high_output &= ~nSRST;
                        else
                                high_output &= ~nSRSTnOE;
-               }
-               else if (srst == 0)
-               {
+               } else if (srst == 0) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                high_output |= nSRST;
                        else
@@ -3796,22 +4042,17 @@ static void signalyzer_h_reset(int trst, int srst)
                buffer_write(high_output);
                buffer_write(high_direction);
                LOG_INFO("trst: %i, srst: %i, high_output: 0x%2.2x, "
-                               "high_direction: 0x%2.2x",
-                               trst, srst, high_output, high_direction);
-       }
-       else if (signalyzer_h_adapter_type == 0x0000)
-       {
-               if (trst == 1)
-               {
+                       "high_direction: 0x%2.2x",
+                       trst, srst, high_output, high_direction);
+       } else if (signalyzer_h_adapter_type == 0x0000) {
+               if (trst == 1) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                /* switch to output pin (output is low) */
                                low_direction |= nTRSTnOE;
                        else
                                /* switch output low */
                                low_output &= ~nTRST;
-               }
-               else if (trst == 0)
-               {
+               } else if (trst == 0) {
                        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                                /* switch to input pin (high-Z + internal
                                 * and external pullup) */
@@ -3821,17 +4062,14 @@ static void signalyzer_h_reset(int trst, int srst)
                                low_output |= nTRST;
                }
 
-               if (srst == 1)
-               {
+               if (srst == 1) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                /* switch output low */
                                low_output &= ~nSRST;
                        else
                                /* switch to output pin (output is low) */
                                low_direction |= nSRSTnOE;
-               }
-               else if (srst == 0)
-               {
+               } else if (srst == 0) {
                        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
                                /* switch output high */
                                low_output |= nSRST;
@@ -3845,8 +4083,8 @@ static void signalyzer_h_reset(int trst, int srst)
                buffer_write(low_output);
                buffer_write(low_direction);
                LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, "
-                               "low_direction: 0x%2.2x",
-                               trst, srst, low_output, low_direction);
+                       "low_direction: 0x%2.2x",
+                       trst, srst, low_output, low_direction);
        }
 }
 
@@ -3862,21 +4100,13 @@ static void signalyzer_h_blink(void)
  *******************************************************************/
 static int ktlink_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-       uint8_t  swd_en = 0x20; //0x20 SWD disable, 0x00 SWD enable (ADBUS5)
+       uint8_t swd_en = 0x20;  /* 0x20 SWD disable, 0x00 SWD enable (ADBUS5) */
 
-       low_output    = 0x08 | swd_en; // value; TMS=1,TCK=0,TDI=0,SWD=swd_en
-       low_direction = 0x3B;          // out=1; TCK/TDI/TMS=out,TDO=in,SWD=out,RTCK=in,SRSTIN=in
+       low_output    = 0x08 | swd_en;  /* value; TMS=1,TCK=0,TDI=0,SWD=swd_en */
+       low_direction = 0x3B;           /* out=1; TCK/TDI/TMS=out,TDO=in,SWD=out,RTCK=in,SRSTIN=in */
 
-       // initialize low port
-       buf[0] = 0x80;          // command "set data bits low byte"
-       buf[1] = low_output;
-       buf[2] = low_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -3886,8 +4116,8 @@ static int ktlink_init(void)
        nTRSTnOE = 0x04;
        nSRSTnOE = 0x08;
 
-       high_output    = 0x80; // turn LED on
-       high_direction = 0xFF; // all outputs
+       high_output    = 0x80;  /* turn LED on */
+       high_direction = 0xFF;  /* all outputs */
 
        enum reset_types jtag_reset_config = jtag_get_reset_config();
 
@@ -3907,14 +4137,8 @@ static int ktlink_init(void)
                high_output &= ~nSRST;
        }
 
-       // initialize high port
-       buf[0] = 0x82;              // command "set data bits high byte"
-       buf[1] = high_output;       // value
-       buf[2] = high_direction;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
-       {
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output, high_direction) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -3950,39 +4174,67 @@ static void ktlink_reset(int trst, int srst)
                        high_output |= nSRSTnOE;
        }
 
-       buffer_write(0x82); // command "set data bits high byte"
+       buffer_write(0x82);     /* command "set data bits high byte" */
        buffer_write(high_output);
        buffer_write(high_direction);
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x",
+               trst,
+               srst,
+               high_output,
+               high_direction);
 }
 
 static void ktlink_blink(void)
 {
        /* LED connected to ACBUS7 */
-       if (high_output & 0x80)
-               high_output &= 0x7F;
-       else
-               high_output |= 0x80;
+       high_output ^= 0x80;
 
-       buffer_write(0x82);  // command "set data bits high byte"
+       buffer_write(0x82);     /* command "set data bits high byte" */
        buffer_write(high_output);
        buffer_write(high_direction);
 }
 
+/********************************************************************
+ * Support for Digilent HS-1
+ * JTAG adapter from Digilent
+ * http://www.digilent.com
+ * Author: Stephane Bonnet bonnetst@hds.utc.fr
+ *******************************************************************/
+
+static int digilent_hs1_init(void)
+{
+       /* the adapter only supports the base JTAG signals, no nTRST
+          nor nSRST */
+       low_output      = 0x88;
+       low_direction   = 0x8b;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output, low_direction) != ERROR_OK) {
+               LOG_ERROR("couldn't initialize FT2232 with 'digilent_hs1' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+       return ERROR_OK;
+}
+
+static void digilent_hs1_reset(int trst, int srst)
+{
+       /* Dummy function, no reset signals supported. */
+}
+
 static const struct command_registration ft2232_command_handlers[] = {
        {
                .name = "ft2232_device_desc",
                .handler = &ft2232_handle_device_desc_command,
                .mode = COMMAND_CONFIG,
                .help = "set the USB device description of the FTDI FT2232 device",
-               .usage = "<description>",
+               .usage = "description_string",
        },
        {
                .name = "ft2232_serial",
                .handler = &ft2232_handle_serial_command,
                .mode = COMMAND_CONFIG,
                .help = "set the serial number of the FTDI FT2232 device",
-               .usage = "<serial#>",
+               .usage = "serial_string",
        },
        {
                .name = "ft2232_layout",
@@ -3990,32 +4242,35 @@ static const struct command_registration ft2232_command_handlers[] = {
                .mode = COMMAND_CONFIG,
                .help = "set the layout of the FT2232 GPIO signals used "
                        "to control output-enables and reset signals",
-               .usage = "<layout>",
+               .usage = "layout_name",
        },
        {
                .name = "ft2232_vid_pid",
                .handler = &ft2232_handle_vid_pid_command,
                .mode = COMMAND_CONFIG,
                .help = "the vendor ID and product ID of the FTDI FT2232 device",
-               .usage = "<vid> <pid> [...]",
+               .usage = "(vid pid)* ",
        },
        {
                .name = "ft2232_latency",
                .handler = &ft2232_handle_latency_command,
                .mode = COMMAND_CONFIG,
                .help = "set the FT2232 latency timer to a new value",
-               .usage = "<vid> <pid> [...]",
+               .usage = "value",
        },
        COMMAND_REGISTRATION_DONE
 };
 
 struct jtag_interface ft2232_interface = {
-               .name = "ft2232",
-               .commands = ft2232_command_handlers,
-               .init = &ft2232_init,
-               .quit = &ft2232_quit,
-               .speed = &ft2232_speed,
-               .speed_div = &ft2232_speed_div,
-               .khz = &ft2232_khz,
-               .execute_queue = &ft2232_execute_queue,
-       };
+       .name = "ft2232",
+       .supported = DEBUG_CAP_TMS_SEQ,
+       .commands = ft2232_command_handlers,
+       .transports = jtag_only,
+
+       .init = ft2232_init,
+       .quit = ft2232_quit,
+       .speed = ft2232_speed,
+       .speed_div = ft2232_speed_div,
+       .khz = ft2232_khz,
+       .execute_queue = ft2232_execute_queue,
+};