void (*reset)(int trst, int srst);
void (*blink)(void);
int channel;
- const char **transports;
};
/* init procedures for supported layouts */
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);
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_only[] = { "jtag", NULL };
-
//static const char *jtag_and_swd[] = { "jtag", "swd", NULL };
-#define jtag_and_swd NULL
static const struct ft2232_layout ft2232_layouts[] =
{
{ .name = "evb_lm3s811",
.init = lm3s811_jtag_init,
.reset = ftx23_reset,
- .transports = jtag_and_swd,
},
{ .name = "luminary_icdi",
.init = icdi_jtag_init,
.reset = ftx23_reset,
- .transports = jtag_and_swd,
},
{ .name = "olimex-jtag",
.init = olimex_jtag_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 = NULL, /* END OF TABLE */ },
};
/** 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) */
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)
/* 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;
+
+ low_direction |= ICDI_JTAG_EN | ICDI_DBG_ENn;
+ low_output |= ICDI_JTAG_EN;
+ low_output &= ~ICDI_DBG_ENn;
return ftx232_dbus_write();
}
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
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
for (const struct ft2232_layout *l = ft2232_layouts; l->name; l++) {
if (strcmp(l->name, CMD_ARGV[0]) == 0) {
layout = l;
- /* This may also select the transport
- * if we only support one of them.
- */
- return allow_transports(CMD_CTX,
- l->transports ? : jtag_only);
+ return ERROR_OK;
}
}
.name = "ft2232",
.supported = DEBUG_CAP_TMS_SEQ,
.commands = ft2232_command_handlers,
+ .transports = jtag_only,
.init = ft2232_init,
.quit = ft2232_quit,