X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Ftcl.c;h=9d6169ccfe7c0e8fb9bd042adacd88e7bf99088b;hb=e1c26950c03b09efe42b8a25dd83f1e50e22a507;hp=574f266ee4081da3e58f27c6987bf3c246d290d1;hpb=d70d9634bf6ab73ec4f2ac1e77012785770b460a;p=openocd.git diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index 574f266ee4..9d6169ccfe 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -49,33 +49,7 @@ static const Jim_Nvp nvp_jtag_tap_event[] = { { .name = NULL, .value = -1 } }; -extern jtag_interface_t *jtag_interface; - -/* 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_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_reset_config_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); -static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_jtag_nsrst_assert_width_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_jtag_ntrst_assert_width_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); - -static int handle_scan_chain_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); -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); -static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); - +extern struct jtag_interface *jtag_interface; enum jtag_tap_cfg_param { JCFG_EVENT @@ -87,7 +61,7 @@ static Jim_Nvp nvp_config_opts[] = { { .name = NULL, .value = -1 } }; -static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, jtag_tap_t * tap) +static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, struct jtag_tap * tap) { Jim_Nvp *n; Jim_Obj *o; @@ -129,7 +103,7 @@ static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, jtag_tap_t * tap) } { - jtag_tap_event_action_t *jteap; + struct jtag_tap_event_action *jteap; jteap = tap->event_action; /* replace existing? */ @@ -191,7 +165,7 @@ static int is_bad_irval(int ir_length, jim_wide w) static int jim_newtap_cmd(Jim_GetOptInfo *goi) { - jtag_tap_t *pTap; + struct jtag_tap *pTap; jim_wide w; int x; int e; @@ -213,7 +187,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) { .name = NULL , .value = -1 }, }; - pTap = calloc(1, sizeof(jtag_tap_t)); + pTap = calloc(1, sizeof(struct jtag_tap)); if (!pTap) { Jim_SetResult_sprintf(goi->interp, "no memory"); return JIM_ERR; @@ -361,9 +335,9 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) return JIM_ERR; } -static void jtag_tap_handle_event(jtag_tap_t *tap, enum jtag_event e) +static void jtag_tap_handle_event(struct jtag_tap *tap, enum jtag_event e) { - jtag_tap_event_action_t * jteap; + struct jtag_tap_event_action * jteap; for (jteap = tap->event_action; jteap != NULL; jteap = jteap->next) { if (jteap->event == e) { @@ -448,7 +422,8 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)"); return JIM_ERR; } - Jim_SetResultString(goi.interp, jtag_interface->name, -1); + const char *name = jtag_interface ? jtag_interface->name : NULL; + Jim_SetResultString(goi.interp, name ? : "undefined", -1); return JIM_OK; case JTAG_CMD_INIT: if (goi.argc != 0) { @@ -484,7 +459,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } { - jtag_tap_t *t; + struct jtag_tap *t; t = jtag_tap_by_jim_obj(goi.interp, goi.argv[0]); if (t == NULL) @@ -536,7 +511,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } { - jtag_tap_t *t; + struct jtag_tap *t; Jim_GetOpt_Obj(&goi, &o); t = jtag_tap_by_jim_obj(goi.interp, o); @@ -557,7 +532,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } { - jtag_tap_t *t; + struct jtag_tap *t; Jim_GetOpt_Obj(&goi, &o); t = jtag_tap_by_jim_obj(goi.interp, o); @@ -577,7 +552,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } Jim_SetResult(goi.interp, Jim_NewListObj(goi.interp, NULL, 0)); { - jtag_tap_t *tap; + struct jtag_tap *tap; for (tap = jtag_all_taps(); tap; tap = tap->next_tap) { Jim_ListAppendElement(goi.interp, @@ -597,66 +572,13 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) void jtag_notify_event(enum jtag_event event) { - jtag_tap_t *tap; + struct jtag_tap *tap; for (tap = jtag_all_taps(); tap; tap = tap->next_tap) jtag_tap_handle_event(tap, event); } -int jtag_register_commands(struct command_context_s *cmd_ctx) -{ - register_jim(cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions"); - - 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_khz", handle_jtag_khz_command, - COMMAND_ANY, "set maximum jtag speed (if supported); " - "parameter is maximum khz, or 0 for adaptive clocking (RTCK)."); - register_command(cmd_ctx, NULL, "jtag_rclk", handle_jtag_rclk_command, - COMMAND_ANY, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed"); - register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, - COMMAND_ANY, - "reset_config " - "[none|trst_only|srst_only|trst_and_srst] " - "[srst_pulls_trst|trst_pulls_srst|combined|separate] " - "[srst_gates_jtag|srst_nogate] " - "[trst_push_pull|trst_open_drain] " - "[srst_push_pull|srst_open_drain]"); - register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command, - COMMAND_ANY, "jtag_nsrst_delay - delay after deasserting srst in ms"); - register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command, - COMMAND_ANY, "jtag_ntrst_delay - delay after deasserting trst in ms"); - register_command(cmd_ctx, NULL, "jtag_nsrst_assert_width", handle_jtag_nsrst_assert_width_command, - COMMAND_ANY, "jtag_nsrst_assert_width - delay after asserting srst in ms"); - register_command(cmd_ctx, NULL, "jtag_ntrst_assert_width", handle_jtag_ntrst_assert_width_command, - COMMAND_ANY, "jtag_ntrst_assert_width - delay after asserting trst in ms"); - - register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command, - COMMAND_EXEC, "print current scan chain configuration"); - - register_command(cmd_ctx, NULL, "jtag_reset", handle_jtag_reset_command, - COMMAND_EXEC, "toggle reset lines "); - register_command(cmd_ctx, NULL, "runtest", handle_runtest_command, - COMMAND_EXEC, "move to Run-Test/Idle, and execute "); - register_command(cmd_ctx, NULL, "irscan", handle_irscan_command, - COMMAND_EXEC, "execute IR scan [dev2] [instr2] ..."); - register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan ..."); - 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. ,,..."); - - register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command, - COMMAND_ANY, "verify value captured during Capture-IR "); - register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command, - COMMAND_ANY, "verify value capture "); - register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command, - COMMAND_ANY, "choose short(default) or long tms_sequence "); - return ERROR_OK; -} - static int default_khz(int khz, int *jtag_speed) { LOG_ERROR("Translation from khz to jtag_speed not implemented"); @@ -681,8 +603,22 @@ 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) +COMMAND_HANDLER(handle_interface_list_command) +{ + if (strcmp(CMD_NAME, "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++) + { + const char *name = jtag_interfaces[i]->name; + command_print(cmd_ctx, "%u: %s", i + 1, name); + } + + return ERROR_OK; +} + +COMMAND_HANDLER(handle_interface_command) { /* check whether the interface is already configured */ if (jtag_interface) @@ -722,29 +658,13 @@ static int handle_interface_command(struct command_context_s *cmd_ctx, * didn't match one of the compiled-in interfaces */ LOG_ERROR("The specified JTAG interface was not found (%s)", args[0]); - handle_interface_list_command(cmd_ctx, cmd, args, argc); + CALL_COMMAND_HANDLER(handle_interface_list_command); 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++) - { - const char *name = jtag_interfaces[i]->name; - command_print(cmd_ctx, "%u: %s", i + 1, name); - } - - return ERROR_OK; -} - -static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_scan_chain_command) { - jtag_tap_t *tap; + struct jtag_tap *tap; tap = jtag_all_taps(); command_print(cmd_ctx, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr "); @@ -779,7 +699,7 @@ static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cm return ERROR_OK; } -static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_reset_config_command) { int new_cfg = 0; int mask = 0; @@ -975,8 +895,7 @@ next: return ERROR_OK; } -static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_nsrst_delay_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -991,8 +910,7 @@ static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, return ERROR_OK; } -static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_ntrst_delay_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1007,8 +925,7 @@ static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, return ERROR_OK; } -static int handle_jtag_nsrst_assert_width_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_nsrst_assert_width_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1023,8 +940,7 @@ static int handle_jtag_nsrst_assert_width_command(struct command_context_s *cmd_ return ERROR_OK; } -static int handle_jtag_ntrst_assert_width_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_ntrst_assert_width_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1039,7 +955,7 @@ static int handle_jtag_ntrst_assert_width_command(struct command_context_s *cmd_ return ERROR_OK; } -static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_khz_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1068,7 +984,7 @@ static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, return retval; } -static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_rclk_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1097,8 +1013,7 @@ static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd return retval; } -static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_jtag_reset_command) { if (argc != 2) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1126,8 +1041,7 @@ static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, return jtag_execute_queue(); } -static int handle_runtest_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_runtest_command) { if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1161,11 +1075,11 @@ static bool scan_is_safe(tap_state_t state) } -static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_irscan_command) { int i; - scan_field_t *fields; - jtag_tap_t *tap; + struct scan_field *fields; + struct jtag_tap *tap; tap_state_t endstate; if ((argc < 2) || (argc % 2)) @@ -1194,7 +1108,7 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c } int num_fields = argc / 2; - size_t fields_len = sizeof(scan_field_t) * num_fields; + size_t fields_len = sizeof(struct scan_field) * num_fields; fields = malloc(fields_len); memset(fields, 0, fields_len); @@ -1245,11 +1159,11 @@ error_return: static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args) { int retval; - scan_field_t *fields; + struct scan_field *fields; int num_fields; int field_count = 0; int i, e; - jtag_tap_t *tap; + struct jtag_tap *tap; tap_state_t endstate; /* args[1] = device @@ -1331,7 +1245,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args } num_fields = (argc-2)/2; - fields = malloc(sizeof(scan_field_t) * num_fields); + fields = malloc(sizeof(struct scan_field) * num_fields); for (i = 2; i < argc; i += 2) { long bits; @@ -1436,7 +1350,7 @@ static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const } -static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_verify_ircapture_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1457,7 +1371,7 @@ static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, ch return ERROR_OK; } -static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_verify_jtag_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1478,7 +1392,7 @@ static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *c return ERROR_OK; } -static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_tms_sequence_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -1501,3 +1415,90 @@ static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char * return ERROR_OK; } + +int jtag_register_commands(struct command_context_s *cmd_ctx) +{ + register_jim(cmd_ctx, "jtag", jim_jtag_command, + "perform jtag tap actions"); + + 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_khz", + handle_jtag_khz_command, COMMAND_ANY, + "set maximum jtag speed (if supported); " + "parameter is maximum khz, or 0 for adaptive clocking (RTCK)."); + register_command(cmd_ctx, NULL, "jtag_rclk", + handle_jtag_rclk_command, COMMAND_ANY, + "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed"); + register_command(cmd_ctx, NULL, "reset_config", + handle_reset_config_command, COMMAND_ANY, + "reset_config " + "[none|trst_only|srst_only|trst_and_srst] " + "[srst_pulls_trst|trst_pulls_srst|combined|separate] " + "[srst_gates_jtag|srst_nogate] " + "[trst_push_pull|trst_open_drain] " + "[srst_push_pull|srst_open_drain]"); + + register_command(cmd_ctx, NULL, "jtag_nsrst_delay", + handle_jtag_nsrst_delay_command, COMMAND_ANY, + "jtag_nsrst_delay " + "- delay after deasserting srst in ms"); + register_command(cmd_ctx, NULL, "jtag_ntrst_delay", + handle_jtag_ntrst_delay_command, COMMAND_ANY, + "jtag_ntrst_delay " + "- delay after deasserting trst in ms"); + + register_command(cmd_ctx, NULL, "jtag_nsrst_assert_width", + handle_jtag_nsrst_assert_width_command, COMMAND_ANY, + "jtag_nsrst_assert_width " + "- delay after asserting srst in ms"); + register_command(cmd_ctx, NULL, "jtag_ntrst_assert_width", + handle_jtag_ntrst_assert_width_command, COMMAND_ANY, + "jtag_ntrst_assert_width " + "- delay after asserting trst in ms"); + + register_command(cmd_ctx, NULL, "scan_chain", + handle_scan_chain_command, COMMAND_EXEC, + "print current scan chain configuration"); + + register_command(cmd_ctx, NULL, "jtag_reset", + handle_jtag_reset_command, COMMAND_EXEC, + "toggle reset lines "); + register_command(cmd_ctx, NULL, "runtest", + handle_runtest_command, COMMAND_EXEC, + "move to Run-Test/Idle, and execute "); + register_command(cmd_ctx, NULL, "irscan", + handle_irscan_command, COMMAND_EXEC, + "execute IR scan [dev2] [instr2] ..."); + + register_jim(cmd_ctx, "drscan", Jim_Command_drscan, + "execute DR scan " + " ..."); + + 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."); + + register_command(cmd_ctx, NULL, "verify_ircapture", + handle_verify_ircapture_command, COMMAND_ANY, + "verify value captured during Capture-IR "); + register_command(cmd_ctx, NULL, "verify_jtag", + handle_verify_jtag_command, COMMAND_ANY, + "verify value capture "); + + register_command(cmd_ctx, NULL, "tms_sequence", + handle_tms_sequence_command, COMMAND_ANY, + "choose short(default) or long tms_sequence "); + + return ERROR_OK; +} + +