X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftransport%2Ftransport.c;h=708594712b6cbf679ef46892f9429705c3e8e4a3;hp=b5e4b9003c3ac378af62e6e93aa27a8bbcd7f1a3;hb=d0e763ac7ef6aa17b17bd00ccdfbccfb4eacda69;hpb=c8b57198025c414f8d19577e6846021843c2a751
diff --git a/src/transport/transport.c b/src/transport/transport.c
index b5e4b9003c..708594712b 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -12,8 +12,7 @@
* GNU General Public License for more details.
* 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
+ * along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
@@ -43,12 +42,10 @@
*/
#include
-
#include
extern struct command_context *global_cmd_ctx;
-
/*-----------------------------------------------------------------------*/
/*
@@ -63,18 +60,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 +79,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 +93,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 +110,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 +157,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 +176,10 @@ int transport_register(struct transport *new_transport)
*/
struct transport *get_current_transport(void)
{
-
/* REVISIT -- constify */
return session;
}
-
/*-----------------------------------------------------------------------*/
/*
@@ -221,7 +205,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;
@@ -254,7 +238,15 @@ COMMAND_HANDLER(handle_transport_init)
{
LOG_DEBUG("%s", __func__);
if (!session) {
- LOG_ERROR("session's transport is not selected.");
+ LOG_ERROR("session transport was not selected. Use 'transport select '");
+
+ /* no session transport configured, print transports then fail */
+ LOG_ERROR("Transports available:");
+ const char * const *vector = allowed_transports;
+ while (*vector) {
+ LOG_ERROR("%s", *vector);
+ vector++;
+ }
return ERROR_FAIL;
}
@@ -280,49 +272,65 @@ 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)
{
+ int res;
switch (argc) {
- case 1: /* return/display */
- if (!session) {
- LOG_ERROR("session's transport is not selected.");
- return JIM_ERR;
- } else {
+ 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 '.", 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) {
- /* 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++) {
-
- 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;
+ 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;
}
}
@@ -336,12 +344,14 @@ static const struct command_registration transport_commands[] = {
*/
.mode = COMMAND_ANY,
.help = "Initialize this session's transport",
+ .usage = ""
},
{
.name = "list",
.handler = handle_transport_list,
.mode = COMMAND_ANY,
.help = "list all built-in transports",
+ .usage = ""
},
{
.name = "select",
@@ -359,11 +369,11 @@ static const struct command_registration transport_group[] = {
.mode = COMMAND_ANY,
.help = "Transport command group",
.chain = transport_commands,
+ .usage = ""
},
COMMAND_REGISTRATION_DONE
};
-
int transport_register_commands(struct command_context *ctx)
{
return register_commands(ctx, NULL, transport_group);