#if BUILD_ECOSBOARD == 1
extern jtag_interface_t zy1000_interface;
-#endif
-
-#if BUILD_MINIDUMMY == 1
+#elif defined(BUILD_MINIDRIVER_DUMMY)
extern jtag_interface_t minidummy_interface;
-#endif
+#else // standard drivers
#if BUILD_PARPORT == 1
extern jtag_interface_t parport_interface;
#endif
#if BUILD_ARMJTAGEW == 1
extern jtag_interface_t armjtagew_interface;
#endif
+#endif // standard drivers
+/**
+ * The list of built-in JTAG interfaces, containing entries for those
+ * drivers that were enabled by the @c configure script.
+ *
+ * The list should be defined to contain either one minidriver interface
+ * or some number of standard driver interfaces, never both.
+ */
jtag_interface_t *jtag_interfaces[] = {
#if BUILD_ECOSBOARD == 1
&zy1000_interface,
-#endif
-#if BUILD_MINIDUMMY == 1
+#elif defined(BUILD_MINIDRIVER_DUMMY)
&minidummy_interface,
-#endif
+#else // standard drivers
#if BUILD_PARPORT == 1
&parport_interface,
#endif
#if BUILD_ARMJTAGEW == 1
&armjtagew_interface,
#endif
+#endif // standard drivers
NULL,
};
static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
interface_jtag_alloc_in_value32(field);
}
-void jtag_add_ir_scan_noverify(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
+void jtag_add_ir_scan_noverify(int in_count, const scan_field_t *in_fields,
+ tap_state_t state)
{
- int retval;
jtag_prelude(state);
- retval=interface_jtag_add_ir_scan(in_num_fields, in_fields, state);
- if (retval!=ERROR_OK)
- jtag_error=retval;
-
+ int retval = interface_jtag_add_ir_scan(in_count, in_fields, state);
+ jtag_set_error(retval);
}
* This function assumes that the caller handles extra fields for bypassed TAPs
*
*/
-void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
+void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields,
+ tap_state_t state)
{
- int retval;
-
jtag_prelude(state);
- retval=interface_jtag_add_plain_ir_scan(in_num_fields, in_fields, state);
- if (retval!=ERROR_OK)
- jtag_error=retval;
+ int retval = interface_jtag_add_plain_ir_scan(
+ in_num_fields, in_fields, state);
+ jtag_set_error(retval);
}
void jtag_add_callback(jtag_callback1_t f, u8 *in)
/**
- * Generate a DR SCAN using the fields passed to the function
- *
- * For not bypassed TAPs the function checks in_fields and uses fields specified there.
- * For bypassed TAPs the function generates a dummy 1bit field.
- *
- * The bypass status of TAPs is set by jtag_add_ir_scan().
- *
+ * Generate a DR SCAN using the fields passed to the function.
+ * For connected TAPs, the function checks in_fields and uses fields
+ * specified there. For bypassed TAPs, the function generates a dummy
+ * 1-bit field. The bypass status of TAPs is set by jtag_add_ir_scan().
*/
-void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
+void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields,
+ tap_state_t state)
{
- int retval;
-
jtag_prelude(state);
- retval=interface_jtag_add_dr_scan(in_num_fields, in_fields, state);
- if (retval!=ERROR_OK)
- jtag_error=retval;
+ int retval;
+ retval = interface_jtag_add_dr_scan(in_num_fields, in_fields, state);
+ jtag_set_error(retval);
}
-
-
/**
- * Duplicate the scan fields passed into the function into a DR SCAN command
- *
- * This function assumes that the caller handles extra fields for bypassed TAPs
- *
+ * Duplicate the scan fields passed into the function into a DR SCAN
+ * command. Unlike jtag_add_dr_scan(), this function assumes that the
+ * caller handles extra fields for bypassed TAPs.
*/
-void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)
+void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields,
+ tap_state_t state)
{
- int retval;
-
jtag_prelude(state);
- retval=interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, state);
- if (retval!=ERROR_OK)
- jtag_error=retval;
+ int retval;
+ retval = interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, state);
+ jtag_set_error(retval);
}
void jtag_add_dr_out(jtag_tap_t* tap,
void jtag_add_tlr(void)
{
jtag_prelude(TAP_RESET);
-
- int retval;
- retval=interface_jtag_add_tlr();
- if (retval!=ERROR_OK)
- jtag_error=retval;
-
+ jtag_set_error(interface_jtag_add_tlr());
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
}
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_execute_queue_noclear(void)
{
- /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces.
- * E.g. a JTAG over TCP/IP or USB....
- */
jtag_flush_queue_count++;
-
- int retval=interface_jtag_execute_queue();
- /* we keep the first error */
- if ((jtag_error==ERROR_OK)&&(retval!=ERROR_OK))
- {
- jtag_error=retval;
- }
+ jtag_set_error(interface_jtag_execute_queue());
}
int jtag_get_flush_queue_count(void)
int jtag_execute_queue(void)
{
- int retval;
jtag_execute_queue_noclear();
- retval=jtag_error;
- jtag_error=ERROR_OK;
- return retval;
+ return jtag_error_clear();
}
static int jtag_reset_callback(enum jtag_event event, void *priv)
register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
COMMAND_EXEC, "print current scan chain configuration");
- register_command(cmd_ctx, NULL, "endstate", handle_endstate_command,
- COMMAND_EXEC, "finish JTAG operations in <tap_state>");
register_command(cmd_ctx, NULL, "jtag_reset", handle_jtag_reset_command,
COMMAND_EXEC, "toggle reset lines <trst> <srst>");
register_command(cmd_ctx, NULL, "runtest", handle_runtest_command,
return ERROR_OK;
}
-static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
{
- if (argc < 1)
- {
- LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
- exit(-1);
- }
- else
- {
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ if (argc == 1)
jtag_set_nsrst_delay(strtoul(args[0], NULL, 0));
- }
-
+ command_print(cmd_ctx, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
return ERROR_OK;
}
-static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
{
- if (argc < 1)
- {
- LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
- exit(-1);
- }
- else
- {
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ if (argc == 1)
jtag_set_ntrst_delay(strtoul(args[0], NULL, 0));
- }
-
+ command_print(cmd_ctx, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
return ERROR_OK;
}
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- int retval=ERROR_OK;
+ int retval = ERROR_OK;
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
if (argc == 1)
{
LOG_DEBUG("handle jtag speed");
/* this command can be called during CONFIG,
* in which case jtag isn't initialized */
if (jtag)
- {
- retval=jtag->speed(cur_speed);
- }
- } else if (argc == 0)
- {
- } else
- {
- return ERROR_COMMAND_SYNTAX_ERROR;
+ retval = jtag->speed(cur_speed);
}
command_print(cmd_ctx, "jtag_speed: %d", jtag_speed);
static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- int retval=ERROR_OK;
- LOG_DEBUG("handle jtag khz");
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ int retval = ERROR_OK;
int cur_speed = 0;
- if(argc == 1)
+ if (argc == 1)
{
+ LOG_DEBUG("handle jtag khz");
+
jtag_set_speed_khz(strtoul(args[0], NULL, 0));
if (jtag != NULL)
{
LOG_DEBUG("have interface set up");
int speed_div1;
- if ((retval=jtag->khz(jtag_get_speed_khz(), &speed_div1))!=ERROR_OK)
+ retval = jtag->khz(jtag_get_speed_khz(), &speed_div1);
+ if (ERROR_OK != retval)
{
jtag_set_speed_khz(0);
return retval;
}
-
cur_speed = jtag_speed = speed_div1;
- retval=jtag->speed(cur_speed);
- } else
- {
- hasKHz = true;
+ retval = jtag->speed(cur_speed);
}
- } else if (argc==0)
- {
- } else
- {
- return ERROR_COMMAND_SYNTAX_ERROR;
+ else
+ hasKHz = true;
}
- cur_speed = jtag_get_speed_khz();
- if (jtag!=NULL)
+ cur_speed = jtag_get_speed_khz();
+ if (jtag != NULL)
{
- if ((retval=jtag->speed_div(jtag_speed, &cur_speed))!=ERROR_OK)
+ retval = jtag->speed_div(jtag_speed, &cur_speed);
+ if (ERROR_OK != retval)
return retval;
}
}
-static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_jtag_reset_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
{
- if (argc < 1)
+ if (argc != 2)
return ERROR_COMMAND_SYNTAX_ERROR;
- tap_state_t state = tap_state_by_name(args[0]);
- if (state < 0)
- {
- command_print( cmd_ctx, "Invalid state name: %s\n", args[0] );
- return ERROR_COMMAND_SYNTAX_ERROR;
- }
- jtag_set_end_state(state);
- jtag_execute_queue();
-
- command_print(cmd_ctx, "current endstate: %s",
- tap_state_name(cmd_queue_end_state));
-
- return ERROR_OK;
-}
-
-static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
int trst = -1;
- int srst = -1;
-
- if (argc < 2)
- {
- return ERROR_COMMAND_SYNTAX_ERROR;
- }
-
if (args[0][0] == '1')
trst = 1;
else if (args[0][0] == '0')
trst = 0;
else
- {
return ERROR_COMMAND_SYNTAX_ERROR;
- }
+ int srst = -1;
if (args[1][0] == '1')
srst = 1;
else if (args[1][0] == '0')
srst = 0;
else
- {
return ERROR_COMMAND_SYNTAX_ERROR;
- }
if (jtag_interface_init(cmd_ctx) != ERROR_OK)
return ERROR_JTAG_INIT_FAILED;
return ERROR_OK;
}
-static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_runtest_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
{
- if (argc < 1)
- {
+ if (argc != 1)
return ERROR_COMMAND_SYNTAX_ERROR;
- }
jtag_add_runtest(strtol(args[0], NULL, 0), jtag_get_end_state());
jtag_execute_queue();
return ERROR_OK;
-
}
/*
{
jtag_nsrst_delay = delay;
}
+unsigned jtag_get_nsrst_delay(void)
+{
+ return jtag_nsrst_delay;
+}
void jtag_set_ntrst_delay(unsigned delay)
{
jtag_ntrst_delay = delay;
}
-
-
+unsigned jtag_get_ntrst_delay(void)
+{
+ return jtag_ntrst_delay;
+}