]> git.sur5r.net Git - openocd/commitdiff
Charles Hardin <ckhardin@gmail.com> and Øyvind Harboe
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 17 Jul 2008 08:34:14 +0000 (08:34 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 17 Jul 2008 08:34:14 +0000 (08:34 +0000)
This patch just uses the command.c interface to create tcl commands for the root level commands and avoids a bit of the "TCL" bleed into the rest of the openocd code.

Multilevel commands also supported.

git-svn-id: svn://svn.berlios.de/openocd/trunk@818 b42882b7-edfa-0310-969c-e2dbd0fdcd60

doc/openocd.texi
src/flash/flash.c
src/helper/command.c
src/helper/command.h
src/openocd.c
src/startup.tcl
src/target/Makefile.am
src/target/target/at91eb40a.tcl [deleted file]

index 3fc5fa5e62d843dc05b693a4c896a1447dad7191..e91e8a0a0c761b218b25f417b4e77a9f6e08b1ca 100644 (file)
@@ -1441,6 +1441,12 @@ Thus, to get the names of the associative array is easy:
 Lists returned must be relatively small. Otherwise a range
 should be passed in to the proc in question.
 
+Low level commands are prefixed with "openocd_", e.g. openocd_flash_banks
+is the low level API upon which "flash banks" is implemented.
+
+OpenOCD commands can consist of two words, e.g. "flash banks". The
+startup.tcl "unknown" proc will translate this into a tcl proc
+called "flash_banks".
 
 
 @node Upgrading
index b51db58c3c8a00b2da20667c34332f25ad7d78cc..900fdbf9dc3f2bb3cb2739fa1b1e9724bd09bca4 100644 (file)
@@ -188,7 +188,7 @@ int flash_init_drivers(struct command_context_s *cmd_ctx)
 {
        if (flash_banks)
        {
-               Jim_CreateCommand(interp, "flash_banks", Jim_Command_flash_banks, NULL, NULL );
+               Jim_CreateCommand(interp, "openocd_flash_banks", Jim_Command_flash_banks, NULL, NULL );
                
                register_command(cmd_ctx, flash_cmd, "info", handle_flash_info_command, COMMAND_EXEC,
                                                 "print info about flash bank <num>");
index f86777cd6ff55592d59e2663f50cb9c683a45d8a..d31c3588c22e8e607a2a3e99dd3eae5eb48dc5e1 100644 (file)
 #include <openocd_tcl.h>
 
 int fast_and_dangerous = 0;
+extern command_context_t *active_cmd_ctx;
 
 int handle_sleep_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int handle_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_fast_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static void tcl_output(void *privData, const char *file, int line, const char *function, const char *string)
+{              
+       Jim_Obj *tclOutput=(Jim_Obj *)privData;
 
-/* forward declaration of jim_command */
-extern int jim_command(command_context_t *context, char *line);
+       Jim_AppendString(interp, tclOutput, string, strlen(string));
+}
+
+static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       /* the private data is stashed in the interp structure */
+       command_t *c;
+       command_context_t *context;
+       int *retval;
+       int i;
+       int nwords;
+       char **words;
+
+       target_call_timer_callbacks_now();
+       LOG_USER_N("%s", ""); /* Keep GDB connection alive*/ 
+       
+       c = interp->cmdPrivData;
+       LOG_DEBUG("script_command - %s", c->name);
+
+       nwords = argc;
+       words = malloc(sizeof(char *) * nwords);
+       for (i = 0; i < nwords; i++)
+       {
+               int len;
+
+               words[i] = strdup(Jim_GetString(argv[i], &len));
+               if (words[i] == NULL) 
+               {
+                       return JIM_ERR;
+               }
+               LOG_DEBUG("script_command - %s, argv[%u]=%s", c->name, i, words[i]);
+       }
+
+       /* grab the command context from the associated data */
+       context = Jim_GetAssocData(interp, "context");
+       retval = Jim_GetAssocData(interp, "retval"); 
+       if (context != NULL && retval != NULL)
+       {
+               /* capture log output and return it */
+               Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
+               log_add_callback(tcl_output, tclOutput);
+               
+               *retval = run_command(context, c, words, nwords);
+               
+               log_remove_callback(tcl_output, tclOutput);
+               Jim_SetResult(interp, tclOutput);
+               
+       }
 
+       for (i = 0; i < nwords; i++)
+               free(words[i]);
+       free(words);
 
+       return (*retval==ERROR_OK)?JIM_OK:JIM_ERR;
+}
 
 command_t* register_command(command_context_t *context, command_t *parent, char *name, int (*handler)(struct command_context_s *context, char* name, char** args, int argc), enum command_mode mode, char *help)
 {
@@ -98,6 +152,33 @@ command_t* register_command(command_context_t *context, command_t *parent, char
                        context->commands = c;
                }
        }
+       
+       /* just a placeholder, no handler */
+       if (c->handler==NULL)
+               return c;
+
+       /* If this is a two level command, e.g. "flash banks", then the
+        * "unknown" proc in startup.tcl must redirect to  this command.
+        * 
+        * "flash banks" is translated by "unknown" to "flash_banks"
+        * if such a proc exists
+        */
+       /* Print help for command */
+       const char *t1="";
+       const char *t2="";
+       const char *t3="";
+       /* maximum of two levels :-) */
+       if (c->parent!=NULL)
+       {
+               t1=c->parent->name;
+               t2="_";
+       }
+       t3=c->name;
+       const char *full_name=alloc_printf("%s%s%s", t1, t2, t3);
+       Jim_CreateCommand(interp, full_name, script_command, c, NULL);
+       free((void *)full_name);
+       
+       
        /* accumulate help text in Tcl helptext list.  */
     Jim_Obj *helptext=Jim_GetGlobalVariableStr(interp, "ocd_helptext", JIM_ERRMSG);
     if (Jim_IsShared(helptext))
@@ -196,75 +277,6 @@ int unregister_command(command_context_t *context, char *name)
        return ERROR_OK;
 }
 
-int parse_line(char *line, char *words[], int max_words)
-{
-       int nwords = 0;
-       char *p = line;
-       char *word_start = line;
-       int inquote = 0;
-
-       while (nwords < max_words - 1)
-       {
-               /* check if we reached
-                * a terminating NUL
-                * a matching closing quote character " or '
-                * we're inside a word but not a quote, and the current character is whitespace
-                */
-               if (!*p || *p == inquote || (word_start && !inquote && isspace(*p)))
-               {
-                       /* we're inside a word or quote, and reached its end*/
-                       if (word_start)
-                       {
-                               int len;
-                               char *word_end=p;
-                               
-                               /* This will handle extra whitespace within quotes */
-                               while (isspace(*word_start)&&(word_start<word_end))
-                                       word_start++;
-                               while (isspace(*(word_end-1))&&(word_start<word_end))
-                                       word_end--;
-                               len = word_end - word_start;
-                               
-                               if (len>0)
-                               {
-                                       /* copy the word */
-                                       memcpy(words[nwords] = malloc(len + 1), word_start, len);
-                                       /* add terminating NUL */
-                                       words[nwords++][len] = 0;
-                               }
-                       }
-                       /* we're done parsing the line */
-                       if (!*p)
-                               break;
-
-                       /* skip over trailing quote or whitespace*/
-                       if (inquote || isspace(*p))
-                               p++;
-                       while (isspace(*p))
-                               p++;
-                       
-                       inquote = 0;
-                       word_start = 0;
-               }
-               else if (*p == '"' || *p == '\'')
-               {
-                       /* we've reached the beginning of a quote */
-                       inquote = *p++;
-                       word_start = p;
-               }
-               else
-               {
-                       /* we've reached the beginning of a new word */
-                       if (!word_start)
-                               word_start = p;
-                       
-                       /* normal character, skip */
-                       p++;
-               }
-       }
-       
-       return nwords;
-}
 
 void command_output_text(command_context_t *context, const char *data)
 {
@@ -308,51 +320,13 @@ void command_print(command_context_t *context, char *format, ...)
        va_end(ap);
 }
 
-command_t *find_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word, int *new_start_word)
-{
-       command_t *c;
-       
-       for (c = commands; c; c = c->next)
-       {
-               if (strcasecmp(c->name, words[start_word]))
-                       continue;
-
-               if ((context->mode == COMMAND_CONFIG) || (c->mode == COMMAND_ANY) || (c->mode == context->mode) )
-               {
-                       if (!c->children)
-                       {
-                               if (!c->handler)
-                               {
-                                       return NULL;
-                               }
-                               else
-                               {
-                                       *new_start_word=start_word;
-                                       return c;
-                               }
-                       }
-                       else
-                       {
-                               if (start_word == num_words - 1)
-                               {
-                                       return NULL;
-                               }
-                               return find_command(context, c->children, words, num_words, start_word + 1, new_start_word);
-                       }
-               }
-       }
-       return NULL;
-}
-
-int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words)
+int run_command(command_context_t *context, command_t *c, char *words[], int num_words)
 {
        int start_word=0;
-       command_t *c;
-       c = find_command(context, commands, words, num_words, start_word, &start_word);
-       if (c == NULL)
+       if (!((context->mode == COMMAND_CONFIG) || (c->mode == COMMAND_ANY) || (c->mode == context->mode) ))
        {
-               /* just return command not found */
-               return ERROR_COMMAND_NOTFOUND;
+               /* Config commands can not run after the config stage */
+               return ERROR_FAIL;
        }
        
        int retval = c->handler(context, c->name, words + start_word + 1, num_words - start_word - 1);
@@ -370,8 +344,6 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
                }
                t3=c->name;
                command_run_linef(context, "help {%s%s%s}", t1, t2, t3);
