build: fix build from previous commit
[openocd.git] / src / jtag / drivers / ft2232.c
index 9d40b1c040f5790ccef5e3a1fa7eaca2404b45dc..c8a98d2d296d038c1f4555d5ec4727bef0183fd8 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
@@ -187,6 +188,8 @@ 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);
 
 /* reset procedures for supported layouts */
 static void ftx23_reset(int trst, int srst);
@@ -209,6 +212,12 @@ static void flyswatter_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);
+
+/* common transport support options */
+
+//static const char *jtag_and_swd[] = { "jtag", "swd", NULL };
 
 static const struct ft2232_layout  ft2232_layouts[] =
 {
@@ -298,6 +307,17 @@ static const struct ft2232_layout  ft2232_layouts[] =
                .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 = NULL, /* END OF TABLE */ },
 };
 
@@ -311,8 +331,11 @@ static uint8_t                  nSRSTnOE;
 /** the layout being used with this debug session */
 static const struct ft2232_layout *layout;
 
-/** default bitmask values ddriven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */
+/** default bitmask values driven 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) */
@@ -714,24 +737,23 @@ static void ft2232_end_state(tap_state_t state)
 
 static void ft2232_read_scan(enum scan_type type, uint8_t* buffer, int scan_size)
 {
-       int num_bytes = scan_size / 8;
-       int bits_left = scan_size % 8;
-       int cur_byte;
+       int num_bytes = (scan_size + 7) / 8;
+       int bits_left = scan_size;
+       int cur_byte  = 0;
 
-       for (cur_byte = 0; cur_byte < num_bytes; cur_byte++)
+       while (num_bytes-- > 1)
        {
-               buffer[cur_byte] = buffer_read();
+               buffer[cur_byte++] = buffer_read();
+               bits_left -= 8;
        }
 
-       /* Manage partial byte left from the clock data in/out instructions, if any */
+       buffer[cur_byte] = 0x0;
+
+       /* There is one more partial byte left from the clock data in/out instructions */
        if (bits_left > 1)
        {
                buffer[cur_byte] = buffer_read() >> 1;
        }
-       else
-       {
-               buffer[cur_byte] = 0x0;
-       }
        /* 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);
 }
@@ -2373,7 +2395,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)
@@ -2394,7 +2420,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;
@@ -2404,7 +2430,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;
@@ -2453,19 +2479,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.
@@ -2479,35 +2505,61 @@ 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.
+        *
+        * 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 = 0x20;
-       nSRSTnOE = 0x20;
-       low_output    = 0x88;
-       low_direction = 0xcb;
+       nSRST = ICDI_SRST;
+       nSRSTnOE = ICDI_SRST;
 
-       return ftx232_init_tail();
+       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_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)
@@ -3060,6 +3112,66 @@ static int cortino_jtag_init(void)
        return ERROR_OK;
 }
 
+static int lisa_l_init(void)
+{
+       uint8_t  buf[3];
+       uint32_t bytes_written;
+
+       ftx232_dbus_init();
+
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x40;
+       nSRSTnOE = 0x40;
+
+       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)
+       {
+               LOG_ERROR("couldn't initialize FT2232 with 'lisa_l' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       return ftx232_dbus_write();
+}
+
+static int flossjtag_init(void)
+{
+       uint8_t  buf[3];
+       uint32_t bytes_written;
+
+       ftx232_dbus_init();
+
+       nTRST    = 0x10;
+       nTRSTnOE = 0x10;
+       nSRST    = 0x40;
+       nSRSTnOE = 0x40;
+
+       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)
+       {
+               LOG_ERROR("couldn't initialize FT2232 with 'Floss-JTAG' layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       return ftx232_dbus_write();
+}
+
 static void olimex_jtag_blink(void)
 {
        /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
@@ -3112,6 +3224,44 @@ static void turtle_jtag_blink(void)
        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);
+       buffer_write(high_direction);
+}
+
 static int ft2232_quit(void)
 {
 #if BUILD_FT2232_FTD2XX == 1
@@ -4022,7 +4172,7 @@ static int signalyzer_h_init(void)
                buf[1] = high_output;
                buf[2] = high_direction;
 
-               if ((retval = ft2232_write(buf, sizeof(buf), &bytes_written)) != ERROR_OK)
+               if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK)
                {
                        LOG_ERROR("couldn't initialize Signalyzer-H layout");
                        return ERROR_JTAG_INIT_FAILED;
@@ -4358,6 +4508,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,

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)