drivers: cmsis-dap: Print version info when available
[fw/openocd] / src / jtag / adapter.c
index e87090c0b43a9a72144d460848695b311071aa5d..2035788bf38a5f8db822c6ae20b1740008b3c6cc 100644 (file)
@@ -23,9 +23,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -48,7 +46,7 @@
  */
 
 extern struct jtag_interface *jtag_interface;
-const char *jtag_only[] = { "jtag", NULL };
+const char * const jtag_only[] = { "jtag", NULL };
 
 static int jim_adapter_name(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
 {
@@ -151,14 +149,14 @@ COMMAND_HANDLER(handle_interface_command)
 
                jtag_interface = jtag_interfaces[i];
 
-       /* LEGACY SUPPORT ... adapter drivers  must declare what
-        * transports they allow.  Until they all do so, assume
-        * the legacy drivers are JTAG-only
-        */
-       if (!jtag_interface->transports)
-               LOG_WARNING("Adapter driver '%s' did not declare "
-                       "which transports it allows; assuming "
-                       "legacy JTAG-only", jtag_interface->name);
+               /* LEGACY SUPPORT ... adapter drivers  must declare what
+                * transports they allow.  Until they all do so, assume
+                * the legacy drivers are JTAG-only
+                */
+               if (!jtag_interface->transports)
+                       LOG_WARNING("Adapter driver '%s' did not declare "
+                               "which transports it allows; assuming "
+                               "legacy JTAG-only", jtag_interface->name);
                retval = allow_transports(CMD_CTX, jtag_interface->transports
                                                ? jtag_interface->transports : jtag_only);
                        if (ERROR_OK != retval)
@@ -274,7 +272,7 @@ COMMAND_HANDLER(handle_reset_config_command)
                        goto next;
 
                /* srst_type (NOP without HAS_SRST) */
-               m |= RESET_SRST_PUSH_PULL;
+               m = RESET_SRST_PUSH_PULL;
                if (strcmp(*CMD_ARGV, "srst_push_pull") == 0)
                        tmp |= RESET_SRST_PUSH_PULL;
                else if (strcmp(*CMD_ARGV, "srst_open_drain") == 0)
@@ -289,6 +287,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;
@@ -311,11 +325,10 @@ next:
        } else
                new_cfg = jtag_get_reset_config();
 
-
        /*
         * 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)) {
@@ -369,14 +382,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;
 }
@@ -409,8 +428,6 @@ COMMAND_HANDLER(handle_adapter_nsrst_assert_width_command)
        return ERROR_OK;
 }
 
-
-
 COMMAND_HANDLER(handle_adapter_khz_command)
 {
        if (CMD_ARGC > 1)
@@ -432,9 +449,9 @@ COMMAND_HANDLER(handle_adapter_khz_command)
                return retval;
 
        if (cur_speed)
-               command_print(CMD_CTX, "%d kHz", cur_speed);
+               command_print(CMD_CTX, "adapter speed: %d kHz", cur_speed);
        else
-               command_print(CMD_CTX, "RCLK - adaptive");
+               command_print(CMD_CTX, "adapter speed: RCLK - adaptive");
 
        return retval;
 }
@@ -500,7 +517,8 @@ static const struct command_registration interface_command_handlers[] = {
                        "[srst_pulls_trst|trst_pulls_srst|combined|separate] "
                        "[srst_gates_jtag|srst_nogate] "
                        "[trst_push_pull|trst_open_drain] "
-                       "[srst_push_pull|srst_open_drain]",
+                       "[srst_push_pull|srst_open_drain] "
+                       "[connect_deassert_srst|connect_assert_srst]",
        },
        COMMAND_REGISTRATION_DONE
 };