comments for Luminary ICDI layout
[fw/openocd] / src / jtag / drivers / ft2232.c
index 93d1c4a809ba07716ab2914d43a58ba51f9a2f3f..4dcc045cccdeda67b4a0e2859e0cd1e5c056818a 100644 (file)
@@ -81,6 +81,7 @@
 
 /* project specific includes */
 #include <jtag/interface.h>
+#include <jtag/transport.h>
 #include <helper/time_support.h>
 
 #if IS_CYGWIN == 1
@@ -210,6 +211,10 @@ static void turtle_jtag_blink(void);
 static void signalyzer_h_blink(void);
 static void ktlink_blink(void);
 
+/* common transport support options */
+
+//static const char *jtag_and_swd[] = { "jtag", "swd", NULL };
+
 static const struct ft2232_layout  ft2232_layouts[] =
 {
        { .name = "usbjtag",
@@ -313,6 +318,9 @@ static const struct ft2232_layout *layout;
 
 /** default bitmask values ddriven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
 static uint8_t                  low_output     = 0x0;
+
+/* 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  = 0x0;
 /** default value bitmask for CBUS GPIOH(0..4) */
@@ -480,7 +488,6 @@ static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written)
        else
        {
                *bytes_written = dw_bytes_written;
-               return ERROR_OK;
        }
 #elif BUILD_FT2232_LIBFTDI == 1
        int retval;
@@ -493,9 +500,15 @@ static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written)
        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)
@@ -569,8 +582,9 @@ static int ft2232h_ft4232h_adaptive_clocking(bool enable)
        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;
