ecos: add 64 bit types for sprintf/sscanf
[openocd.git] / src / jtag / drivers / ft2232.c
index 928ec1c66f33eb1fbd5b910f5db49e3732784e0c..fdabb64eda93a52f040fd870b22cfd048eebb37b 100644 (file)
@@ -190,6 +190,7 @@ 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);
 
 /* reset procedures for supported layouts */
 static void ftx23_reset(int trst, int srst);
@@ -205,6 +206,7 @@ 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);
 
 /* blink procedures for layouts that support a blinking led */
 static void olimex_jtag_blink(void);
@@ -318,6 +320,10 @@ static const struct ft2232_layout  ft2232_layouts[] =
                .reset = ftx23_reset,
                .blink = flossjtag_blink,
        },
+       { .name = "xds100v2",
+               .init = xds100v2_init,
+               .reset = xds100v2_reset,
+       },
        { .name = NULL, /* END OF TABLE */ },
 };
 
@@ -367,6 +373,12 @@ 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;
@@ -493,7 +505,7 @@ 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;
+       DWORD dw_bytes_written = 0;
        if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
        {
                *bytes_written = dw_bytes_written;
@@ -1683,6 +1695,36 @@ static void redbee_reset(int trst, int srst)
                        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)
 {
        int retval;
@@ -2045,12 +2087,20 @@ static int ft2232_execute_queue(void)
 
        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;
@@ -2128,7 +2178,7 @@ 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",
+                               LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'",
                                                        ft2232_device_desc,
                                                        ft2232_device_desc_A);
                        }
@@ -2161,7 +2211,7 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor
 
                        if (status == FT_OK)
                        {
-                               LOG_ERROR("ListDevices: %lu\n", num_devices);
+                               LOG_ERROR("ListDevices: %lu", num_devices);
                                for (i = 0; i < num_devices; i++)
                                        LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]);
                        }
@@ -2173,7 +2223,7 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor
                }
                else
                {
-                       LOG_ERROR("ListDevices: NONE\n");
+                       LOG_ERROR("ListDevices: NONE");
                }
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -2328,6 +2378,46 @@ static int ft2232_purge_libftdi(void)
 
 #endif /* BUILD_FT2232_LIBFTDI == 1 */
 
