added pre/post_reset scripts based on Pieter Conradie's ideas.
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 25 Jun 2008 08:47:19 +0000 (08:47 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 25 Jun 2008 08:47:19 +0000 (08:47 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@726 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/target.c
src/target/target.h

index 0a44e7b37370891ec41773a9601278e302ad06f0..91fdd9ea5f782b799f2018bf013a68e9e24e8c4d 100644 (file)
@@ -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)
index 17ac94a5563bfdbe5fcc36dcb3a23f0ac05b3e61..c12dff5e97673481e6a5616d37ed086fe555d90c 100644 (file)
@@ -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 */