#include <strings.h>
#endif
-extern bool hasKHz;
+static const Jim_Nvp nvp_jtag_tap_event[] = {
+ { .value = JTAG_TAP_EVENT_ENABLE, .name = "tap-enable" },
+ { .value = JTAG_TAP_EVENT_DISABLE, .name = "tap-disable" },
+
+ { .name = NULL, .value = -1 }
+};
/* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
*/
NULL,
};
-extern struct jtag_interface_s *jtag;
extern jtag_interface_t *jtag_interface;
/* jtag commands */
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);
static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
+static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args);
static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
return JIM_ERR;
}
+static void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
+{
+ jtag_tap_event_action_t * jteap;
+ int done;
+
+ jteap = tap->event_action;
+
+ done = 0;
+ while (jteap) {
+ if (jteap->event == e) {
+ done = 1;
+ LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
+ tap->dotted_name,
+ e,
+ Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name,
+ Jim_GetString(jteap->body, NULL) );
+ if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
+ Jim_PrintErrorMessage(interp);
+ }
+ }
+
+ jteap = jteap->next;
+ }
+
+ if (!done) {
+ LOG_DEBUG( "event %d %s - no action",
+ e,
+ Jim_Nvp_value2name_simple( nvp_jtag_tap_event, e)->name);
+ }
+}
+
+
static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
{
Jim_GetOptInfo goi;
COMMAND_EXEC, "execute IR scan <device> <instr> [dev2] [instr2] ...");
register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
register_jim(cmd_ctx, "flush_count", Jim_Command_flush_count, "returns number of times the JTAG queue has been flushed");
+ register_jim(cmd_ctx, "pathmove", Jim_Command_pathmove, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
}
/* clear previous values of those bits, save new values */
- jtag_reset_config &= ~mask;
- jtag_reset_config |= new_cfg;
+ enum reset_types old_cfg = jtag_get_reset_config();
+ old_cfg &= ~mask;
+ new_cfg |= old_cfg;
+ jtag_set_reset_config(new_cfg);
return ERROR_OK;
}
LOG_DEBUG("handle jtag speed");
int cur_speed = 0;
- cur_speed = jtag_speed = strtoul(args[0], NULL, 0);
+ cur_speed = strtoul(args[0], NULL, 0);
+ retval = jtag_set_speed(cur_speed);
- /* this command can be called during CONFIG,
- * in which case jtag isn't initialized */
- if (jtag)
- retval = jtag->speed(cur_speed);
}
- command_print(cmd_ctx, "jtag_speed: %d", jtag_speed);
+ command_print(cmd_ctx, "jtag_speed: %d", jtag_get_speed());
return retval;
}
return ERROR_COMMAND_SYNTAX_ERROR;
int retval = ERROR_OK;
- int cur_speed = 0;
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;
- 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;
- }
-
- cur_speed = jtag_get_speed_khz();
- if (jtag != NULL)
- {
- retval = jtag->speed_div(jtag_speed, &cur_speed);
+ retval = jtag_config_khz(strtoul(args[0], NULL, 0));
if (ERROR_OK != retval)
return retval;
}
+ int cur_speed;
+ retval = jtag_get_speed_readable(&cur_speed);
+ if (ERROR_OK != retval)
+ return retval;
+
if (cur_speed)
command_print(cmd_ctx, "%d kHz", cur_speed);
else
command_print(cmd_ctx, "RCLK - adaptive");
- return retval;
+ return retval;
}
static int handle_jtag_reset_command(struct command_context_s *cmd_ctx,
}
+static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *args)
+{
+ tap_state_t states[8];
+
+ if ((argc < 2) || ((size_t)argc > (sizeof(states)/sizeof(*states)+1)))
+ {
+ Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
+ return JIM_ERR;
+ }
+
+ int i;
+ for (i=0; i<argc-1; i++)
+ {
+ const char *cp;
+ cp = Jim_GetString( args[i+1], NULL );
+ states[i] = tap_state_by_name(cp);
+ if( states[i] < 0 )
+ {
+ /* update the error message */
+ Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
+ return JIM_ERR;
+ }
+ }
+
+ if ((jtag_add_statemove(states[0]) != ERROR_OK) || ( jtag_execute_queue()!= ERROR_OK))
+ {
+ Jim_SetResultString(interp, "pathmove: jtag execute failed",-1);
+ return JIM_ERR;
+ }
+
+ jtag_add_pathmove(argc-2, states+1);
+
+ if (jtag_execute_queue()!= ERROR_OK)
+ {
+ Jim_SetResultString(interp, "pathmove: failed",-1);
+ return JIM_ERR;
+ }
+
+ return JIM_OK;
+}
+
+
static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
{
Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count()));
static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
if (argc == 1)
{
if (strcmp(args[0], "enable") == 0)
- {
- jtag_verify_capture_ir = 1;
- }
+ jtag_set_verify_capture_ir(true);
else if (strcmp(args[0], "disable") == 0)
- {
- jtag_verify_capture_ir = 0;
- } else
- {
+ jtag_set_verify_capture_ir(false);
+ else
return ERROR_COMMAND_SYNTAX_ERROR;
- }
- } else if (argc != 0)
- {
- return ERROR_COMMAND_SYNTAX_ERROR;
}
- command_print(cmd_ctx, "verify Capture-IR is %s", (jtag_verify_capture_ir) ? "enabled": "disabled");
+ const char *status = jtag_will_verify_capture_ir() ? "enabled": "disabled";
+ command_print(cmd_ctx, "verify Capture-IR is %s", status);
return ERROR_OK;
}