diff --git a/doc/openocd.texi b/doc/openocd.texi
index 3fc5fa5e62d843dc05b693a4c896a1447dad7191..e91e8a0a0c761b218b25f417b4e77a9f6e08b1ca 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -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
diff --git a/src/flash/flash.c b/src/flash/flash.c
index b51db58c3c8a00b2da20667c34332f25ad7d78cc..900fdbf9dc3f2bb3cb2739fa1b1e9724bd09bca4 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -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>");
diff --git a/src/helper/command.c b/src/helper/command.c
index f86777cd6ff55592d59e2663f50cb9c683a45d8a..d31c3588c22e8e607a2a3e99dd3eae5eb48dc5e1 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -41,15 +41,69 @@
 #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;
-}
diff --git a/src/helper/command.h b/src/helper/command.h
index 76a49a545dcdd190e12418ff83affee92f5938df..c90ed0f69628a23a57eaa048dcb666d268e0aa8f 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -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)
diff --git a/src/openocd.c b/src/openocd.c
index 3090bc4429574acfceac257ee1cfbfbd82cd8b00..1a3adc616e33a3b3ca851ac759ceef05701ed177 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -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);
 
diff --git a/src/startup.tcl b/src/startup.tcl
index abdf58ff42b00c5f13e80ce48092c48368b3949b..11ffe8515f144ac08f98331518e94d97112b1e84 100644
--- a/src/startup.tcl
+++ b/src/startup.tcl
@@ -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"
 }
 
 
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index 0fb463ae84ce35603723bac75b3ecc6a911d3b81..d8c66c6395efb76b43a1c8eaf797b8f7d5142e25 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -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
index de57995c4a32ed18955b21f54f7a6b516e2301f7..0000000000000000000000000000000000000000
--- a/src/target/target/at91eb40a.tcl
+++ /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 !"
-}