From 35b3c95299a97c05078f7dd662d66c89a356869d Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Fri, 4 Apr 2008 13:47:38 +0000
Subject: [PATCH] - reverted some of the changes that possibly broke arm926ejs.
 Waiting for a bit more info before I can tell with confidence whether or not
 this would have any effect. - worked on error propagation and output for
 flash

git-svn-id: svn://svn.berlios.de/openocd/trunk@539 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/flash/ecos.c                |   7 ++---
 src/flash/flash.c               |  18 ++++++------
 src/helper/command.c            |  10 ++++++-
 src/helper/command.h            |  14 ++++++++++
 src/target/Makefile.am          |   3 +-
 src/target/arm11.c              |   4 +--
 src/target/arm7_9_common.c      |  47 ++++++++++++++++++++++----------
 src/target/cortex_m3.c          |   2 +-
 src/target/ecos/at91eb40a.elf   | Bin 0 -> 36832 bytes
 src/target/target.c             |   9 +++---
 src/target/target/at91eb40a.cfg |   4 ++-
 src/target/target/zy1000.cfg    |   3 +-
 src/target/xscale.c             |   2 +-
 13 files changed, 81 insertions(+), 42 deletions(-)
 create mode 100644 src/target/ecos/at91eb40a.elf

diff --git a/src/flash/ecos.c b/src/flash/ecos.c
index f467b74d8..8b64b2d71 100644
--- a/src/flash/ecos.c
+++ b/src/flash/ecos.c
@@ -211,10 +211,9 @@ int loadDriver(ecosflash_flash_bank_t *info)
 		int retval;
 		if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
 		{
-			LOG_ERROR("image_read_section failed with error code: %i", retval);
 			free(buffer);
 			image_close(&image);
-			return ERROR_FLASH_BANK_INVALID;
+			return retval;
 		}
 		target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
 		image_size += buf_cnt;
@@ -303,7 +302,7 @@ int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len)
 	if (flashErr != 0x0)
 	{
 		LOG_ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
-		return ERROR_JTAG_DEVICE_ERROR;
+		return ERROR_FAIL;
 	}
 
 	return ERROR_OK;
@@ -362,7 +361,7 @@ int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 l
 		if (flashErr != 0x0)
 		{
 			LOG_ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
-			return ERROR_JTAG_DEVICE_ERROR;
+			return ERROR_FAIL;
 		}
     }
 	return ERROR_OK;
diff --git a/src/flash/flash.c b/src/flash/flash.c
index 960772583..850dcd4cb 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -618,13 +618,12 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
 	if (argc < 1)
 	{
 		return ERROR_COMMAND_SYNTAX_ERROR;
-
 	}
 
 	if (!target)
 	{
 		LOG_ERROR("no target selected");
-		return ERROR_OK;
+		return ERROR_FAIL;
 	}
 
 	duration_start_measure(&duration);
@@ -649,7 +648,6 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
 	}
 
 	retval = flash_write(target, &image, &written, auto_erase);
-
 	if (retval != ERROR_OK)
 	{
 		image_close(&image);
@@ -659,9 +657,9 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
 	duration_stop_measure(&duration, &duration_text);
 	if (retval == ERROR_OK)
 	{
-	command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
-		written, args[0], duration_text,
-		(float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
+		command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
+				written, args[0], duration_text,
+				(float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
 	}
 	free(duration_text);
 
@@ -923,7 +921,7 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length)
 /* write (optional verify) an image to flash memory of the given target */
 int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 {
-	int retval;
+	int retval=ERROR_OK;
 
 	int section;
 	u32 section_offset;
@@ -1039,14 +1037,14 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 
 		if (retval != ERROR_OK)
 		{
-				return retval; /* abort operation */
-			}
+			return retval; /* abort operation */
+		}
 
 		if (written != NULL)
 			*written += run_size; /* add run size to total written counter */
 	}
 
-	return ERROR_OK;
+	return retval;
 }
 
 int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
diff --git a/src/helper/command.c b/src/helper/command.c
index 7d24d81d9..ef5673336 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -298,6 +298,7 @@ void command_print(command_context_t *context, char *format, ...)
 int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)
 {
 	command_t *c;
+	int retval = ERROR_COMMAND_SYNTAX_ERROR;
 	
 	if (unique_length_dirty)
 	{
@@ -321,6 +322,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
 				if (!c->handler)
 				{
 					command_print(context, "No handler for command");
+					retval = ERROR_COMMAND_SYNTAX_ERROR;
 					break;
 				}
 				else
@@ -330,6 +332,12 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
 					{
 						command_print(context, "Syntax error:");
 						command_print_help_line(context, c, 0);
+					} else if (retval != ERROR_OK)
+					{
+						/* we do not print out an error message because the command *should*
+						 * have printed out an error
+						 */
+						LOG_DEBUG("Command failed with error code %d", retval); 
 					}
 					return retval; 
 				}
@@ -347,7 +355,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
 	}
 	
 	command_print(context, "Command %s not found", words[start_word]);
