jtag: add connect_type reset_config mode flag 76/976/3
authorSpencer Oliver <spen@spen-soft.co.uk>
Mon, 26 Nov 2012 12:42:41 +0000 (12:42 +0000)
committerFreddie Chopin <freddie.chopin@gmail.com>
Mon, 10 Dec 2012 16:13:52 +0000 (16:13 +0000)
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>
doc/openocd.texi
src/jtag/adapter.c
src/jtag/jtag.h

index c2ee20d..f2b2ffe 100644 (file)
@@ -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
index ec65827..5d29bd7 100644 (file)
@@ -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;
 }
index da5e025..3d2146c 100644 (file)
@@ -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);