From 6ae83f5cf8ddf505498b535cb167550a54271606 Mon Sep 17 00:00:00 2001
From: drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Wed, 5 Sep 2007 06:22:37 +0000
Subject: [PATCH] Patch by Michael Schwingen that  - adds support for the
 Altium universal JTAG cable  - adds support for "wiggler2" cable (basically a
 wiggler with added LED, documentation coming soon)  - adds LED support. The
 LED is turned on during data transfer - works fine on Altium and wiggler2.  -
 adds PORT_EXIT pattern that is written to port when exiting, in order to turn
 off power on cables that get their power from parallel port data lines  -
 move port writes (with the system-specific ifdefs) to one central function

- increased image cache size to 2KB (might require more adaptive cache handling, e.g. LRU)



git-svn-id: svn://svn.berlios.de/openocd/trunk@204 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/jtag/at91rm9200.c    |  3 +-
 src/jtag/bitbang.c       |  5 +++
 src/jtag/bitbang.h       |  1 +
 src/jtag/ep93xx.c        |  3 +-
 src/jtag/parport.c       | 93 +++++++++++++++++++++++++---------------
 src/openocd.c            |  2 +-
 src/target/embeddedice.c |  2 +-
 src/target/image.h       |  2 +-
 8 files changed, 72 insertions(+), 39 deletions(-)

diff --git a/src/jtag/at91rm9200.c b/src/jtag/at91rm9200.c
index d532e3e74..b1ddb2df0 100644
--- a/src/jtag/at91rm9200.c
+++ b/src/jtag/at91rm9200.c
@@ -146,7 +146,8 @@ bitbang_interface_t at91rm9200_bitbang =
 {
 	.read = at91rm9200_read,
 	.write = at91rm9200_write,
-	.reset = at91rm9200_reset
+	.reset = at91rm9200_reset,
+	.blink = 0
 };
 
 int at91rm9200_read(void)
diff --git a/src/jtag/bitbang.c b/src/jtag/bitbang.c
index 198a741fd..19afdbf0b 100644
--- a/src/jtag/bitbang.c
+++ b/src/jtag/bitbang.c
@@ -209,6 +209,9 @@ int bitbang_execute_queue(void)
 	 */ 
 	retval = ERROR_OK;
 		
+	if(bitbang_interface->blink)
+		bitbang_interface->blink(1);
+
 	while (cmd)
 	{
 		switch (cmd->type)
@@ -278,6 +281,8 @@ int bitbang_execute_queue(void)
 		}
 		cmd = cmd->next;
 	}
+	if(bitbang_interface->blink)
+		bitbang_interface->blink(0);
 	
 	return retval;
 }
diff --git a/src/jtag/bitbang.h b/src/jtag/bitbang.h
index 7049f4353..da006a166 100644
--- a/src/jtag/bitbang.h
+++ b/src/jtag/bitbang.h
@@ -27,6 +27,7 @@ typedef struct bitbang_interface_s
 	int (*read)(void);
 	void (*write)(int tck, int tms, int tdi);
 	void (*reset)(int trst, int srst);
+	void (*blink)(int on);
 } bitbang_interface_t;
 
 extern bitbang_interface_t *bitbang_interface;
diff --git a/src/jtag/ep93xx.c b/src/jtag/ep93xx.c
index 88ed50c1f..7311c19a1 100644
--- a/src/jtag/ep93xx.c
+++ b/src/jtag/ep93xx.c
@@ -78,7 +78,8 @@ bitbang_interface_t ep93xx_bitbang =
 {
 	.read = ep93xx_read,
 	.write = ep93xx_write,
-	.reset = ep93xx_reset
+	.reset = ep93xx_reset,
+	.blink = 0;
 };
 
 int ep93xx_read(void)
diff --git a/src/jtag/parport.c b/src/jtag/parport.c
index b9087d9fe..b666eb123 100644
--- a/src/jtag/parport.c
+++ b/src/jtag/parport.c
@@ -90,20 +90,33 @@ typedef struct cable_s
 	u8 OUTPUT_INVERT;	/* data port bits that should be inverted */
 	u8 INPUT_INVERT;	/* status port that should be inverted */
 	u8 PORT_INIT;	/* initialize data port with this value */
