From 63763345d94b11f106c832c23e8ad730a4485723 Mon Sep 17 00:00:00 2001
From: Mariano Alvira <mar@devl.org>
Date: Sat, 27 Feb 2010 22:52:34 -0800
Subject: add board/redbee-econotag.cfg and JTAG support

The Redbee Econotag is an open hardware development kit from
Redwire, LLC (www.redwirellc.com/store), for the Freescale
MC13224V ARM7TDMI + 802.15.4 radio.

It includes both an MC13224V and an FT2232H (for JTAG and UART
support).  It has flexible power supply options.

Additional features are:

  - inverted-F pcb antenna
  - 36 GPIO brought out to 0.1" pin header
    (includes all peripheral pins)
  - Reset button
  - Two push buttons (on kbi1-5 and kbi0-4)
  - USB-A connector, powered from USB
  - up to 16V external input
  - pads for optional buck inductor
  - pads for optional 32.768kHz crystal
  - 2x LEDS on TX_ON and RX_ON

[ dbrownell@users.sourceforge.net: shrink lines; texi ]

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
 src/jtag/drivers/ft2232.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 103 insertions(+)

(limited to 'src')

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];
-- 
cgit v1.2.3