-               
-               
        }
        else if (retval == ERROR_COMMAND_CLOSE_CONNECTION)
        {
@@ -388,55 +360,58 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
        return retval; 
 }
 
-int command_run_line_internal(command_context_t *context, char *line)
+int command_run_line(command_context_t *context, char *line)
 {
-       LOG_USER_N("%s", ""); /* Keep GDB connection alive*/ 
-       
-       int nwords;
-       char *words[128] = {0};
+       /* all the parent commands have been registered with the interpreter
+        * so, can just evaluate the line as a script and check for
+        * results
+        */
+       /* run the line thru a script engine */
        int retval;
-       int i;
-
-       /* skip preceding whitespace */
-       while (isspace(*line))
-               line++;
-       
-       /* empty line, ignore */
-       if (!*line)
-               return ERROR_OK;
-       
-       /* ignore comments */
-       if (*line && (line[0] == '#'))
-               return ERROR_OK;
-       
-       LOG_DEBUG("%s", line);
-
-       nwords = parse_line(line, words, sizeof(words) / sizeof(words[0]));
-       
-       if (nwords > 0)
-       {
-               retval = find_and_run_command(context, context->commands, words, nwords);
+       int retcode;
+
+       Jim_DeleteAssocData(interp, "context"); /* remove existing */
+       retcode = Jim_SetAssocData(interp, "context", NULL, context);
+       if (retcode != JIM_OK)
+               return ERROR_FAIL;
+
+       /* associated the return value */
+       retval = ERROR_OK;
+       Jim_DeleteAssocData(interp, "retval"); /* remove existing */
+       retcode = Jim_SetAssocData(interp, "retval", NULL, &retval);
+       if (retcode != JIM_OK)
+               return ERROR_FAIL;
+
+       retcode = Jim_Eval(interp, line);       
+       if (retcode == JIM_ERR) {
+               Jim_PrintErrorMessage(interp);
+       } else if (retcode == JIM_EXIT) {
+               /* ignore. */
+               /* exit(Jim_GetExitCode(interp)); */
+       } else {
+               const char *result;
+               int reslen;
+
+               result = Jim_GetString(Jim_GetResult(interp), &reslen);
+               if (reslen) {
+                       int i;
+                       char buff[256+1];
+                       for (i = 0; i < reslen; i += 256)
+                       {
+                               int chunk;
+                               chunk = reslen - i;
+                               if (chunk > 256)
+                                       chunk = 256;
+                               strncpy(buff, result+i, chunk);
+                               buff[chunk] = 0; 
+                               LOG_USER_N("%s", buff);
+                       }
+                       LOG_USER_N("%s", "\n");
+               }
        }
-       else
-               return ERROR_INVALID_ARGUMENTS;
-       
-       for (i = 0; i < nwords; i++)
-               free(words[i]);
-       
        return retval;
 }
 
-int command_run_line(command_context_t *context, char *line)
-{
-       /* if a command is unknown to the "unknown" proc in tcl/commands.tcl will
-        * redirect it to OpenOCD.
-        * 
-        * This avoids having to type the "openocd" prefix and makes OpenOCD
-        * commands "native" to Tcl.
-        */
-       return jim_command(context, line);
-}
-
 
 int command_run_linef(command_context_t *context, char *format, ...)
 {
@@ -466,7 +441,7 @@ command_context_t* copy_command_context(command_context_t* context)
        command_context_t* copy_context = malloc(sizeof(command_context_t));
 
        *copy_context = *context;
-       
+
        return copy_context;
 }
 
@@ -491,15 +466,21 @@ command_context_t* command_init()
        register_command(context, NULL, "sleep", handle_sleep_command,
                                         COMMAND_ANY, "sleep for <n> milliseconds");
        
-       register_command(context, NULL, "time", handle_time_command,
-                                        COMMAND_ANY, "time <cmd + args> - execute <cmd + args> and print time it took");
-       
        register_command(context, NULL, "fast", handle_fast_command,
                                         COMMAND_ANY, "fast <enable/disable> - place at beginning of config files. Sets defaults to fast and dangerous.");
        
        return context;
 }
 
