jtag: add connect_type reset_config mode flag

This adds the ability to request to the adapter how we want to connect to
the target, eg. while srst is asserted or not.

This ability can very handy for connecting to unresponsive targets.
A prerequisite is that the target supports srst_nogate.

Change-Id: I0f7c9475160048e8a963e16077754f5403ac8325
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/976
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
This commit is contained in:
Spencer Oliver 2012-11-26 12:42:41 +00:00 committed by Freddie Chopin
parent 539a9cf208
commit c91dbd41ba
3 changed files with 41 additions and 7 deletions

View File

@ -3156,10 +3156,9 @@ from a particular combination of interface and board.
with a board that only wires up SRST.) with a board that only wires up SRST.)
The @var{mode_flag} options can be specified in any order, but only one The @var{mode_flag} options can be specified in any order, but only one
of each type -- @var{signals}, @var{combination}, of each type -- @var{signals}, @var{combination}, @var{gates},
@var{gates}, @var{trst_type}, @var{srst_type} and @var{connect_type}
@var{trst_type}, -- may be specified at a time.
and @var{srst_type} -- may be specified at a time.
If you don't provide a new value for a given type, its previous If you don't provide a new value for a given type, its previous
value (perhaps the default) is unchanged. value (perhaps the default) is unchanged.
For example, this means that you don't need to say anything at all about 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. while SRST is asserted.
Its converse is @option{srst_nogate}, indicating that JTAG commands Its converse is @option{srst_nogate}, indicating that JTAG commands
can safely be issued while SRST is active. 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 @end itemize
The optional @var{trst_type} and @var{srst_type} parameters allow the The optional @var{trst_type} and @var{srst_type} parameters allow the

View File

@ -289,6 +289,22 @@ COMMAND_HANDLER(handle_reset_config_command)
if (m) if (m)
goto next; 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 */ /* caller provided nonsense; fail */
LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV); LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV);
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
@ -314,7 +330,7 @@ next:
/* /*
* Display the (now-)current reset mode * Display the (now-)current reset mode
*/ */
char *modes[5]; char *modes[6];
/* minimal JTAG has neither SRST nor TRST (so that's the default) */ /* minimal JTAG has neither SRST nor TRST (so that's the default) */
switch (new_cfg & (RESET_HAS_TRST | RESET_HAS_SRST)) { switch (new_cfg & (RESET_HAS_TRST | RESET_HAS_SRST)) {
@ -368,14 +384,20 @@ next:
modes[4] = " srst_push_pull"; modes[4] = " srst_push_pull";
else else
modes[4] = " srst_open_drain"; modes[4] = " srst_open_drain";
if (new_cfg & RESET_CNCT_UNDER_SRST)
modes[5] = " connect_assert_srst";
else
modes[5] = " connect_deassert_srst";
} else { } else {
modes[2] = ""; modes[2] = "";
modes[4] = ""; 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[0], modes[1],
modes[2], modes[3], modes[4]); modes[2], modes[3], modes[4], modes[5]);
return ERROR_OK; return ERROR_OK;
} }

View File

@ -266,6 +266,7 @@ enum reset_types {
RESET_TRST_OPEN_DRAIN = 0x10, RESET_TRST_OPEN_DRAIN = 0x10,
RESET_SRST_PUSH_PULL = 0x20, RESET_SRST_PUSH_PULL = 0x20,
RESET_SRST_NO_GATING = 0x40, RESET_SRST_NO_GATING = 0x40,
RESET_CNCT_UNDER_SRST = 0x80
}; };
enum reset_types jtag_get_reset_config(void); enum reset_types jtag_get_reset_config(void);