Add SWD protocol support to sysfsgpio
[fw/openocd] / src / jtag / adapter.c
index ec65827041b1de869151354f3baaf75281c50ba9..2f5f6b436262a657590dfdc10514224654eed64f 100644 (file)
@@ -25,7 +25,7 @@
  *   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.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -48,7 +48,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)
 {
@@ -274,7 +274,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 +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;
 }
@@ -497,7 +519,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
 };