X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftransport%2Ftransport.c;h=072a0d38544d59b0c18f0748efe3d10b266753d1;hp=3e6722111369d767f9ceb2e32f210c93990acf24;hb=c7384117c66e8f18896ca09ab8095d6da16bb1e5;hpb=54d6330b78f46678e78d1ffb265c65fcc8991e83;ds=sidebyside diff --git a/src/transport/transport.c b/src/transport/transport.c index 3e67221113..072a0d3854 100644 --- a/src/transport/transport.c +++ b/src/transport/transport.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H @@ -43,12 +43,10 @@ */ #include - #include extern struct command_context *global_cmd_ctx; - /*-----------------------------------------------------------------------*/ /* @@ -63,18 +61,18 @@ static struct transport *transport_list; * currently selected debug adapter supports. This is declared * by the time that adapter is fully set up. */ -static const char **allowed_transports; +static const char * const *allowed_transports; /** * The transport being used for the current OpenOCD session. */ static struct transport *session; -static int transport_select(struct command_context *ctx, const char *name) +static int transport_select(struct command_context *ctx, const char *name) { /* name may only identify a known transport; * caller guarantees session's transport isn't yet set.*/ for (struct transport *t = transport_list; t; t = t->next) { - if (strcmp(t->name, name) == 0) { - int retval = t->select(ctx); + if (strcmp(t->name, name) == 0) { + int retval = t->select(ctx); /* select() registers commands specific to this * transport, and may also reset the link, e.g. * forcing it to JTAG or SWD mode. @@ -82,8 +80,7 @@ static int transport_select(struct command_context *ctx, const char *name) if (retval == ERROR_OK) session = t; else - LOG_ERROR("Error selecting '%s' as " - "transport", t->name); + LOG_ERROR("Error selecting '%s' as transport", t->name); return retval; } } @@ -97,7 +94,7 @@ static int transport_select(struct command_context *ctx, const char *name) * to declare the set of transports supported by an adapter. When * there is only one member of that set, it is automatically selected. */ -int allow_transports(struct command_context *ctx, const char **vector) +int allow_transports(struct command_context *ctx, const char * const *vector) { /* NOTE: caller is required to provide only a list * of *valid* transport names @@ -114,25 +111,16 @@ int allow_transports(struct command_context *ctx, const char **vector) return ERROR_FAIL; } - allowed_transports = vector; /* autoselect if there's no choice ... */ if (!vector[1]) { - LOG_INFO("only one transport option; autoselect '%s'", - vector[0]); - return transport_select(ctx, vector [0]); - } else { - /* guard against user config errors */ - LOG_WARNING("must select a transport."); - while (*vector) { - LOG_DEBUG("allow transport '%s'", *vector); - vector++; - } - return ERROR_OK; + LOG_INFO("only one transport option; autoselect '%s'", vector[0]); + return transport_select(ctx, vector[0]); } -} + return ERROR_OK; +} /** * Used to verify corrrect adapter driver initialization. @@ -170,9 +158,8 @@ int transport_register(struct transport *new_transport) } } - if (!new_transport->select || !new_transport->init) { + if (!new_transport->select || !new_transport->init) LOG_ERROR("invalid transport %s", new_transport->name); - } /* splice this into the list */ new_transport->next = transport_list; @@ -190,12 +177,10 @@ int transport_register(struct transport *new_transport) */ struct transport *get_current_transport(void) { - /* REVISIT -- constify */ return session; } - /*-----------------------------------------------------------------------*/ /* @@ -221,7 +206,7 @@ COMMAND_HELPER(transport_list_parse, char ***vector) return ERROR_COMMAND_SYNTAX_ERROR; /* our return vector must be NULL terminated */ - argv = (char **) calloc(n + 1, sizeof(char *)); + argv = calloc(n + 1, sizeof(char *)); if (argv == NULL) return ERROR_FAIL; @@ -255,6 +240,13 @@ COMMAND_HANDLER(handle_transport_init) LOG_DEBUG("%s", __func__); if (!session) { LOG_ERROR("session's transport is not selected."); + + /* no session transport configured, print transports then fail */ + const char * const *vector = allowed_transports; + while (*vector) { + LOG_ERROR("allow transport '%s'", *vector); + vector++; + } return ERROR_FAIL; } @@ -280,49 +272,48 @@ COMMAND_HANDLER(handle_transport_list) * set supported by the debug adapter being used. Return value * is scriptable (allowing "if swd then..." etc). */ -static int jim_transport_select(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +static int jim_transport_select(Jim_Interp *interp, int argc, Jim_Obj * const *argv) { switch (argc) { - case 1: /* return/display */ - if (!session) { - LOG_ERROR("session's transport is not selected."); - return JIM_ERR; - } else { - Jim_SetResultString(interp, session->name, -1); - return JIM_OK; - } - break; - case 2: /* assign */ - if (session) { - /* can't change session's transport after-the-fact */ - LOG_ERROR("session's transport is already selected."); - return JIM_ERR; - } - - /* Is this transport supported by our debug adapter? - * Example, "JTAG-only" means SWD is not supported. - * - * NOTE: requires adapter to have been set up, with - * transports declared via C. - */ - if (!allowed_transports) { - LOG_ERROR("Debug adapter doesn't support any transports?"); - return JIM_ERR; - } + case 1: /* return/display */ + if (!session) { + LOG_ERROR("session's transport is not selected."); + return JIM_ERR; + } else { + Jim_SetResultString(interp, session->name, -1); + return JIM_OK; + } + break; + case 2: /* assign */ + if (session) { + /* can't change session's transport after-the-fact */ + LOG_ERROR("session's transport is already selected."); + return JIM_ERR; + } + + /* Is this transport supported by our debug adapter? + * Example, "JTAG-only" means SWD is not supported. + * + * NOTE: requires adapter to have been set up, with + * transports declared via C. + */ + if (!allowed_transports) { + LOG_ERROR("Debug adapter doesn't support any transports?"); + return JIM_ERR; + } - for (unsigned i = 0; allowed_transports[i]; i++) { + for (unsigned i = 0; allowed_transports[i]; i++) { - if (strcmp(allowed_transports[i], argv[1]->bytes) == 0) - return transport_select(global_cmd_ctx, argv[1]->bytes); - } + if (strcmp(allowed_transports[i], argv[1]->bytes) == 0) + return transport_select(global_cmd_ctx, argv[1]->bytes); + } - LOG_ERROR("Debug adapter doesn't support '%s' " - "transport", argv[1]->bytes); - return JIM_ERR; - break; - default: - Jim_WrongNumArgs(interp, 1, argv, "[too many parameters]"); - return JIM_ERR; + LOG_ERROR("Debug adapter doesn't support '%s' transport", argv[1]->bytes); + return JIM_ERR; + break; + default: + Jim_WrongNumArgs(interp, 1, argv, "[too many parameters]"); + return JIM_ERR; } } @@ -366,7 +357,6 @@ static const struct command_registration transport_group[] = { COMMAND_REGISTRATION_DONE }; - int transport_register_commands(struct command_context *ctx) { return register_commands(ctx, NULL, transport_group);