+int command_context_mode(command_context_t *cmd_ctx, enum command_mode mode)
+{
+       if (!cmd_ctx)
+               return ERROR_INVALID_ARGUMENTS;
+
+       cmd_ctx->mode = mode;
+       return ERROR_OK;
+}
+
 /* sleep command sleeps for <n> miliseconds
  * this is useful in target startup scripts
  */
@@ -525,33 +506,3 @@ int handle_fast_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
        
        return ERROR_OK;
 }
-
-
-int handle_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       duration_t duration;
-       char *duration_text;
-       int retval;
-       float t;
-       
-       if (argc<1)
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       
-       duration_start_measure(&duration);
-       
-       retval = find_and_run_command(cmd_ctx, cmd_ctx->commands, args, argc);
-       if (retval == ERROR_COMMAND_NOTFOUND)
-       {
-               command_print(cmd_ctx, "Command %s not found", args[0]);
-       }
-       
-       duration_stop_measure(&duration, &duration_text);
-       
-       t=duration.duration.tv_sec;
-       t+=((float)duration.duration.tv_usec / 1000000.0);
-       command_print(cmd_ctx, "%s took %fs", args[0], t);
-       
-       free(duration_text);
-
-       return retval;
-}
index 76a49a545dcdd190e12418ff83affee92f5938df..c90ed0f69628a23a57eaa048dcb666d268e0aa8f 100644 (file)
@@ -67,15 +67,16 @@ extern int unregister_command(command_context_t *context, char *name);
 extern int unregister_all_commands(command_context_t *context);
 extern void command_set_output_handler(command_context_t* context, int (*output_handler)(struct command_context_s *context, const char* line), void *priv);
 extern command_context_t* copy_command_context(command_context_t* context);