+static int ft2232_set_data_bits_low_byte( uint8_t value, uint8_t direction )
+{
+       uint8_t  buf[3];
+       uint32_t bytes_written;
+
+       buf[0] = 0x80;          /* command "set data bits low 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 low byte");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       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;
+       }
+
+       return ERROR_OK;
+}
+
 static int ft2232_init(void)
 {
        uint8_t  buf[1];
@@ -2395,7 +2485,11 @@ static int ft2232_init(void)
                        return ERROR_JTAG_INIT_FAILED;
        }
 
-       ft2232_speed(jtag_get_speed());
+       int jtag_speed_var;
+       retval = jtag_get_speed(&jtag_speed_var);
+       if (retval != ERROR_OK)
+               return retval;
+       ft2232_speed(jtag_speed_var);
 
        buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
        if ((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK)
@@ -2428,9 +2522,6 @@ static inline void ftx232_dbus_init(void)
  */
 static int ftx232_dbus_write(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        enum reset_types jtag_reset_config = jtag_get_reset_config();
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
        {
@@ -2455,12 +2546,7 @@ static int ftx232_dbus_write(void)
        }
 
        /* 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]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2560,19 +2646,11 @@ static int signalyzer_init(void)
 
 static int axm0432_jtag_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2613,13 +2691,8 @@ static int axm0432_jtag_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;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2630,22 +2703,11 @@ static int axm0432_jtag_init(void)
 
 static int redbee_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x08;
        low_direction = 0x2b;
 
        /* initialize low byte for jtag */
-       /* command "set data bits low byte" */
-       buf[0] = 0x80;
-       /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */
-       buf[2] = low_direction;
-       /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */
-       buf[1] = low_output;
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2678,13 +2740,8 @@ static int redbee_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;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2695,19 +2752,11 @@ static int redbee_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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2760,13 +2809,8 @@ static int jtagkey_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;    /* all outputs (xRST and xRSTnOE) */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2777,19 +2821,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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2827,13 +2863,8 @@ static int olimex_jtag_init(void)
        /* 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2844,19 +2875,11 @@ static int olimex_jtag_init(void)
 
 static int flyswatter_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        low_output    = 0x18;
        low_direction = 0xfb;
 
        /* 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 (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2873,13 +2896,8 @@ static int flyswatter_init(void)
        /* 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2890,19 +2908,11 @@ static int flyswatter_init(void)
 
 static int turtle_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2913,13 +2923,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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2930,19 +2935,11 @@ 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2956,13 +2953,8 @@ static int comstick_init(void)
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -2973,19 +2965,11 @@ 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -2999,13 +2983,8 @@ static int stm32stick_init(void)
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -3016,19 +2995,11 @@ 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]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -3050,13 +3021,8 @@ static int sheevaplug_init(void)
        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 */
-       LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -3067,19 +3033,11 @@ static int sheevaplug_init(void)
 
 static int cortino_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, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -3093,15 +3051,10 @@ static int cortino_jtag_init(void)
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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");
+               LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
@@ -3110,9 +3063,6 @@ static int cortino_jtag_init(void)
 
 static int lisa_l_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        ftx232_dbus_init();
 
        nTRST    = 0x10;
@@ -3123,13 +3073,8 @@ static int lisa_l_init(void)
        high_output = 0x00;
        high_direction = 0x18;
 
-       /* 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -3140,9 +3085,6 @@ static int lisa_l_init(void)
 
 static int flossjtag_init(void)
 {
-       uint8_t  buf[3];
-       uint32_t bytes_written;
-
        ftx232_dbus_init();
 
        nTRST    = 0x10;
@@ -3153,13 +3095,8 @@ static int flossjtag_init(void)
        high_output = 0x00;
        high_direction = 0x18;
 
-       /* 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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -3168,22 +3105,53 @@ static int flossjtag_init(void)
        return ftx232_dbus_write();
 }
 
-static void olimex_jtag_blink(void)
+static int xds100v2_init(void)
 {
-       /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
-        * ACBUS3 is bit 3 of the GPIOH port
-        */
-       if (high_output & 0x08)
+       low_output    = 0x3A;
+       low_direction = 0x7B;
+
+       /* initialize low byte for jtag */
+       if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK)
        {
-               /* set port pin high */
-               high_output &= 0x07;
+               LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout");
+               return ERROR_JTAG_INIT_FAILED;
        }
-       else
+
+       nTRST    = 0x10;
+       nTRSTnOE = 0x0;     /* not output enable for nTRST */
+       nSRST    = 0x00;    /* TODO: SRST is not supported yet */
+       nSRSTnOE = 0x00;    /* no output enable for nSRST */
+
+       high_output    = 0x00;
+       high_direction = 0x59;
+
+       /* 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 'xds100v2' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       high_output    = 0x86;
+       high_direction = 0x59;
+
+       /* initialize high byte for jtag */
+       if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK)
        {
-               /* set port pin low */
-               high_output |= 0x08;
+               LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout");
+               return ERROR_JTAG_INIT_FAILED;
        }
 
+       return ERROR_OK;
+}
+
+static void olimex_jtag_blink(void)
+{
+       /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
+        * ACBUS3 is bit 3 of the GPIOH port
+        */
+       high_output ^= 0x08;
+
        buffer_write(0x82);
        buffer_write(high_output);
        buffer_write(high_direction);
@@ -3466,9 +3434,6 @@ static int ft2232_stableclocks(int num_cycles, struct jtag_command* cmd)
  * 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;
@@ -3487,12 +3452,7 @@ static int icebear_jtag_init(void) {
        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, sizeof(buf), &bytes_written) != ERROR_OK) {
+       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;
        }
@@ -3500,14 +3460,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, sizeof(buf), &bytes_written) != ERROR_OK) {
+       /* 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;
        }
@@ -3704,8 +3658,6 @@ 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,
@@ -4150,11 +4102,7 @@ static int signalyzer_h_init(void)
        }
 
        /* initialize low byte of controller for jtag operation */
-       buf[0] = 0x80;
-       buf[1] = low_output;
-       buf[2] = low_direction;
-
-       if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
+       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;
@@ -4164,11 +4112,7 @@ static int signalyzer_h_init(void)
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+               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;
@@ -4178,11 +4122,7 @@ static int signalyzer_h_init(void)
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+               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;
@@ -4353,20 +4293,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)
 
        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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -4398,13 +4331,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, sizeof(buf), &bytes_written) != ERROR_OK)
+       /* 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;
@@ -4450,10 +4378,7 @@ static void ktlink_reset(int trst, int srst)
 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(high_output);

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)