Factor interface list to its own command:
[openocd.git] / src / jtag / jtag.c
index b4d0cae89c66d1955a25cb121c778902ddcceb92..751e53f96e1454d4f73f4118d05c4a1ce542b9c8 100644 (file)
@@ -223,6 +223,8 @@ static jtag_interface_t *jtag_interface = NULL;
 int jtag_speed = 0;
 
 /* jtag commands */
+static int handle_interface_list_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc);
 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -606,8 +608,6 @@ void jtag_add_tlr(void)
 void jtag_add_pathmove(int num_states, const tap_state_t *path)
 {
        tap_state_t cur_state = cmd_queue_cur_state;
-       int i;
-       int retval;
 
        /* the last state has to be a stable state */
        if (!tap_is_state_stable(path[num_states - 1]))
@@ -616,7 +616,7 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path)
                exit(-1);
        }
 
-       for (i=0; i<num_states; i++)
+       for (int i = 0; i < num_states; i++)
        {
                if (path[i] == TAP_RESET)
                {
@@ -627,7 +627,8 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path)
                if ( tap_state_transition(cur_state, true)  != path[i]
                  && tap_state_transition(cur_state, false) != path[i])
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[i]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
+                                       tap_state_name(cur_state), tap_state_name(path[i]));
                        exit(-1);
                }
                cur_state = path[i];
@@ -635,51 +636,37 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path)
 
        jtag_checks();
 
-       retval = interface_jtag_add_pathmove(num_states, path);
+       jtag_set_error(interface_jtag_add_pathmove(num_states, path));
        cmd_queue_cur_state = path[num_states - 1];
-       if (retval!=ERROR_OK)
-               jtag_error=retval;
 }
 
 void jtag_add_runtest(int num_cycles, tap_state_t state)
 {
-       int retval;
-
        jtag_prelude(state);
-
-       /* executed by sw or hw fifo */
-       retval=interface_jtag_add_runtest(num_cycles, state);
-       if (retval!=ERROR_OK)
-               jtag_error=retval;
+       jtag_set_error(interface_jtag_add_runtest(num_cycles, state));
 }
 
 
-void jtag_add_clocks( int num_cycles )
+void jtag_add_clocks(int num_cycles)
 {
-       int retval;
-
-       if( !tap_is_state_stable(cmd_queue_cur_state) )
+       if (!tap_is_state_stable(cmd_queue_cur_state))
        {
-                LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
-                                tap_state_name(cmd_queue_cur_state) );
-                jtag_error = ERROR_JTAG_NOT_STABLE_STATE;
+                LOG_ERROR("jtag_add_clocks() called with TAP in unstable state \"%s\"",
+                                tap_state_name(cmd_queue_cur_state));
+                jtag_set_error(ERROR_JTAG_NOT_STABLE_STATE);
                 return;
        }
 
-       if( num_cycles > 0 )
+       if (num_cycles > 0)
        {
                jtag_checks();
-
-               retval = interface_jtag_add_clocks(num_cycles);
-               if (retval != ERROR_OK)
-                       jtag_error=retval;
+               jtag_set_error(interface_jtag_add_clocks(num_cycles));
        }
 }
 
 void jtag_add_reset(int req_tlr_or_trst, int req_srst)
 {
        int trst_with_tlr = 0;
-       int retval;
 
        /* FIX!!! there are *many* different cases here. A better
         * approach is needed for legal combinations of transitions...
@@ -703,7 +690,7 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
        if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst))
        {
                LOG_ERROR("BUG: requested reset would assert trst");
-               jtag_error=ERROR_FAIL;
+               jtag_set_error(ERROR_FAIL);
                return;
        }
 
@@ -716,7 +703,7 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
        if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
        {
                LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
-               jtag_error=ERROR_FAIL;
+               jtag_set_error(ERROR_FAIL);
                return;
        }
 
@@ -736,10 +723,10 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
 
        jtag_srst = req_srst;
 
-       retval = interface_jtag_add_reset(jtag_trst, jtag_srst);
-       if (retval!=ERROR_OK)
+       int retval = interface_jtag_add_reset(jtag_trst, jtag_srst);
+       if (retval != ERROR_OK)
        {
-               jtag_error=retval;
+               jtag_set_error(retval);
                return;
        }
        jtag_execute_queue();
@@ -798,11 +785,9 @@ tap_state_t jtag_get_end_state(void)
 
 void jtag_add_sleep(u32 us)
 {
-       keep_alive(); /* we might be running on a very slow JTAG clk */
-       int retval=interface_jtag_add_sleep(us);
-       if (retval!=ERROR_OK)
-               jtag_error=retval;
-       return;
+       /// @todo Here, keep_alive() appears to be a layering violation!!!
+       keep_alive();
+       jtag_set_error(interface_jtag_add_sleep(us));
 }
 
 int jtag_check_value_inner(u8 *captured, u8 *in_check_value, u8 *in_check_mask, int num_bits)
