/** * Called by debug adapter drivers, or affiliated Tcl config scripts, * 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) { /* NOTE: caller is required to provide only a list * of *valid* transport names * * REVISIT should we validate that? and insist there's * at least one non-NULL element in that list? * * ... allow removals, e.g. external strapping prevents use * of one transport; C code should be definitive about what * can be used when all goes well. */ if (allowed_transports != NULL || session) { LOG_ERROR("Can't modify the set of allowed transports."); 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]); } return ERROR_OK; }
/** * Implements the Tcl "transport select" command, choosing the * transport to be used in this debug session from among the * 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) { 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) { if (!strcmp(session->name, argv[1]->bytes)) { LOG_WARNING("Transport \"%s\" was already selected", session->name); return JIM_OK; } else { LOG_ERROR("Can't change session's transport after the initial selection was made"); 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++) { 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; } }
/** * Implements the Tcl "transport select" command, choosing the * transport to be used in this debug session from among the * 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) { int res; switch (argc) { case 1: /* autoselect if necessary, then return/display current config */ if (!session) { if (!allowed_transports) { LOG_ERROR("Debug adapter does not support any transports? Check config file order."); return JIM_ERR; } LOG_INFO("auto-selecting first available session transport \"%s\". " "To override use 'transport select <transport>'.", allowed_transports[0]); res = transport_select(global_cmd_ctx, allowed_transports[0]); if (res != JIM_OK) return res; } Jim_SetResultString(interp, session->name, -1); return JIM_OK; break; case 2: /* assign */ if (session) { if (!strcmp(session->name, argv[1]->bytes)) { LOG_WARNING("Transport \"%s\" was already selected", session->name); Jim_SetResultString(interp, session->name, -1); return JIM_OK; } else { LOG_ERROR("Can't change session's transport after the initial selection was made"); 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++) { if (strcmp(allowed_transports[i], argv[1]->bytes) == 0) { if (transport_select(global_cmd_ctx, argv[1]->bytes) == ERROR_OK) { Jim_SetResultString(interp, session->name, -1); return JIM_OK; } 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; } }