summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/openocd.texi1
-rw-r--r--src/jtag/drivers/ft2232.c103
-rw-r--r--tcl/board/redbee-econotag.cfg8
3 files changed, 112 insertions, 0 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi
index aa8bed1b..c6113abd 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -2130,6 +2130,7 @@ to debug some other target. It can support the SWO trace mechanism.
@item @b{olimex-jtag} Olimex ARM-USB-OCD and ARM-USB-Tiny
@item @b{oocdlink} OOCDLink
@c oocdlink ~= jtagkey_prototype_v1
+@item @b{redbee-econotag} Integrated with a Redbee development board.
@item @b{sheevaplug} Marvell Sheevaplug development kit
@item @b{signalyzer} Xverve Signalyzer
@item @b{stm32stick} Hitex STM32 Performance Stick
diff --git a/src/jtag/drivers/ft2232.c b/src/jtag/drivers/ft2232.c
index 5c6b655c..d2e96d07 100644
--- a/src/jtag/drivers/ft2232.c
+++ b/src/jtag/drivers/ft2232.c
@@ -162,6 +162,7 @@ static int icebear_jtag_init(void);
static int cortino_jtag_init(void);
static int signalyzer_h_init(void);
static int ktlink_init(void);
+static int redbee_init(void);
/* reset procedures for supported layouts */
static void usbjtag_reset(int trst, int srst);
@@ -176,6 +177,7 @@ 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);
/* blink procedures for layouts that support a blinking led */
static void olimex_jtag_blink(void);
@@ -263,6 +265,10 @@ static const struct ft2232_layout ft2232_layouts[] =
.reset = ktlink_reset,
.blink = ktlink_blink
},
+ { .name = "redbee-econotag",
+ .init = redbee_init,
+ .reset = redbee_reset,
+ },
{ .name = NULL, /* END OF TABLE */ },
};
@@ -1577,6 +1583,36 @@ static void sheevaplug_reset(int trst, int srst)
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 int ft2232_execute_runtest(struct jtag_command *cmd)
{
int retval;
@@ -2478,6 +2514,73 @@ static int axm0432_jtag_init(void)
return ERROR_OK;
}
+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, 3, &bytes_written)) != ERROR_OK)
+ || (bytes_written != 3))
+ {
+ 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 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))
+ {
+ LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout");
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
+ return ERROR_OK;
+}
+
static int jtagkey_init(void)
{
uint8_t buf[3];
diff --git a/tcl/board/redbee-econotag.cfg b/tcl/board/redbee-econotag.cfg
new file mode 100644
index 00000000..7a02ce0d
--- /dev/null
+++ b/tcl/board/redbee-econotag.cfg
@@ -0,0 +1,8 @@
+source [find target/mc13224v.cfg]
+
+# The redbee-econotag has an onboard ft2232h with channel A wired
+# to the JTAG pins on the mc13224v
+# channel B is wired to UART1
+interface ft2232
+ft2232_layout redbee-econotag
+ft2232_vid_pid 0x0403 0x6010