From 7e36e461a43554f23d2e57983733cd7b2dfe1957 Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Wed, 25 Jun 2008 08:47:19 +0000
Subject: added pre/post_reset scripts based on Pieter Conradie's ideas.

git-svn-id: svn://svn.berlios.de/openocd/trunk@726 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/target/target.c | 43 +++++++++++++++++++++++++++++++------------
 src/target/target.h |  1 +
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/target/target.c b/src/target/target.c
index 0a44e7b3..91fdd9ea 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -215,28 +215,33 @@ target_t* get_current_target(command_context_t *cmd_ctx)
 	return target;
 }
 
+static void execute_script(struct command_context_s *cmd_ctx, char *reset_script)
+{
+	FILE *script;
+	script = open_file_from_path(reset_script, "r");
+	if (!script)
+	{
+		LOG_ERROR("couldn't open script file %s", reset_script);
+		return;
+	}
+	
+	LOG_INFO("executing script '%s'", reset_script);
+	command_run_file(cmd_ctx, script, COMMAND_EXEC);
+	fclose(script);
+}
+
 /* Process target initialization, when target entered debug out of reset
  * the handler is unregistered at the end of this function, so it's only called once
  */
 int target_init_handler(struct target_s *target, enum target_event event, void *priv)
 {
-	FILE *script;
 	struct command_context_s *cmd_ctx = priv;
 	
 	if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
 	{
 		target_unregister_event_callback(target_init_handler, priv);
 
-		script = open_file_from_path(target->reset_script, "r");
-		if (!script)
-		{
-			LOG_ERROR("couldn't open script file %s", target->reset_script);
-				return ERROR_OK;
-		}
-
-		LOG_INFO("executing reset script '%s'", target->reset_script);
-		command_run_file(cmd_ctx, script, COMMAND_EXEC);
-		fclose(script);
+		execute_script(cmd_ctx, target->reset_script);
 
 		jtag_execute_queue();
 	}
@@ -295,6 +300,13 @@ int target_process_reset(struct command_context_s *cmd_ctx)
 
 	jtag->speed(jtag_speed);
 
+	target = targets;
+	while (target)
+	{
+		execute_script(cmd_ctx, target->pre_reset_script);
+		target = target->next;
+	}
+	
 	if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
 		return retval;
 	
@@ -1422,6 +1434,7 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
 				(*last_target_p)->run_and_halt_time = 1000; /* default 1s */
 				
 				(*last_target_p)->reset_script = NULL;
+				(*last_target_p)->pre_reset_script = NULL;
 				(*last_target_p)->post_halt_script = NULL;
 				(*last_target_p)->pre_resume_script = NULL;
 				(*last_target_p)->gdb_program_script = NULL;
@@ -1488,12 +1501,18 @@ int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, c
 		return ERROR_COMMAND_SYNTAX_ERROR;
 	}
 	
-	if (strcmp(args[1], "reset") == 0)
+	if ((strcmp(args[1], "reset") == 0)||(strcmp(args[1], "post_reset") == 0))
 	{
 		if (target->reset_script)
 			free(target->reset_script);
 		target->reset_script = strdup(args[2]);
 	}
+	else if (strcmp(args[1], "pre_reset") == 0)
+	{
+		if (target->pre_reset_script)
+			free(target->pre_reset_script);
+		target->pre_reset_script = strdup(args[2]);
+	}
 	else if (strcmp(args[1], "post_halt") == 0)
 	{
 		if (target->post_halt_script)
diff --git a/src/target/target.h b/src/target/target.h
index 17ac94a5..c12dff5e 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -200,6 +200,7 @@ typedef struct target_s
 	target_type_t *type;				/* target type definition (name, access functions) */
 	enum target_reset_mode reset_mode;	/* what to do after a reset */
 	int run_and_halt_time;				/* how long the target should run after a run_and_halt reset */
+	char *pre_reset_script;					/* script file to initialize the target before a reset */
 	char *reset_script;					/* script file to initialize the target after a reset */
 	char *post_halt_script;				/* script file to execute after the target halted */
 	char *pre_resume_script;			/* script file to execute before the target resumed */
-- 
cgit v1.2.3