+extern int command_context_mode(command_context_t *context, enum command_mode mode);
 extern command_context_t* command_init();
 extern int command_done(command_context_t *context);
 extern void command_print(command_context_t *context, char *format, ...);
 extern void command_print_sameline(command_context_t *context, char *format, ...);
 extern int command_run_line(command_context_t *context, char *line);
 extern int command_run_linef(command_context_t *context, char *format, ...);
-extern int command_run_line_internal(command_context_t *context, char *line);
 extern void command_output_text(command_context_t *context, const char *data);
 
+
 #define                ERROR_COMMAND_CLOSE_CONNECTION          (-600)
 #define                ERROR_COMMAND_SYNTAX_ERROR                      (-601)
 #define                ERROR_COMMAND_NOTFOUND                          (-602)
index 3090bc4429574acfceac257ee1cfbfbd82cd8b00..1a3adc616e33a3b3ca851ac759ceef05701ed177 100644 (file)
@@ -486,12 +486,6 @@ static int Jim_Command_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *a
        return JIM_OK;
 }
 
-static void tcl_output(void *privData, const char *file, int line, const char *function, const char *string)
-{              
-       Jim_Obj *tclOutput=(Jim_Obj *)privData;
-
-       Jim_AppendString(interp, tclOutput, string, strlen(string));
-}
 
 static int openocd_retval; 
 
