From 1341eb3b0aea74b939a5d7702f696b175d032647 Mon Sep 17 00:00:00 2001
From: drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Sun, 30 Jul 2006 11:25:43 +0000
Subject: - added configurable delays after reset lines get deasserted. useful
 if reset circuitry keeps lines asserted for too long. - additional debug
 output when opening the parallel port - fixed counting of available arm7/9
 watchpoint units - 'flash write' now displays elapsed time

git-svn-id: svn://svn.berlios.de/openocd/trunk@79 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/flash/flash.c          |  8 +++++-
 src/jtag/jtag.c            | 62 +++++++++++++++++++++++++++++++++++++++++++++-
 src/jtag/jtag.h            |  3 +++
 src/jtag/parport.c         |  8 +++++-
 src/openocd.c              |  2 +-
 src/target/arm7_9_common.c | 12 +++++++--
 6 files changed, 89 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/flash/flash.c b/src/flash/flash.c
index 0a713093..6f0523d0 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -476,7 +476,10 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha
 	u32 buf_cnt;
 	int retval;
 	flash_bank_t *p;
+	struct timeval start, end, duration;
 
+	gettimeofday(&start, NULL);
+		
 	if (argc < 3)
 	{
 		command_print(cmd_ctx, "usage: flash write <bank> <file> <offset>");
@@ -553,7 +556,10 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha
 	free(buffer);
 	fclose(binary);
 	
-	command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x", args[1], strtoul(args[0], NULL, 0), strtoul(args[2], NULL, 0));
+	gettimeofday(&end, NULL);	
+	timeval_subtract(&duration, &end, &start);
+	
+	command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x in %is %ius", args[1], strtoul(args[0], NULL, 0), strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec);
 	
 	return ERROR_OK;
 
diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c
index d43fafb9..b8846f17 100644
--- a/src/jtag/jtag.c
+++ b/src/jtag/jtag.c
@@ -111,6 +111,10 @@ enum tap_state cmd_queue_cur_state = TAP_TLR;
 
 int jtag_verify_capture_ir = 1;
 
+/* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
+int jtag_nsrst_delay = 0; /* default to no nSRST delay */
+int jtag_ntrst_delay = 0; /* default to no nTRST delay */ 
+
 /* callbacks to inform high-level handlers about JTAG state changes */
 jtag_event_callback_t *jtag_event_callbacks;
 
@@ -168,6 +172,8 @@ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char
 int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
@@ -805,7 +811,10 @@ int jtag_add_reset(int req_trst, int req_srst)
 	}
 	
 	if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
+	{
+		ERROR("requested nSRST assertion, but the current configuration doesn't support this");
 		return ERROR_JTAG_RESET_CANT_SRST;
+	}
 	
 	if (req_trst && !(jtag_reset_config & RESET_HAS_TRST))
 	{
@@ -827,9 +836,15 @@ int jtag_add_reset(int req_trst, int req_srst)
 	jtag_srst = req_srst;
 
 	if (jtag_srst)
+	{
 		jtag_call_event_callbacks(JTAG_SRST_ASSERTED);
+	}
 	else
+	{
 		jtag_call_event_callbacks(JTAG_SRST_RELEASED);
+		if (jtag_nsrst_delay)
+			jtag_add_sleep(jtag_nsrst_delay);
+	}
 	
 	if (trst_with_tms)
 	{
@@ -854,9 +869,20 @@ int jtag_add_reset(int req_trst, int req_srst)
 	{
 		if (jtag_trst)
 		{
+			/* we just asserted nTRST, so we're now in Test-Logic-Reset,
+			 * and inform possible listeners about this
+			 */
 			cmd_queue_cur_state = TAP_TLR;
 			jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
 		}
+		else
+		{
+			/* the nTRST line got deasserted, so we're still in Test-Logic-Reset,
+			 * but we might want to add a delay to give the TAP time to settle
+			 */
+			if (jtag_ntrst_delay)
+				jtag_add_sleep(jtag_ntrst_delay);
+		}
 	}
 
 	return ERROR_OK;
@@ -1121,7 +1147,11 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
 		COMMAND_CONFIG, NULL);
 	register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
 		COMMAND_CONFIG, NULL);
-
+	register_command(cmd_ctx, NULL, "nsrst_delay", handle_jtag_nsrst_delay_command,
+		COMMAND_CONFIG, NULL);
+	register_command(cmd_ctx, NULL, "ntrst_delay", handle_jtag_ntrst_delay_command,
+		COMMAND_CONFIG, NULL);
+		
 	register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
 		COMMAND_EXEC, "print current scan chain configuration");
 