-	return ERROR_OK;
+	return retval;
 }
 
 int command_run_line(command_context_t *context, char *line)
diff --git a/src/helper/command.h b/src/helper/command.h
index 3acb8b182..6e6af75eb 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -34,6 +34,20 @@ typedef struct command_context_s
 	enum command_mode mode;
 	struct command_s *commands;
 	int current_target;
+	/* Execute a command.
+	 * 
+	 * If the command fails, it *MUST* return a value != ERROR_OK
+	 * (many commands break this rule, patches welcome!)
+	 * 
+	 * This is *especially* important for commands such as writing
+	 * to flash or verifying memory. The reason is that those commands
+	 * can be used by programs to determine if the operation succeded
+	 * or not. If the operation failed, then a program can try
+	 * an alternative approach.
+	 * 
+	 * Returning ERROR_COMMAND_SYNTAX_ERROR will have the effect of
+	 * printing out the syntax of the command.
+	 */
 	int (*output_handler)(struct command_context_s *context, char* line);
 	void *output_handler_priv;
 } command_context_t;
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index 83379381c..3f0035258 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -23,7 +23,8 @@ nobase_dist_pkglib_DATA = xscale/debug_handler.bin event/at91eb40a_reset.script
 	target/at91r40008.cfg target/lpc2148.cfg target/lpc2294.cfg target/sam7s256.cfg \
 	target/sam7x256.cfg target/str710.cfg target/str912.cfg target/nslu2.cfg target/pxa255_sst.cfg \
 	target/pxa255.cfg  target/zy1000.cfg event/zy1000_reset.script event/at91sam9260_reset.script target/at91sam9260.cfg \
-	target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg target/xba_revA3.cfg event/xba_revA3.script
+	target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg  target/xba_revA3.cfg event/xba_revA3.script \
+	ecos/at91eb40a.elf
 	
 
 
diff --git a/src/target/arm11.c b/src/target/arm11.c
index adcbe7491..ea88d5c0b 100644
--- a/src/target/arm11.c
+++ b/src/target/arm11.c
@@ -732,8 +732,8 @@ int arm11_halt(struct target_s *target)
 
     if (target->state == TARGET_HALTED)
     {
-	LOG_WARNING("target was already halted");
-	return ERROR_OK;
+		LOG_DEBUG("target was already halted");
+		return ERROR_OK;
     }
 
     if (arm11->trst_active)
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index 63767ae30..4e14497de 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -733,8 +733,18 @@ int arm7_9_poll(target_t *target)
 	return ERROR_OK;
 }
 
+/*
+  Some -S targets (ARM966E-S in the STR912 isn't affected, ARM926EJ-S
+  in the LPC3180 and AT91SAM9260 is affected) completely stop the JTAG clock
+  while the core is held in reset. It isn't possible to program the halt
+  condition once reset was asserted, hence a hook that allows the target to set
+  up its reset-halt condition prior to asserting reset.
+*/
+
 int arm7_9_assert_reset(target_t *target)
 {
+	armv4_5_common_t *armv4_5 = target->arch_info;
+	arm7_9_common_t *arm7_9 = armv4_5->arch_info;
 	LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
 	
 	if (!(jtag_reset_config & RESET_HAS_SRST))
@@ -743,10 +753,32 @@ int arm7_9_assert_reset(target_t *target)
 		return ERROR_FAIL;
 	}
 
+	/*
+	 * Some targets do not support communication while TRST is asserted. We need to
+	 * set up the reset vector catch here.
+	 * 
+	 * If TRST is in use, then these settings will be reset anyway, so setting them
+	 * here is harmless.  
+	 */
+	if (arm7_9->has_vector_catch)
+	{
+		/* program vector catch register to catch reset vector */
+		embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_VEC_CATCH], 0x1);
+	}
+	else
+	{
+		/* program watchpoint unit to match on reset vector address */
+		embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0x3);
+		embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0x0);
+		embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
+		embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xf7);
+	}
+
 	/* we can't know what state the target is in as we might e.g.
 	 * be resetting after a power dropout, so we need to issue a tms/srst
 	 */
 	
+	
 	/* assert SRST and TRST */
 	/* system would get ouf sync if we didn't reset test-logic, too */
 	jtag_add_reset(1, 1);
@@ -766,10 +798,6 @@ int arm7_9_assert_reset(target_t *target)
 	target->state = TARGET_RESET;
 	jtag_add_sleep(50000);
 