@@ -547,48 +541,6 @@ int jim_command(command_context_t *context, char *line)
        return retval;
 }
 
-int startLoop = 0;
-
-static int Jim_Command_openocd_ignore(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int ignore)
-{
-       int retval;
-       char *cmd = (char*)Jim_GetString(argv[1], NULL);
-       
-       Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
-       
-       if (startLoop)
-       {
-               /* We don't know whether or not the telnet/gdb server is running... */
-               target_call_timer_callbacks_now();
-       }
-       
-       log_add_callback(tcl_output, tclOutput);
-       retval=command_run_line_internal(active_cmd_ctx, cmd);
-
-       /* we need to be able to get at the retval, so we store in a global variable */
-       openocd_retval=retval;
-       
-       if (startLoop)
-       {
-               target_call_timer_callbacks_now();
-       }
-       log_remove_callback(tcl_output, tclOutput);
-       
-       Jim_SetResult(interp, tclOutput);
-       
-       return (ignore||(retval==ERROR_OK))?JIM_OK:JIM_ERR;
-}
-
-static int Jim_Command_openocd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
-       return Jim_Command_openocd_ignore(interp, argc, argv, 1); 
-}
-
-static int Jim_Command_openocd_throw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
-       return Jim_Command_openocd_ignore(interp, argc, argv, 0); 
-}
-
 /* find full path to file */
 static int Jim_Command_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
