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);
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]))
exit(-1);
}
- for (i=0; i<num_states; i++)
+ for (int i = 0; i < num_states; i++)
{
if (path[i] == TAP_RESET)
{
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];
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...
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;
}
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;
}
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();
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)
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,
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)
{
}
/* 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)