[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openocd-development
Subject:    [OpenOCD-devel] [PATCH]: 416b9c9 adapter: add command "arp_adapter_reset_assert {none|srst|trst|srst
From:       gerrit () openocd ! org (gerrit)
Date:       2019-08-13 14:31:23
Message-ID: 20190813143123.C80802522570 () mail ! openocd ! org
[Download RAW message or body]

This is an automated email from Gerrit.

Antonio Borneo (borneo.antonio@gmail.com) just uploaded a new patch set to Gerrit, \
which you can find at http://openocd.zylin.com/5277

-- gerrit

commit 416b9c93312a68f99ea71bbc03e12585a5bdb618
Author: Antonio Borneo <borneo.antonio@gmail.com>
Date:   Thu Jan 10 10:58:15 2019 +0100

    adapter: add command "arp_adapter_reset_assert {none|srst|trst|srst trst}"
    
    Inspired from http://openocd.zylin.com/#/c/3720/1
    
    Add a command to control the adapter signals srst and trst.
    Add macros for the flag's values assert/deassert to make clear what
    they mean and to propose a uniform set of values across the code.
    
    Change-Id: Ia8b13f4ded892942916cad7bda49540a896e7218
    Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
    Signed-off-by: Tomas Vanek <vanekt@fbl.cz>

diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index 29a9613..fa7c726 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -49,6 +49,22 @@
 extern struct jtag_interface *jtag_interface;
 const char * const jtag_only[] = { "jtag", NULL };
 
+enum nvp_assert_resets {
+	NVP_DEASSERT_ALL,
+	NVP_ASSERT_SRST,
+	NVP_ASSERT_TRST,
+};
+
+static const Jim_Nvp nvp_assert[] = {
+	{ .name = "srst", NVP_ASSERT_SRST },
+	{ .name = "SRST", NVP_ASSERT_SRST },
+	{ .name = "trst", NVP_ASSERT_TRST },
+	{ .name = "TRST", NVP_ASSERT_TRST },
+	{ .name = "none", NVP_DEASSERT_ALL },
+	{ .name = "false", NVP_DEASSERT_ALL },
+	{ .name = NULL, .value = -1 }
+};
+
 static int jim_adapter_name(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
 {
 	Jim_GetOptInfo goi;
@@ -451,6 +467,60 @@ static const struct command_registration \
adapter_command_handlers[] = {  COMMAND_REGISTRATION_DONE
 };
 
+static int jim_arp_adapter_reset_assert(Jim_Interp *interp, int argc,
+	Jim_Obj *const *argv)
+{
+	Jim_GetOptInfo goi;
+	Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
+	Jim_Nvp *n;
+	enum nvp_assert_resets arg1, arg2;
+	int e;
+
+	if (goi.argc != 1 && goi.argc != 2) {
+		Jim_WrongNumArgs(interp, 0, argv, "none | srst | trst | srst trst");
+		return JIM_ERR;
+	}
+
+	e = Jim_GetOpt_Nvp(&goi, nvp_assert, &n);
+	if (e != JIM_OK) {
+		Jim_GetOpt_NvpUnknown(&goi, nvp_assert, 1);
+		return e;
+	}
+	arg1 = n->value;
+
+	if (goi.argc == 0) {
+		switch (arg1) {
+			case NVP_DEASSERT_ALL:
+				e = adapter_resets(TRST_DEASSERT, SRST_DEASSERT);
+				break;
+			case NVP_ASSERT_SRST:
+				e = adapter_resets(TRST_DEASSERT, SRST_ASSERT);
+				break;
+			case NVP_ASSERT_TRST:
+			default:
+				e = adapter_resets(TRST_ASSERT, SRST_DEASSERT);
+				break;
+		}
+		return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
+	}
+
+	e = Jim_GetOpt_Nvp(&goi, nvp_assert, &n);
+	if (e != JIM_OK) {
+		Jim_GetOpt_NvpUnknown(&goi, nvp_assert, 0);
+		return e;
+	}
+	arg2 = n->value;
+	/* valid combinations for dual params are "srst trst" and "trst srst" */
+	if (arg1 == NVP_DEASSERT_ALL || arg2 == NVP_DEASSERT_ALL || arg1 == arg2) {
+		Jim_SetResultFormatted(interp, "Invalid parameter combination: %#s %#s",
+			goi.argv[-2], goi.argv[-1]);
+		return JIM_ERR;
+	}
+
+	e = adapter_resets(TRST_ASSERT, SRST_ASSERT);
+	return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
+}
+
 static const struct command_registration interface_command_handlers[] = {
 	{
 		.name = "adapter",
@@ -512,6 +582,13 @@ static const struct command_registration \
                interface_command_handlers[] = {
 		.usage = "",
 	},
 	{
+		.name = "arp_adapter_reset_assert",
+		.mode = COMMAND_ANY,
+		.jim_handler = jim_arp_adapter_reset_assert,
+		.help = "Controls SRST and TRST lines.",
+		.usage = "none | srst | trst | srst trst"
+	},
+	{
 		.name = "reset_config",
 		.handler = handle_reset_config_command,
 		.mode = COMMAND_ANY,
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 18956f2..a9e44df 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1819,6 +1819,43 @@ bool transport_is_jtag(void)
 	return get_current_transport() == &jtag_transport;
 }
 
+int adapter_resets(int trst, int srst)
+{
+	if (transport_is_jtag()) {
+		if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) {
+			LOG_ERROR("adapter has no srst signal");
+			return ERROR_FAIL;
+		}
+
+		/* adapters without trst signal will eventually use tlr sequence */
+		jtag_add_reset(trst, srst);
+		return ERROR_OK;
+	} else if (transport_is_swd()) {
+		if (trst == TRST_ASSERT) {
+			LOG_ERROR("transport has no trst signal");
+			return ERROR_FAIL;
+		}
+
+		if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) {
+			LOG_ERROR("adapter has no srst signal");
+			return ERROR_FAIL;
+		}
+		swd_add_reset(srst);
+		return ERROR_OK;
+	}
+
+	if (trst == TRST_DEASSERT && srst == SRST_DEASSERT)
+		return ERROR_OK;
+
+	if (get_current_transport() == NULL)
+		LOG_ERROR("transport is not selected");
+	else
+		LOG_ERROR("reset is not supported on transport %s",
+			get_current_transport()->name);
+
+	return ERROR_FAIL;
+}
+
 void adapter_assert_reset(void)
 {
 	if (transport_is_jtag()) {
diff --git a/src/jtag/interface.h b/src/jtag/interface.h
index 905f1eb..9478d13 100644
--- a/src/jtag/interface.h
+++ b/src/jtag/interface.h
@@ -322,6 +322,7 @@ struct jtag_interface {
 
 extern const char * const jtag_only[];
 
+int adapter_resets(int assert_trst, int assert_srst);
 void adapter_assert_reset(void);
 void adapter_deassert_reset(void);
 int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index c93243c..ff17831 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -77,6 +77,14 @@ typedef enum tap_state {
 } tap_state_t;
 
 /**
+ * Defines arguments for reset functions
+ */
+#define SRST_DEASSERT   0
+#define SRST_ASSERT     1
+#define TRST_DEASSERT   0
+#define TRST_ASSERT     1
+
+/**
  * Function tap_state_name
  * Returns a string suitable for display representing the JTAG tap_state
  */

-- 


_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic