aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/openocd.texi19
-rw-r--r--src/jtag/adapter.c28
-rw-r--r--src/jtag/jtag.h1
3 files changed, 41 insertions, 7 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi
index c2ee20de..f2b2ffe9 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -3156,10 +3156,9 @@ from a particular combination of interface and board.
with a board that only wires up SRST.)
The @var{mode_flag} options can be specified in any order, but only one
-of each type -- @var{signals}, @var{combination},
-@var{gates},
-@var{trst_type},
-and @var{srst_type} -- may be specified at a time.
+of each type -- @var{signals}, @var{combination}, @var{gates},
+@var{trst_type}, @var{srst_type} and @var{connect_type}
+-- may be specified at a time.
If you don't provide a new value for a given type, its previous
value (perhaps the default) is unchanged.
For example, this means that you don't need to say anything at all about
@@ -3201,6 +3200,18 @@ JTAG clock. This means that no communication can happen on JTAG
while SRST is asserted.
Its converse is @option{srst_nogate}, indicating that JTAG commands
can safely be issued while SRST is active.
+
+@item
+The @var{connect_type} tokens control flags that describe some cases where
+SRST is asserted while connecting to the target. @option{srst_nogate}
+is required to use this option.
+@option{connect_deassert_srst} (default)
+indicates that SRST will not be asserted while connecting to the target.
+Its converse is @option{connect_assert_srst}, indicating that SRST will
+be asserted before any target connection.
+Only some targets support this feature, STM32 and STR9 are examples.
+This feature is useful if you are unable to connect to your target due
+to incorrect options byte config or illegal program execution.
@end itemize
The optional @var{trst_type} and @var{srst_type} parameters allow the
diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index ec658270..5d29bd79 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -289,6 +289,22 @@ COMMAND_HANDLER(handle_reset_config_command)
if (m)
goto next;
+ /* connect_type - only valid when srst_nogate */
+ m = RESET_CNCT_UNDER_SRST;
+ if (strcmp(*CMD_ARGV, "connect_assert_srst") == 0)
+ tmp |= RESET_CNCT_UNDER_SRST;
+ else if (strcmp(*CMD_ARGV, "connect_deassert_srst") == 0)
+ /* connect normally - default */;
+ else
+ m = 0;
+ if (mask & m) {
+ LOG_ERROR("extra reset_config %s spec (%s)",
+ "connect_type", *CMD_ARGV);
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ }
+ if (m)
+ goto next;
+
/* caller provided nonsense; fail */
LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV);
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -314,7 +330,7 @@ next:
/*
* Display the (now-)current reset mode
*/
- char *modes[5];
+ char *modes[6];
/* minimal JTAG has neither SRST nor TRST (so that's the default) */
switch (new_cfg & (RESET_HAS_TRST | RESET_HAS_SRST)) {
@@ -368,14 +384,20 @@ next:
modes[4] = " srst_push_pull";
else
modes[4] = " srst_open_drain";
+
+ if (new_cfg & RESET_CNCT_UNDER_SRST)
+ modes[5] = " connect_assert_srst";
+ else
+ modes[5] = " connect_deassert_srst";
} else {
modes[2] = "";
modes[4] = "";
+ modes[5] = "";
}
- command_print(CMD_CTX, "%s %s%s%s%s",
+ command_print(CMD_CTX, "%s %s%s%s%s%s",
modes[0], modes[1],
- modes[2], modes[3], modes[4]);
+ modes[2], modes[3], modes[4], modes[5]);
return ERROR_OK;
}
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index da5e025f..3d2146c3 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -266,6 +266,7 @@ enum reset_types {
RESET_TRST_OPEN_DRAIN = 0x10,
RESET_SRST_PUSH_PULL = 0x20,
RESET_SRST_NO_GATING = 0x40,
+ RESET_CNCT_UNDER_SRST = 0x80
};
enum reset_types jtag_get_reset_config(void);