stlink: add read/write 8bit memory
[fw/openocd] / src / jtag / adapter.c
index b262a9a769d7918eaac0c04cd021f528dd302fea..acd434c440f58c79816f0d5c79b5de6096edff79 100644 (file)
@@ -35,6 +35,7 @@
 #include "minidriver.h"
 #include "interface.h"
 #include "interfaces.h"
+#include <transport/transport.h>
 
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
@@ -46,8 +47,7 @@
  */
 
 extern struct jtag_interface *jtag_interface;
-
-
+const char *jtag_only[] = { "jtag", NULL };
 
 static int
 jim_adapter_name(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -92,6 +92,26 @@ static int default_srst_asserted(int *srst_asserted)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(interface_transport_command)
+{
+       char **transports;
+       int retval;
+
+       retval = CALL_COMMAND_HANDLER(transport_list_parse, &transports);
+       if (retval != ERROR_OK) {
+               return retval;
+       }
+
+       retval = allow_transports(CMD_CTX, (const char **)transports);
+
+       if (retval != ERROR_OK) {
+               for (unsigned i = 0; transports[i]; i++)
+                       free(transports[i]);
+               free(transports);
+       }
+       return retval;
+}
+
 COMMAND_HANDLER(handle_interface_list_command)
 {
        if (strcmp(CMD_NAME, "interface_list") == 0 && CMD_ARGC > 0)
@@ -109,6 +129,8 @@ COMMAND_HANDLER(handle_interface_list_command)
 
 COMMAND_HANDLER(handle_interface_command)
 {
+       int retval;
+
        /* check whether the interface is already configured */
        if (jtag_interface)
        {
@@ -127,7 +149,7 @@ COMMAND_HANDLER(handle_interface_command)
 
                if (NULL != jtag_interfaces[i]->commands)
                {
-                       int retval = register_commands(CMD_CTX, NULL,
+                       retval = register_commands(CMD_CTX, NULL,
                                        jtag_interfaces[i]->commands);
                        if (ERROR_OK != retval)
                                return retval;
@@ -135,6 +157,19 @@ 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);
+               retval = allow_transports(CMD_CTX, jtag_interface->transports
+                                               ? jtag_interface->transports : jtag_only);
+                       if (ERROR_OK != retval)
+                               return retval;
+
                if (jtag_interface->khz == NULL)
                        jtag_interface->khz = default_khz;
                if (jtag_interface->speed_div == NULL)
@@ -150,7 +185,8 @@ COMMAND_HANDLER(handle_interface_command)
        /* no valid interface was found (i.e. the configuration option,
         * didn't match one of the compiled-in interfaces
         */
-       LOG_ERROR("The specified debug interface was not found (%s)", CMD_ARGV[0]);
+       LOG_ERROR("The specified debug interface was not found (%s)",
+                               CMD_ARGV[0]);
        CALL_COMMAND_HANDLER(handle_interface_list_command);
        return ERROR_JTAG_INVALID_INTERFACE;
 }
@@ -182,7 +218,7 @@ COMMAND_HANDLER(handle_reset_config_command)
                if (mask & m) {
                        LOG_ERROR("extra reset_config %s spec (%s)",
                                        "gating", *CMD_ARGV);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                if (m)
                        goto next;
@@ -202,7 +238,7 @@ COMMAND_HANDLER(handle_reset_config_command)
                if (mask & m) {
                        LOG_ERROR("extra reset_config %s spec (%s)",
                                        "signal", *CMD_ARGV);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                if (m)
                        goto next;
@@ -222,7 +258,7 @@ COMMAND_HANDLER(handle_reset_config_command)
                if (mask & m) {
                        LOG_ERROR("extra reset_config %s spec (%s)",
                                        "combination", *CMD_ARGV);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                if (m)
                        goto next;
@@ -238,7 +274,7 @@ COMMAND_HANDLER(handle_reset_config_command)
                if (mask & m) {
                        LOG_ERROR("extra reset_config %s spec (%s)",
                                        "trst_type", *CMD_ARGV);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                if (m)
                        goto next;
@@ -254,14 +290,14 @@ COMMAND_HANDLER(handle_reset_config_command)
                if (mask & m) {
                        LOG_ERROR("extra reset_config %s spec (%s)",
                                        "srst_type", *CMD_ARGV);
-                       return ERROR_INVALID_ARGUMENTS;
+                       return ERROR_COMMAND_SYNTAX_ERROR;
                }
                if (m)
                        goto next;
 
                /* caller provided nonsense; fail */
                LOG_ERROR("unknown reset_config flag (%s)", *CMD_ARGV);
-               return ERROR_INVALID_ARGUMENTS;
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
 next:
                /* Remember the bits which were specified (mask)
@@ -366,6 +402,23 @@ COMMAND_HANDLER(handle_adapter_nsrst_delay_command)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(handle_adapter_nsrst_assert_width_command)
+{
+       if (CMD_ARGC > 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       if (CMD_ARGC == 1)
+       {
+               unsigned width;
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], width);
+
+               jtag_set_nsrst_assert_width(width);
+       }
+       command_print(CMD_CTX, "adapter_nsrst_assert_width: %u", jtag_get_nsrst_assert_width());
+       return ERROR_OK;
+}
+
+
+
 COMMAND_HANDLER(handle_adapter_khz_command)
 {
        if (CMD_ARGC > 1)
@@ -420,6 +473,13 @@ static const struct command_registration interface_command_handlers[] = {
                .help = "delay after deasserting SRST in ms",
                .usage = "[milliseconds]",
        },
+       {
+               .name = "adapter_nsrst_assert_width",
+               .handler = handle_adapter_nsrst_assert_width_command,
+               .mode = COMMAND_ANY,
+               .help = "delay after asserting SRST in ms",
+               .usage = "[milliseconds]",
+       },
        {
                .name = "interface",
                .handler = handle_interface_command,
@@ -427,6 +487,13 @@ static const struct command_registration interface_command_handlers[] = {
                .help = "Select a debug adapter interface (driver)",
                .usage = "driver_name",
        },
+       {
+               .name = "interface_transports",
+               .handler = interface_transport_command,
+               .mode = COMMAND_CONFIG,
+               .help = "Declare transports the interface supports.",
+               .usage = "transport ... ",
+       },
        {
                .name = "interface_list",
                .handler = handle_interface_list_command,