From 39b57471bfd92ef0d9a3aceb69f40c1335f5b62f Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Tue, 6 Oct 2009 08:10:57 +0000
Subject: [PATCH] Introduced jtag_init and "jtag arp_init" to allow target
 scripts more control over how OpenOCD starts up and initializes the target.

git-svn-id: svn://svn.berlios.de/openocd/trunk@2805 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/helper/startup.tcl | 10 ++++++++++
 src/jtag/core.c        | 22 +++++++++++-----------
 src/jtag/jtag.h        |  5 +++--
 src/jtag/tcl.c         | 13 +++++++++++++
 4 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl
index 7225929fb..229aa066f 100644
--- a/src/helper/startup.tcl
+++ b/src/helper/startup.tcl
@@ -359,3 +359,13 @@ proc capture_catch {a} {
 	} result
 	return $result
 }
+
+
+# Executed during "init". Can be implemented by target script 
+# tar
+proc jtag_init {} {
+	if {[catch {jtag arp_init} err]!=0} {
+		# try resetting additionally
+		jtag arp_init-reset
+	}
+}
\ No newline at end of file
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 07eec64f4..854236f3d 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1,16 +1,16 @@
 /***************************************************************************
- *   Copyright (C) 2005 by Dominic Rath                                    *
- *   Dominic.Rath@gmx.de                                                   *
+ *   Copyright (C) 2009 Zachary T Welch                                    *
+ *   zw@superlucidity.net                                                  *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008,2009 Øyvind Harboe                            *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2009 SoftPLC Corporation                                *
  *       http://softplc.com                                                *
  *   dick@softplc.com                                                      *
  *                                                                         *
- *   Copyright (C) 2009 Zachary T Welch                                    *
- *   zw@superlucidity.net                                                  *
+ *   Copyright (C) 2005 by Dominic Rath                                    *
+ *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -1230,7 +1230,7 @@ int jtag_interface_init(struct command_context_s *cmd_ctx)
 	return ERROR_OK;
 }
 
-static int jtag_init_inner(struct command_context_s *cmd_ctx)
+int jtag_init_inner(struct command_context_s *cmd_ctx)
 {
 	jtag_tap_t *tap;
 	int retval;
@@ -1334,11 +1334,11 @@ int jtag_init(struct command_context_s *cmd_ctx)
 	int retval;
 	if ((retval = jtag_interface_init(cmd_ctx)) != ERROR_OK)
 		return retval;
-	if (jtag_init_inner(cmd_ctx) == ERROR_OK)
-	{
-		return ERROR_OK;
-	}
-	return jtag_init_reset(cmd_ctx);
+
+	if (Jim_Eval_Named(interp, "jtag_init", __FILE__, __LINE__) != JIM_OK)
+		return ERROR_FAIL;
+
+	return ERROR_OK;
 }
 
 unsigned jtag_get_speed_khz(void)
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index f255a70e1..786b2b839 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -335,8 +335,9 @@ extern int  jtag_interface_quit(void);
 extern int  jtag_init(struct command_context_s* cmd_ctx);
 
 /// reset, then initialize JTAG chain
-extern int  jtag_init_reset(struct command_context_s* cmd_ctx);
-extern int  jtag_register_commands(struct command_context_s* cmd_ctx);
+extern int jtag_init_reset(struct command_context_s* cmd_ctx);
+extern int jtag_register_commands(struct command_context_s* cmd_ctx);
+extern int jtag_init_inner(struct command_context_s *cmd_ctx);
 
 /**
  * @file
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 212be3557..9101d31ee 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -410,6 +410,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 	enum {
 		JTAG_CMD_INTERFACE,
+		JTAG_CMD_INIT,
 		JTAG_CMD_INIT_RESET,
 		JTAG_CMD_NEWTAP,
 		JTAG_CMD_TAPENABLE,
@@ -422,6 +423,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 	const Jim_Nvp jtag_cmds[] = {
 		{ .name = "interface"     , .value = JTAG_CMD_INTERFACE },
+		{ .name = "arp_init"      , .value = JTAG_CMD_INIT },
 		{ .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
 		{ .name = "newtap"        , .value = JTAG_CMD_NEWTAP },
 		{ .name = "tapisenabled"     , .value = JTAG_CMD_TAPISENABLED },
@@ -455,6 +457,17 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 		}
 		Jim_SetResultString(goi.interp, jtag_interface->name, -1);
 		return JIM_OK;
+	case JTAG_CMD_INIT:
+		if (goi.argc != 0) {
+			Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
+			return JIM_ERR;
+		}
+		e = jtag_init_inner(context);
+		if (e != ERROR_OK) {
+			Jim_SetResult_sprintf(goi.interp, "error: %d", e);
+			return JIM_ERR;
+		}
+		return JIM_OK;
 	case JTAG_CMD_INIT_RESET:
 		if (goi.argc != 0) {
 			Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
-- 
GitLab