scan_field_t -> struct scan_field
[fw/openocd] / src / jtag / tcl.c
index 574f266ee4081da3e58f27c6987bf3c246d290d1..04b3ed2f880cafa1f8a800bbb26bfa72736eaf14 100644 (file)
@@ -51,32 +51,6 @@ static const Jim_Nvp nvp_jtag_tap_event[] = {
 
 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);
-
-
 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;
@@ -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,7 +335,7 @@ 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;
 
@@ -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 <ms> - delay after deasserting srst in ms");
-       register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command,
-               COMMAND_ANY, "jtag_ntrst_delay <ms> - 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 <ms> - 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 <ms> - 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 <trst> <srst>");
-       register_command(cmd_ctx, NULL, "runtest", handle_runtest_command,
-               COMMAND_EXEC, "move to Run-Test/Idle, and execute <num_cycles>");
-       register_command(cmd_ctx, NULL, "irscan", handle_irscan_command,
-               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>");
-       register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command,
-               COMMAND_ANY, "verify value capture <enable | disable>");
-       register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command,
-               COMMAND_ANY, "choose short(default) or long tms_sequence <short | long>");
-       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)
+COMMAND_HANDLER(handle_scan_chain_command)
 {
-       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)
-{
-       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 <ms> "
+                       "- delay after deasserting srst in ms");
+       register_command(cmd_ctx, NULL, "jtag_ntrst_delay",
+                       handle_jtag_ntrst_delay_command, COMMAND_ANY,
+                       "jtag_ntrst_delay <ms> "
+                       "- 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 <ms> "
+                       "- 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 <ms> "
+                       "- 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 <trst> <srst>");
+       register_command(cmd_ctx, NULL, "runtest",
+                       handle_runtest_command, COMMAND_EXEC,
+                       "move to Run-Test/Idle, and execute <num_cycles>");
+       register_command(cmd_ctx, NULL, "irscan",
+                       handle_irscan_command, 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,
+                       "<state1>,<state2>,<state3>... "
+                       "- 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 <enable | disable>");
+       register_command(cmd_ctx, NULL, "verify_jtag",
+                       handle_verify_jtag_command, COMMAND_ANY,
+                       "verify value capture <enable | disable>");
+
+       register_command(cmd_ctx, NULL, "tms_sequence",
+                       handle_tms_sequence_command, COMMAND_ANY,
+                       "choose short(default) or long tms_sequence <short | long>");
+
+       return ERROR_OK;
+}
+
+