+	u8 PORT_EXIT;	/* de-initialize data port with this value */
+	u8 LED_MASK;	/* data port bit for LED */
 } cable_t;
 
 cable_t cables[] = 
 {	
-	/* name					tdo   trst  tms   tck   tdi   srst  o_inv i_inv init */
-	{ "wiggler",			0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80 },
-	{ "wiggler_ntrst_inverted",	0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80 },
-	{ "old_amt_wiggler",	0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80 },
-	{ "chameleon",			0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
-	{ "dlc5",				0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10 },
-	{ "triton",				0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
-	{ "lattice",			0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18 },
-	{ "flashlink",			0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00 },
-	{ NULL,					0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+	/* name					tdo   trst  tms   tck   tdi   srst  o_inv i_inv init  exit  led */
+	{ "wiggler",			0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x80, 0x00 },
+	{ "wiggler2",			0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x00, 0x20 },
+	{ "wiggler_ntrst_inverted",
+							0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80, 0x80, 0x00 },
+	{ "old_amt_wiggler",	0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80, 0x80, 0x00 },
+	{ "chameleon",			0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
+	{ "dlc5",				0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00 },
+	{ "triton",				0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
+	{ "lattice",			0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00 },
+	{ "flashlink",			0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00, 0x00, 0x00 },
+/* Altium Universal JTAG cable. Set the cable to Xilinx Mode and wire to target as follows:
+	HARD TCK - Target TCK
+	HARD TMS - Target TMS
+	HARD TDI - Target TDI
+	HARD TDO - Target TDO
+	SOFT TCK - Target TRST
+	SOFT TDI - Target SRST
+*/
+	{ "altium",			0x10, 0x20, 0x04, 0x02, 0x01, 0x80, 0x00, 0x00, 0x10, 0x00, 0x08 },
+	{ NULL,				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 };
 
 /* configuration */
@@ -127,6 +140,7 @@ static unsigned long statusport;
 int parport_read(void);
 void parport_write(int tck, int tms, int tdi);
 void parport_reset(int trst, int srst);
+void parport_led(int on);
 
 int parport_speed(int speed);
 int parport_register_commands(struct command_context_s *cmd_ctx);
@@ -155,7 +169,8 @@ bitbang_interface_t parport_bitbang =
 {
 	.read = parport_read,
 	.write = parport_write,
-	.reset = parport_reset
+	.reset = parport_reset,
+	.blink = parport_led
 };
 
 int parport_read(void)
@@ -174,9 +189,24 @@ int parport_read(void)
 		return 0;
 }
 
-void parport_write(int tck, int tms, int tdi)
+static inline void parport_write_data(void)
 {
 	u8 output;
+	output = dataport_value ^ cable->OUTPUT_INVERT;
+
+#if PARPORT_USE_PPDEV == 1
+	ioctl(device_handle, PPWDATA, &output);
+#else
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+	outb(dataport, output);
+#else
+	outb(output, dataport);
+#endif
+#endif
+}
+
+void parport_write(int tck, int tms, int tdi)
+{
 	int i = jtag_speed + 1;
 	
 	if (tck)
@@ -194,24 +224,13 @@ void parport_write(int tck, int tms, int tdi)
 	else
 		dataport_value &= ~cable->TDI_MASK;
 		
-	output = dataport_value ^ cable->OUTPUT_INVERT;
-
 	while (i-- > 0)
-#if PARPORT_USE_PPDEV == 1
-		ioctl(device_handle, PPWDATA, &output);
-#else
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-	outb(dataport, output);
-#else
-	outb(output, dataport);
-#endif
-#endif
+		parport_write_data();
 }
 
 /* (1) assert or (0) deassert reset lines */
 void parport_reset(int trst, int srst)
 {
-	u8 output;
 	DEBUG("trst: %i, srst: %i", trst, srst);
 
 	if (trst == 0)
@@ -224,18 +243,19 @@ void parport_reset(int trst, int srst)
 	else if (srst == 1)
 		dataport_value &= ~cable->SRST_MASK;
 	
-	output = dataport_value ^ cable->OUTPUT_INVERT;
+	parport_write_data();
+}
 	
-#if PARPORT_USE_PPDEV == 1
-	ioctl(device_handle, PPWDATA, &output);
-#else
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-	outb(dataport, output);
-#else
-	outb(output, dataport);
-#endif
-#endif
+/* turn LED on parport adapter on (1) or off (0) */
+void parport_led(int on)
+{
+	u8 output;
+	if (on)
+		dataport_value |= cable->LED_MASK;
+	else
+		dataport_value &= ~cable->LED_MASK;
 
+	parport_write_data();
 }
 
 int parport_speed(int speed)
@@ -400,6 +420,7 @@ int parport_init(void)
 	
 	parport_reset(0, 0);
 	parport_write(0, 0, 0);
+	parport_led(1);
 
 	bitbang_interface = &parport_bitbang;	
 
@@ -408,7 +429,11 @@ int parport_init(void)
 
 int parport_quit(void)
 {
+	u8 output;
+	parport_led(0);
 
+	dataport_value = cable->PORT_EXIT;
+	parport_write_data();
 	return ERROR_OK;
 }
 
diff --git a/src/openocd.c b/src/openocd.c
index 26a218b9d..81aae3909 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -18,7 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-25 12:00 CEST)"
+#define OPENOCD_VERSION "Open On-Chip Debugger (2007-09-05 09:00 CEST)"
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
diff --git a/src/target/embeddedice.c b/src/target/embeddedice.c
index 4d76bcaf1..11f2e6c26 100644
--- a/src/target/embeddedice.c
+++ b/src/target/embeddedice.c
@@ -506,7 +506,7 @@ int embeddedice_handshake(arm_jtag_t *jtag_info, int hsbit, u32 timeout)
 
 	if (hsbit == EICE_COMM_CTRL_WBIT)
 		hsact = 1;
-	else if (hsbit != EICE_COMM_CTRL_RBIT)
+	else if (hsbit == EICE_COMM_CTRL_RBIT)
 		hsact = 0;
 	else
 		return ERROR_INVALID_ARGUMENTS;
diff --git a/src/target/image.h b/src/target/image.h
index ec52acb4f..e8f585bbc 100644
--- a/src/target/image.h
+++ b/src/target/image.h
@@ -34,7 +34,7 @@
 #define IMAGE_MAX_ERROR_STRING		(256)
 #define IMAGE_MAX_SECTIONS			(128)
 
-#define IMAGE_MEMORY_CACHE_SIZE		(1024)
+#define IMAGE_MEMORY_CACHE_SIZE		(2048)
 
 typedef enum image_type
 {
-- 
GitLab