@@ -722,8 +674,6 @@ extern unsigned const char startup_tcl[];
 
 void initJim(void)
 {      
-       Jim_CreateCommand(interp, "openocd", Jim_Command_openocd, NULL, NULL);
-       Jim_CreateCommand(interp, "openocd_throw", Jim_Command_openocd_throw, NULL, NULL);
        Jim_CreateCommand(interp, "openocd_find", Jim_Command_find, NULL, NULL);
        Jim_CreateCommand(interp, "echo", Jim_Command_echo, NULL, NULL);
        Jim_CreateCommand(interp, "mem2array", Jim_Command_mem2array, NULL, NULL );
@@ -843,8 +793,6 @@ int openocd_main(int argc, char *argv[])
        if (daemon_startup)
                command_run_line(cmd_ctx, "reset");
        
-       startLoop=1;
-
        /* handle network connections */
        server_loop(cmd_ctx);
 
index abdf58ff42b00c5f13e80ce48092c48368b3949b..11ffe8515f144ac08f98331518e94d97112b1e84 100644 (file)
@@ -11,8 +11,6 @@
 # Commands can be more than one word and they are stored
 # as "flash banks" "help text x x x"
 
-set ocd_helptext {}
-
 proc add_help_text {cmd cmd_help} {
        global ocd_helptext
        lappend ocd_helptext [list $cmd $cmd_help]
@@ -39,10 +37,10 @@ proc board_test {} {
 
 # Show flash in human readable form
 # This is an example of a human readable form of a low level fn
-proc flash_banks_pretty {} { 
+proc flash_banks {} { 
        set i 0         
        set result ""
-       foreach {a} [flash_banks] {
+       foreach {a} [openocd_flash_banks] {
                if {$i > 0} {
                        set result "$result\n"
                }
@@ -58,14 +56,6 @@ proc exit {} {
        openocd_throw exit
 }
 
-# We have currently converted only "flash banks" to tcl.
-proc flash args {
-       if {[string compare [lindex $args 0] banks]==0} {
-               return [flash_banks_pretty]
-       }
-       openocd_throw "flash $args"
-}
-
 #Print help text for a command. Word wrap
 #help text that is too wide inside column.
 proc help {args} {
@@ -103,24 +93,30 @@ proc help {args} {
 add_help_text help "Tcl implementation of help command"
 
 
+#a bit of backwards compatibility
+proc openocd_throw {cmd} {
+       return [eval $cmd]
+}
+
+#a bit of backwards compatibility
+proc openocd {cmd} {
+       return [eval $cmd]
+}
+
 # If a fn is unknown to Tcl, we try to execute it as an OpenOCD command
+#
+# We also support two level commands. "flash banks" is translated to
+# flash_banks
 proc unknown {args} {
-       if {[string length $args]>0} {
-               set cmd ""
-               # We need to add back quotes for arguments w/space
-               # for args without space, we can add quotes anyway
-               foreach {a} $args {
-                       set cmd "$cmd \"$a\""
-               }
-               openocd_throw $cmd
+       # do the name mangling from "flash banks" to "flash_banks"
+       if {[llength $args]>=2} {
+               set cmd_name "[lindex $args 0]_[lindex $args 1]"
+               # Fix?? add a check here if this is a command?
+               # we'll strip away args until we fail anyway...
+               return [eval "$cmd_name [lrange $args 2 end]"]
        }
-       # openocd_throw outputs while running and also sets the
-       # primary return value to the output of the command
-       #
-       # The primary return value have been set by "openocd" above,
-       # so we need to clear it, lest we print out the output from
-       # the command twice.
-       return ""
+       # This really is an unknown command.
+       puts "Unknown command: $args"
 }
 
 
index 0fb463ae84ce35603723bac75b3ecc6a911d3b81..d8c66c6395efb76b43a1c8eaf797b8f7d5142e25 100644 (file)
@@ -34,6 +34,6 @@ nobase_dist_pkglib_DATA = xscale/debug_handler.bin event/at91eb40a_reset.script
        interface/calao-usb-a9260.cfg target/at91sam9260minimal.cfg  event/lpc2148_reset.script \
        interface/chameleon.cfg interface/at91rm9200.cfg interface/jlink.cfg interface/arm-usb-ocd.cfg \
        interface/signalyzer.cfg event/eir-sam7se512_reset.script target/eir-sam7se512.cfg \
-       event/hammer_reset.script interface/flyswatter.cfg target/hammer.cfg target/mx31.cfg target/at91eb40a.tcl \
+       event/hammer_reset.script interface/flyswatter.cfg target/hammer.cfg target/mx31.cfg  \
        event/str730_program.script event/str750_program.script
 
diff --git a/src/target/target/at91eb40a.tcl b/src/target/target/at91eb40a.tcl
deleted file mode 100644 (file)
index de57995..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#Script for AT91EB40a
-
-#Atmel ties SRST & TRST together, at which point it makes
-#no sense to use TRST, but use TMS instead.
-#
-#The annoying thing with tying SRST & TRST together is that
-#there is no way to halt the CPU *before and during* the
-#SRST reset, which means that the CPU will run a number
-#of cycles before it can be halted(as much as milliseconds).
-openocd {reset_config srst_only srst_pulls_trst}
-#jtag scan chain
-#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
-openocd {jtag_device 4 0x1 0xf 0xe}
-
-#target configuration
-openocd {target arm7tdmi little 0 arm7tdmi-s_r4}
-
-# speed up memory downloads
-openocd {arm7 fast_memory_access enable}
-openocd {arm7_9 dcc_downloads enable}
-
-#flash driver
-openocd {flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf}
-
-# required for usable performance. Used for lots of
-# other things than flash programming.
-openocd {working_area 0 0x00000000 0x20000 nobackup}
-
-#force hardware values - we're running out of flash more
-#often than not. The user can disable this in his
-#subsequent config script.
-openocd {arm7_9 force_hw_bkpts enable}
-
-set reset_count 0
-
-proc target_reset_0 {} {
-       global reset_count
-       # Reset script for AT91EB40a
-       openocd {reg cpsr 0x000000D3}           
-       openocd {mww 0xFFE00020 0x1}
-       openocd {mww 0xFFE00024 0x00000000}  
-       openocd {mww 0xFFE00000 0x01002539} 
-       openocd {mww 0xFFFFF124 0xFFFFFFFF}  
-       openocd {mww 0xffff0010 0x100}
-       openocd {mww 0xffff0034 0x100}
-       set reset_count [expr $reset_count+1]
-       echo "Testing reset $reset_count !"
-}
-
-proc target_pre_reset_0 {} {
-       global reset_count
-       set reset_count [expr $reset_count+1]
-       echo "Testing pre_reset $reset_count !"
-}