[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