@@ -1341,6 +1371,36 @@ int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, ch
 	return ERROR_OK;
 }
 
+int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+	if (argc < 1)
+	{
+		ERROR("nsrst_delay <ms> command takes one required argument");
+		exit(-1);
+	}
+	else
+	{
+		jtag_nsrst_delay = strtoul(args[0], NULL, 0);
+	}
+	
+	return ERROR_OK;
+}
+
+int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+	if (argc < 1)
+	{
+		ERROR("ntrst_delay <ms> command takes one required argument");
+		exit(-1);
+	}
+	else
+	{
+		jtag_ntrst_delay = strtoul(args[0], NULL, 0);
+	}
+	
+	return ERROR_OK;
+}
+
 int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
 	if (argc == 0)
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 124150ce..f7630a5e 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -199,6 +199,9 @@ enum jtag_event
 	JTAG_TRST_RELEASED,
 };
 
+extern int jtag_trst;
+extern int jtag_srst;
+
 typedef struct jtag_event_callback_s
 {
 	int (*callback)(enum jtag_event event, void *priv);
diff --git a/src/jtag/parport.c b/src/jtag/parport.c
index e78215e2..21aa5131 100644
--- a/src/jtag/parport.c
+++ b/src/jtag/parport.c
@@ -310,6 +310,8 @@ int parport_init(void)
 		return ERROR_JTAG_INIT_FAILED;
 	}
 
+	DEBUG("opening /dev/parport%d...", parport_port);
+
 	snprintf(buffer, 256, "/dev/parport%d", parport_port);
 	device_handle = open(buffer, O_WRONLY);
 	
@@ -319,6 +321,8 @@ int parport_init(void)
 		return ERROR_JTAG_INIT_FAILED;
 	}
 
+	DEBUG("...open");
+
 	i=ioctl(device_handle, PPCLAIM);
 	if (i<0)
 	{
@@ -350,7 +354,8 @@ int parport_init(void)
 	
 	dataport = parport_port;
 	statusport = parport_port + 1;
-		
+	
+	DEBUG("requesting privileges for parallel port 0x%x...", dataport);
 #if PARPORT_USE_GIVEIO == 1
 	if (parport_get_giveio_access() != 0)
 #else /* PARPORT_USE_GIVEIO */
@@ -360,6 +365,7 @@ int parport_init(void)
 		ERROR("missing privileges for direct i/o");
 		return ERROR_JTAG_INIT_FAILED;
 	}
+	DEBUG("...privileges granted");
 #endif /* PARPORT_USE_PPDEV */
 	
 	parport_reset(0, 0);
diff --git a/src/openocd.c b/src/openocd.c
index e52afd34..53ff4548 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 (2006-07-15 12:00 CEST)"
+#define OPENOCD_VERSION "Open On-Chip Debugger (2006-07-30 13:30 CEST)"
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index 62fc3b5b..6bb80125 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -304,7 +304,8 @@ int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
 		arm7_9_unset_breakpoint(target, breakpoint);
 	}
 	
-	arm7_9->wp_available++;
+	if (breakpoint->type == BKPT_HARD)
+		arm7_9->wp_available++;
 	
 	return ERROR_OK;
 }
@@ -456,11 +457,12 @@ int arm7_9_enable_sw_bkpts(struct target_s *target)
 	if (arm7_9->sw_bkpts_enabled)
 		return ERROR_OK;
 	
-	if (arm7_9->wp_available-- < 1)
+	if (arm7_9->wp_available < 1)
 	{
 		WARNING("can't enable sw breakpoints with no watchpoint unit available");
 		return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 	}
+	arm7_9->wp_available--;
 	
 	if (!arm7_9->wp0_used)
 	{
@@ -784,6 +786,12 @@ int arm7_9_halt(target_t *target)
 	{
 		WARNING("target was in unknown state when halt was requested");
 	}
+	
+	if ((target->state == TARGET_RESET) && (jtag_reset_config & RESET_SRST_PULLS_TRST) && (jtag_srst))
+	{
+		ERROR("can't request a halt while in reset if nSRST pulls nTRST");
+		return ERROR_TARGET_FAILURE;
+	}
 
 	if (arm7_9->use_dbgrq)
 	{
-- 
cgit v1.2.3