-	/* at this point we TRST *may* be deasserted */
-	arm7_9_prepare_reset_halt(target);
-
-	
 	armv4_5_invalidate_core_regs(target);
 
 	return ERROR_OK;
@@ -909,15 +937,6 @@ int arm7_9_soft_reset_halt(struct target_s *target)
 	return ERROR_OK;
 }
 
-int arm7_9_prepare_reset_halt(target_t *target)
-{
-	if ((target->reset_mode!=RESET_HALT)&&(target->reset_mode!=RESET_INIT))
-	{
-		return ERROR_OK;
-	}
-	return arm7_9_halt(target);
-}
-
 int arm7_9_halt(target_t *target)
 {
 	armv4_5_common_t *armv4_5 = target->arch_info;
@@ -928,7 +947,7 @@ int arm7_9_halt(target_t *target)
 	
 	if (target->state == TARGET_HALTED)
 	{
-		LOG_WARNING("target was already halted");
+		LOG_DEBUG("target was already halted");
 		return ERROR_OK;
 	}
 	
diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c
index 406a00af4..19b0a758b 100644
--- a/src/target/cortex_m3.c
+++ b/src/target/cortex_m3.c
@@ -429,7 +429,7 @@ int cortex_m3_halt(target_t *target)
 	
 	if (target->state == TARGET_HALTED)
 	{
-		LOG_WARNING("target was already halted");
+		LOG_DEBUG("target was already halted");
 		return ERROR_OK;
 	}
 	
diff --git a/src/target/ecos/at91eb40a.elf b/src/target/ecos/at91eb40a.elf
new file mode 100644
index 0000000000000000000000000000000000000000..451657a5a506ab1f60981b8b3627288c8950bc8f
GIT binary patch
literal 36832
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

literal 0
HcmV?d00001

diff --git a/src/target/target.c b/src/target/target.c
index f90834d1b..7673f5d22 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -2053,14 +2053,13 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
 	
 	if (argc < 1)
 	{
-		command_print(cmd_ctx, "usage: verify_image <file> [offset] [type]");
-		return ERROR_OK;
+		return ERROR_COMMAND_SYNTAX_ERROR;
 	}
 	
 	if (!target)
 	{
 		LOG_ERROR("no target selected");
-		return ERROR_OK;
+		return ERROR_FAIL;
 	}
 	
 	duration_start_measure(&duration);
@@ -2078,9 +2077,9 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
 
 	image.start_address_set = 0;
 
-	if (image_open(&image, args[0], (argc == 3) ? args[2] : NULL) != ERROR_OK)
+	if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
 	{
-		return ERROR_OK;
+		return retval;
 	}
 	
 	image_size = 0x0;
diff --git a/src/target/target/at91eb40a.cfg b/src/target/target/at91eb40a.cfg
index 3d5eb14ee..658c6d0cc 100644
--- a/src/target/target/at91eb40a.cfg
+++ b/src/target/target/at91eb40a.cfg
@@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
 jtag_device 4 0x1 0xf 0xe
 
 #target configuration
-#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
 target arm7tdmi little reset_init 0 arm7tdmi-s_r4
 
 # speed up memory downloads
@@ -24,6 +23,9 @@ arm7_9 dcc_downloads enable
 # OpenOCD does not have a flash driver for for AT91FR40162S 
 target_script 0 reset event/at91eb40a_reset.script
 
+#flash driver
+flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
+
 # required for usable performance. Used for lots of
 # other things than flash programming.
 working_area 0 0x00000000 0x20000 nobackup
diff --git a/src/target/target/zy1000.cfg b/src/target/target/zy1000.cfg
index 5a2fab682..b082ca240 100644
--- a/src/target/target/zy1000.cfg
+++ b/src/target/target/zy1000.cfg
@@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
 jtag_device 4 0x1 0xf 0xe
 
 #target configuration
-#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
 target arm7tdmi little reset_init 0 arm7tdmi-s_r4
 
 # at CPU CLK <32kHz this must be disabled
@@ -22,7 +21,7 @@ arm7 fast_memory_access enable
 arm7_9 dcc_downloads enable
 
 
-flash bank ecosflash 0x01000000 0x200000 2 2 0 /rom/at91eb40a.elf
+flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
 target_script 0 reset event/zy1000_reset.script
 
 # required for usable performance. Used for lots of
diff --git a/src/target/xscale.c b/src/target/xscale.c
index 1d379f591..b9a367ad6 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -1263,7 +1263,7 @@ int xscale_halt(target_t *target)
 
 	if (target->state == TARGET_HALTED)
 	{
-		LOG_WARNING("target was already halted");
+		LOG_DEBUG("target was already halted");
 		return ERROR_OK;
 	}
 	else if (target->state == TARGET_UNKNOWN)
-- 
GitLab