+
+       if ((retval = ft2232_write(&buf, sizeof(buf), &bytes_written)) != ERROR_OK)
        {
                LOG_ERROR("couldn't write command to %s adaptive clocking"
                        , enable ? "enable" : "disable");
@@ -589,8 +603,8 @@ static int ft2232h_ft4232h_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");
@@ -627,7 +641,7 @@ 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))
+       if ((retval = ft2232_write(buf, sizeof(buf), &bytes_written)) != ERROR_OK)
        {
                LOG_ERROR("couldn't set FT2232 TCK speed");
                return retval;
@@ -737,7 +751,7 @@ static void ft2232_debug_dump_buffer(void)
 
        for (i = 0; i < ft2232_buffer_size; i++)
        {
-               line_p += snprintf(line_p, 256 - (line_p - line), "%2.2x ", ft2232_buffer[i]);
+               line_p += snprintf(line_p, sizeof(line) - (line_p - line), "%2.2x ", ft2232_buffer[i]);
                if (i % 16 == 15)
                {
                        LOG_DEBUG("%s", line);
@@ -1978,7 +1992,7 @@ static int ft2232_execute_command(struct jtag_command *cmd)
        {
        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_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;
@@ -2369,7 +2383,7 @@ static int ft2232_init(void)
        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))
+       if ((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK)
        {
                LOG_ERROR("couldn't write to FT2232 to disable loopback");
                return ERROR_JTAG_INIT_FAILED;
@@ -2387,7 +2401,7 @@ static int ft2232_init(void)
 /** Updates defaults for DBUS signals:  the four JTAG signals
  * (TCK, TDI, TDO, TMS) and * the four GPIOL signals.
  */
-static inline void ftx232_init_head(void)
+static inline void ftx232_dbus_init(void)
 {
        low_output    = 0x08;
        low_direction = 0x0b;
@@ -2397,7 +2411,7 @@ static inline void ftx232_init_head(void)
  * the four GPIOL signals.  Initialization covers value and direction,
  * as customized for each layout.
  */
-static int ftx232_init_tail(void)
+static int ftx232_dbus_write(void)
 {
        uint8_t  buf[3];
        uint32_t bytes_written;
@@ -2431,7 +2445,7 @@ static int ftx232_init_tail(void)
        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]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 DBUS");
                return ERROR_JTAG_INIT_FAILED;
@@ -2446,19 +2460,19 @@ static int usbjtag_init(void)
         * NOTE:  This is now _specific_ to the "usbjtag" layout.
         * Don't try cram any more layouts into this.
         */
-       ftx232_init_head();
+       ftx232_dbus_init();
 
        nTRST    = 0x10;
        nTRSTnOE = 0x10;
        nSRST    = 0x40;
        nSRSTnOE = 0x40;
 
-       return ftx232_init_tail();
+       return ftx232_dbus_write();
 }
 
 static int lm3s811_jtag_init(void)
 {
-       ftx232_init_head();
+       ftx232_dbus_init();
 
        /* There are multiple revisions of LM3S811 eval boards:
         * - Rev B (and older?) boards have no SWO trace support.
@@ -2472,35 +2486,56 @@ static int lm3s811_jtag_init(void)
        low_output    = 0x88;
        low_direction = 0x8b;
 
-       return ftx232_init_tail();
+       return ftx232_dbus_write();
 }
 
 static int icdi_jtag_init(void)
 {
-       ftx232_init_head();
+       ftx232_dbus_init();
 
        /* Most Luminary eval boards support SWO trace output,
         * and should use this "luminary_icdi" layout.
+        *
+        * DBUS 0..3 are used for JTAG as usual.  GPIOs are used
+        * to switch between JTAG and SWD, or switch the ft2232 UART
+        * between (i) the target UART or (ii) SWO trace data.
+        *
+        * 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 */
+#define ICDI_TDI (1 << 2)              /* ADBUS 2 (INPUT) */
+
+#define ICDI_SWO_EN (1 << 4)           /* BDBUS 4 */
+#define ICDI_TX_SWO (1 << 1)           /* BDBUS 1 */
+
        nTRST = 0x0;
        nTRSTnOE = 0x00;
-       nSRST = 0x20;
+       nSRST = ICDI_SRST;
        nSRSTnOE = 0x20;
-       low_output    = 0x88;
-       low_direction = 0xcb;
 
-       return ftx232_init_tail();
+       low_output    = 0x08 | ICDI_JTAG_EN;
+       low_direction = 0xcb | ICDI_JTAG_EN;
+
+       return ftx232_dbus_write();
 }
 
 static int signalyzer_init(void)
 {
-       ftx232_init_head();
+       ftx232_dbus_init();
 
        nTRST    = 0x10;
        nTRSTnOE = 0x10;
        nSRST    = 0x20;
        nSRSTnOE = 0x20;
-       return ftx232_init_tail();
+       return ftx232_dbus_write();
 }
 
 static int axm0432_jtag_init(void)
@@ -2517,7 +2552,7 @@ static int axm0432_jtag_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2564,7 +2599,7 @@ static int axm0432_jtag_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2590,8 +2625,7 @@ static int redbee_init(void)
        buf[1] = low_output;
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2630,8 +2664,7 @@ static int redbee_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2654,7 +2687,7 @@ static int jtagkey_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2713,7 +2746,7 @@ static int jtagkey_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2736,7 +2769,7 @@ static int olimex_jtag_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2780,7 +2813,7 @@ static int olimex_jtag_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2803,7 +2836,7 @@ static int flyswatter_init(void)
        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 (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2826,7 +2859,7 @@ static int flyswatter_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2849,7 +2882,7 @@ static int turtle_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2866,7 +2899,7 @@ static int turtle_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2889,7 +2922,7 @@ static int comstick_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2909,7 +2942,7 @@ static int comstick_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2932,7 +2965,7 @@ static int stm32stick_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2952,7 +2985,7 @@ static int stm32stick_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2975,7 +3008,7 @@ static int sheevaplug_init(void)
        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]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -3003,7 +3036,7 @@ static int sheevaplug_init(void)
        buf[2] = high_direction;   /* all outputs - xRST */
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -3026,7 +3059,7 @@ static int cortino_jtag_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -3046,7 +3079,7 @@ static int cortino_jtag_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -3341,7 +3374,7 @@ static int icebear_jtag_init(void) {
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -3356,7 +3389,7 @@ static int icebear_jtag_init(void) {
        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)) {
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) {
                LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)");
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -4003,8 +4036,7 @@ static int signalyzer_h_init(void)
        buf[1] = low_output;
        buf[2] = low_direction;
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK)
-                       || (bytes_written != 3))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize Signalyzer-H layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -4018,8 +4050,7 @@ static int signalyzer_h_init(void)
                buf[1] = high_output;
                buf[2] = high_direction;
 
-               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK)
-                               || (bytes_written != 3))
+               if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
                {
                        LOG_ERROR("couldn't initialize Signalyzer-H layout");
                        return ERROR_JTAG_INIT_FAILED;
@@ -4033,8 +4064,7 @@ static int signalyzer_h_init(void)
                buf[1] = high_output;
                buf[2] = high_direction;
 
-               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK)
-                               || (bytes_written != 3))
+               if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
                {
                        LOG_ERROR("couldn't initialize Signalyzer-H layout");
                        return ERROR_JTAG_INIT_FAILED;
@@ -4218,7 +4248,7 @@ static int ktlink_init(void)
        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_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -4256,7 +4286,7 @@ static int ktlink_init(void)
        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))
+       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
        {
                LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -4356,6 +4386,7 @@ struct jtag_interface ft2232_interface = {
        .name = "ft2232",
        .supported = DEBUG_CAP_TMS_SEQ,
        .commands = ft2232_command_handlers,
+       .transports = jtag_only,
 
        .init = ft2232_init,
        .quit = ft2232_quit,