+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
/*
* Copyright (c) 2010 by David Brownell
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifdef HAVE_CONFIG_H
*/
#include <helper/log.h>
+#include <helper/replacements.h>
#include <transport/transport.h>
extern struct command_context *global_cmd_ctx;
* of one transport; C code should be definitive about what
* can be used when all goes well.
*/
- if (allowed_transports != NULL || session) {
+ if (allowed_transports || session) {
LOG_ERROR("Can't modify the set of allowed transports.");
return ERROR_FAIL;
}
return ERROR_OK;
}
-/**
- * Used to verify corrrect adapter driver initialization.
- *
- * @returns true iff the adapter declared one or more transports.
- */
-bool transports_are_declared(void)
-{
- return allowed_transports != NULL;
-}
-
/**
* Registers a transport. There are general purpose transports
* (such as JTAG), as well as relatively proprietary ones which are
* Code implementing a transport needs to register it before it can
* be selected and then activated. This is a dynamic process, so
* that chips (and families) can define transports as needed (without
- * nneeding error-prone static tables).
+ * needing error-prone static tables).
*
* @param new_transport the transport being registered. On a
* successful return, this memory is owned by the transport framework.
/* our return vector must be NULL terminated */
argv = calloc(n + 1, sizeof(char *));
- if (argv == NULL)
+ if (!argv)
return ERROR_FAIL;
for (unsigned i = 0; i < n; i++) {
{
LOG_DEBUG("%s", __func__);
if (!session) {
- LOG_ERROR("session's transport is not selected.");
+ LOG_ERROR("session transport was not selected. Use 'transport select <transport>'");
/* no session transport configured, print transports then fail */
+ LOG_ERROR("Transports available:");
const char * const *vector = allowed_transports;
while (*vector) {
- LOG_ERROR("allow transport '%s'", *vector);
+ LOG_ERROR("%s", *vector);
vector++;
}
return ERROR_FAIL;
if (CMD_ARGC != 0)
return ERROR_COMMAND_SYNTAX_ERROR;
- command_print(CMD_CTX, "The following transports are available:");
+ command_print(CMD, "The following transports are available:");
for (struct transport *t = transport_list; t; t = t->next)
- command_print(CMD_CTX, "\t%s", t->name);
+ command_print(CMD, "\t%s", t->name);
return ERROR_OK;
}
*/
static int jim_transport_select(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
{
+ int res;
switch (argc) {
- case 1: /* return/display */
+ case 1: /* autoselect if necessary, then return/display current config */
if (!session) {
- LOG_ERROR("session's transport is not selected.");
- return JIM_ERR;
- } else {
- Jim_SetResultString(interp, session->name, -1);
- return JIM_OK;
+ 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;
}
- break;
- case 2: /* assign */
+ Jim_SetResultString(interp, session->name, -1);
+ return JIM_OK;
+ 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;
+ 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?
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) {
+ 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;