@@ -1618,6 +1603,9 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
 
        register_command(cmd_ctx, NULL, "interface", handle_interface_command,
                COMMAND_CONFIG, "try to configure interface");
+       register_command(cmd_ctx, NULL,
+               "interface_list", &handle_interface_list_command,
+               COMMAND_ANY, "list all built-in interfaces");
        register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
                COMMAND_ANY, "(DEPRECATED) set jtag speed (if supported)");
        register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
@@ -1813,11 +1801,9 @@ static int default_srst_asserted(int *srst_asserted)
        return ERROR_OK;
 }
 
-static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_interface_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
-       int i;
-       int retval;
-
        /* check whether the interface is already configured */
        if (jtag_interface)
        {
@@ -1826,54 +1812,54 @@ static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd
        }
 
        /* interface name is a mandatory argument */
-       if (argc < 1 || args[0][0] == '\0')
-       {
+       if (argc != 1 || args[0][0] == '\0')
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
-       for (i=0; jtag_interfaces[i]; i++)
+       for (unsigned i = 0; NULL != jtag_interfaces[i]; i++)
        {
-               if (strcmp(args[0], jtag_interfaces[i]->name) == 0)
-               {
-                       if ((retval = jtag_interfaces[i]->register_commands(cmd_ctx)) != ERROR_OK)
-                       {
+               if (strcmp(args[0], jtag_interfaces[i]->name) != 0)
+                       continue;
+
+               int retval = jtag_interfaces[i]->register_commands(cmd_ctx);
+               if (ERROR_OK != retval)
                                return retval;
-                       }
 
-                       jtag_interface = jtag_interfaces[i];
+               jtag_interface = jtag_interfaces[i];
 
-                       if (jtag_interface->khz == NULL)
-                       {
-                               jtag_interface->khz = default_khz;
-                       }
-                       if (jtag_interface->speed_div == NULL)
-                       {
-                               jtag_interface->speed_div = default_speed_div;
-                       }
-                       if (jtag_interface->power_dropout == NULL)
-                       {
-                               jtag_interface->power_dropout = default_power_dropout;
-                       }
-                       if (jtag_interface->srst_asserted == NULL)
-                       {
-                               jtag_interface->srst_asserted = default_srst_asserted;
-                       }
+               if (jtag_interface->khz == NULL)
+                       jtag_interface->khz = default_khz;
+               if (jtag_interface->speed_div == NULL)
+                       jtag_interface->speed_div = default_speed_div;
+               if (jtag_interface->power_dropout == NULL)
+                       jtag_interface->power_dropout = default_power_dropout;
+               if (jtag_interface->srst_asserted == NULL)
+                       jtag_interface->srst_asserted = default_srst_asserted;
 
-                       return ERROR_OK;
-               }
+               return ERROR_OK;
        }
 
        /* no valid interface was found (i.e. the configuration option,
         * didn't match one of the compiled-in interfaces
         */
-       LOG_ERROR("No valid jtag interface found (%s)", args[0]);
-       LOG_ERROR("compiled-in jtag interfaces:");
-       for (i = 0; jtag_interfaces[i]; i++)
+       LOG_ERROR("The specified JTAG interface was not found (%s)", args[0]);
+       handle_interface_list_command(cmd_ctx, cmd, args, argc);
+       return ERROR_JTAG_INVALID_INTERFACE;
+}
+
+static int handle_interface_list_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
+{
+       if (strcmp(cmd, "interface_list") == 0 && argc > 0)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       command_print(cmd_ctx, "The following JTAG interfaces are available:");
+       for (unsigned i = 0; NULL != jtag_interfaces[i]; i++)
        {
-               LOG_ERROR("%i: %s", i, jtag_interfaces[i]->name);
+               const char *name = jtag_interfaces[i]->name;
+               command_print(cmd_ctx, "%u: %s", i + 1, name);
        }
 
-       return ERROR_JTAG_INVALID_INTERFACE;
+       return ERROR_OK;
 }
 
 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)