+// SPDX-License-Identifier: GPL-2.0-or-later
+
/***************************************************************************
* Copyright (C) 2009-2010 by Simon Qian <SimonQian@SimonQian.com> *
- * *
- * 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, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
/* Versaloon is a programming tool for multiple MCUs.
#include "config.h"
#endif
+#include <jtag/adapter.h>
#include <jtag/interface.h>
#include <jtag/commands.h>
#include <jtag/swd.h>
static struct vsllink *vsllink_handle;
-static int vsllink_execute_queue(void)
+static int vsllink_execute_queue(struct jtag_command *cmd_queue)
{
- struct jtag_command *cmd = jtag_command_queue;
+ struct jtag_command *cmd = cmd_queue;
int scan_size;
enum scan_type type;
uint8_t *buffer;
" vsllink "
"-------------------------------------");
- while (cmd != NULL) {
+ while (cmd) {
switch (cmd->type) {
case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %s",
break;
case JTAG_SLEEP:
- LOG_DEBUG_IO("sleep %i", cmd->cmd.sleep->us);
+ LOG_DEBUG_IO("sleep %" PRIu32, cmd->cmd.sleep->us);
vsllink_tap_execute();
jtag_sleep(cmd->cmd.sleep->us);
break;
static void vsllink_free_buffer(void)
{
- if (tdi_buffer != NULL) {
- free(tdi_buffer);
- tdi_buffer = NULL;
- }
- if (tdo_buffer != NULL) {
- free(tdo_buffer);
- tdo_buffer = NULL;
- }
- if (tms_buffer != NULL) {
- free(tms_buffer);
- tms_buffer = NULL;
- }
+ free(tdi_buffer);
+ tdi_buffer = NULL;
+
+ free(tdo_buffer);
+ tdo_buffer = NULL;
+
+ free(tms_buffer);
+ tms_buffer = NULL;
}
static int vsllink_quit(void)
vsllink_free_buffer();
vsllink_usb_close(vsllink_handle);
+ libusb_exit(vsllink_handle->libusb_ctx);
free(vsllink_handle);
return ERROR_OK;
static int vsllink_interface_init(void)
{
vsllink_handle = malloc(sizeof(struct vsllink));
- if (NULL == vsllink_handle) {
+ if (!vsllink_handle) {
LOG_ERROR("unable to allocate memory");
return ERROR_FAIL;
}
libusb_init(&vsllink_handle->libusb_ctx);
- if (ERROR_OK != vsllink_usb_open(vsllink_handle)) {
- LOG_ERROR("Can't find USB JTAG Interface!" \
+ if (vsllink_usb_open(vsllink_handle) != ERROR_OK) {
+ LOG_ERROR("Can't find USB JTAG Interface!"
"Please check connection and permissions.");
return ERROR_JTAG_INIT_FAILED;
}
versaloon_interface.usb_setting.pid);
versaloon_usb_device_handle = vsllink_handle->usb_device_handle;
- if (ERROR_OK != versaloon_interface.init())
+ if (versaloon_interface.init() != ERROR_OK)
return ERROR_FAIL;
if (versaloon_interface.usb_setting.buf_size < 32) {
versaloon_interface.fini();
static int vsllink_init(void)
{
int retval = vsllink_interface_init();
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
versaloon_interface.adaptors.gpio.init(0);
versaloon_interface.adaptors.gpio.config(0, GPIO_TRST, 0,
GPIO_TRST, GPIO_TRST);
versaloon_interface.adaptors.swd.init(0);
- vsllink_swd_frequency(jtag_get_speed_khz() * 1000);
+ vsllink_swd_frequency(adapter_get_speed_khz() * 1000);
vsllink_swd_switch_seq(JTAG_TO_SWD);
} else {
tdi_buffer = malloc(tap_buffer_size);
tdo_buffer = malloc(tap_buffer_size);
tms_buffer = malloc(tap_buffer_size);
- if ((NULL == tdi_buffer) || (NULL == tdo_buffer) || (NULL == tms_buffer)) {
+ if ((!tdi_buffer) || (!tdo_buffer) || (!tms_buffer)) {
vsllink_quit();
return ERROR_FAIL;
}
versaloon_interface.adaptors.jtag_raw.init(0);
- versaloon_interface.adaptors.jtag_raw.config(0, jtag_get_speed_khz());
+ versaloon_interface.adaptors.jtag_raw.config(0, adapter_get_speed_khz());
versaloon_interface.adaptors.gpio.config(0, GPIO_SRST | GPIO_TRST,
GPIO_TRST, GPIO_SRST, GPIO_SRST);
}
- if (ERROR_OK != versaloon_interface.adaptors.peripheral_commit())
+ if (versaloon_interface.adaptors.peripheral_commit() != ERROR_OK)
return ERROR_FAIL;
vsllink_reset(0, 0);
return ERROR_OK;
}
-COMMAND_HANDLER(vsllink_handle_usb_serial_command)
-{
- if (CMD_ARGC > 1)
- return ERROR_COMMAND_SYNTAX_ERROR;
-
- free(versaloon_interface.usb_setting.serialstring);
-
- if (CMD_ARGC == 1)
- versaloon_interface.usb_setting.serialstring = strdup(CMD_ARGV[0]);
- else
- versaloon_interface.usb_setting.serialstring = NULL;
-
- return ERROR_OK;
-}
-
COMMAND_HANDLER(vsllink_handle_usb_bulkin_command)
{
if (CMD_ARGC != 1)
return ERROR_JTAG_QUEUE_FAILED;
}
- if (pending_scan_result->buffer != NULL)
- free(pending_scan_result->buffer);
+ free(pending_scan_result->buffer);
}
}
} else {
char desc_string[256];
int retval;
- if (NULL != versaloon_interface.usb_setting.serialstring) {
+ if (adapter_get_required_serial()) {
retval = libusb_get_string_descriptor_ascii(usb_device_handle,
usb_desc->iSerialNumber, (unsigned char *)desc_string,
sizeof(desc_string));
if (retval < 0)
return ERROR_FAIL;
- if (strncmp(desc_string, versaloon_interface.usb_setting.serialstring,
+ if (strncmp(desc_string, adapter_get_required_serial(),
sizeof(desc_string)))
return ERROR_FAIL;
}
if (retval < 0)
return ERROR_FAIL;
- if (strstr(desc_string, "Versaloon") == NULL)
+ if (!strstr(desc_string, "Versaloon"))
return ERROR_FAIL;
return ERROR_OK;
static int vsllink_usb_open(struct vsllink *vsllink)
{
ssize_t num_devices, i;
- libusb_device **usb_devices;
+ struct libusb_device **usb_devices;
struct libusb_device_descriptor usb_desc;
struct libusb_device_handle *usb_device_handle;
int retval;
return ERROR_FAIL;
for (i = 0; i < num_devices; i++) {
- libusb_device *device = usb_devices[i];
+ struct libusb_device *device = usb_devices[i];
retval = libusb_get_device_descriptor(device, &usb_desc);
if (retval != 0)
continue;
retval = vsllink_check_usb_strings(usb_device_handle, &usb_desc);
- if (ERROR_OK == retval)
+ if (retval == ERROR_OK)
break;
libusb_close(usb_device_handle);
}
}
-static const struct command_registration vsllink_command_handlers[] = {
+static const struct command_registration vsllink_subcommand_handlers[] = {
{
- .name = "vsllink_usb_vid",
+ .name = "usb_vid",
.handler = &vsllink_handle_usb_vid_command,
.mode = COMMAND_CONFIG,
.help = "Set USB VID",
.usage = "<vid>",
},
{
- .name = "vsllink_usb_pid",
+ .name = "usb_pid",
.handler = &vsllink_handle_usb_pid_command,
.mode = COMMAND_CONFIG,
.help = "Set USB PID",
.usage = "<pid>",
},
{
- .name = "vsllink_usb_serial",
- .handler = &vsllink_handle_usb_serial_command,
- .mode = COMMAND_CONFIG,
- .help = "Set or disable check for USB serial",
- .usage = "[<serial>]",
- },
- {
- .name = "vsllink_usb_bulkin",
+ .name = "usb_bulkin",
.handler = &vsllink_handle_usb_bulkin_command,
.mode = COMMAND_CONFIG,
.help = "Set USB input endpoint",
.usage = "<ep_in>",
},
{
- .name = "vsllink_usb_bulkout",
+ .name = "usb_bulkout",
.handler = &vsllink_handle_usb_bulkout_command,
.mode = COMMAND_CONFIG,
.help = "Set USB output endpoint",
.usage = "<ep_out>",
},
{
- .name = "vsllink_usb_interface",
+ .name = "usb_interface",
.handler = &vsllink_handle_usb_interface_command,
.mode = COMMAND_CONFIG,
.help = "Set USB output interface",
COMMAND_REGISTRATION_DONE
};
+static const struct command_registration vsllink_command_handlers[] = {
+ {
+ .name = "vsllink",
+ .mode = COMMAND_ANY,
+ .help = "perform vsllink management",
+ .chain = vsllink_subcommand_handlers,
+ .usage = "",
+ },
+ COMMAND_REGISTRATION_DONE
+};
+
static const char * const vsllink_transports[] = {"jtag", "swd", NULL};
static const struct swd_driver vsllink_swd_driver = {
.run = vsllink_swd_run_queue,
};
-struct jtag_interface vsllink_interface = {
- .name = "vsllink",
+static struct jtag_interface vsllink_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
- .commands = vsllink_command_handlers,
+ .execute_queue = vsllink_execute_queue,
+};
+
+struct adapter_driver vsllink_adapter_driver = {
+ .name = "vsllink",
.transports = vsllink_transports,
- .swd = &vsllink_swd_driver,
+ .commands = vsllink_command_handlers,
.init = vsllink_init,
.quit = vsllink_quit,
.reset = vsllink_reset,
- .khz = vsllink_khz,
.speed = vsllink_speed,
+ .khz = vsllink_khz,
.speed_div = vsllink_speed_div,
- .execute_queue = vsllink_execute_queue,
+
+ .jtag_ops = &vsllink_interface,
+ .swd_ops = &vsllink_swd_driver,
};