openocd: fix SPDX tag format for files .c
[fw/openocd] / src / jtag / drivers / vsllink.c
index 501322bba66583acf19b72df663485b06f1120d0..255ff88a2fb04ba5f0bfa64e60783fa4903a864a 100644 (file)
@@ -1,18 +1,7 @@
+// 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.
@@ -24,6 +13,7 @@
 #include "config.h"
 #endif
 
+#include <jtag/adapter.h>
 #include <jtag/interface.h>
 #include <jtag/commands.h>
 #include <jtag/swd.h>
@@ -59,7 +49,7 @@ static void vsllink_runtest(int num_cycles);
 static void vsllink_stableclocks(int num_cycles, int tms);
 static void vsllink_scan(bool ir_scan, enum scan_type type,
                uint8_t *buffer, int scan_size, struct scan_command *command);
-static void vsllink_reset(int trst, int srst);
+static int vsllink_reset(int trst, int srst);
 
 /* VSLLink tap buffer functions */
 static void vsllink_tap_append_step(int tms, int tdi);
@@ -105,7 +95,7 @@ static int vsllink_execute_queue(void)
                " vsllink "
                "-------------------------------------");
 
-       while (cmd != NULL) {
+       while (cmd) {
                switch (cmd->type) {
                        case JTAG_RUNTEST:
                                LOG_DEBUG_IO("runtest %i cycles, end in %s",
@@ -164,22 +154,8 @@ static int vsllink_execute_queue(void)
                                                cmd->cmd.scan);
                                break;
 
-                       case JTAG_RESET:
-                               LOG_DEBUG_IO("reset trst: %i srst %i",
-                                               cmd->cmd.reset->trst,
-                                               cmd->cmd.reset->srst);
-
-                               vsllink_tap_execute();
-
-                               if (cmd->cmd.reset->trst == 1)
-                                       tap_set_state(TAP_RESET);
-
-                               vsllink_reset(cmd->cmd.reset->trst,
-                                               cmd->cmd.reset->srst);
-                               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;
@@ -259,18 +235,14 @@ static int vsllink_speed_div(int jtag_speed, int *khz)
 
 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)
@@ -290,6 +262,7 @@ 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;
@@ -298,15 +271,15 @@ static int vsllink_quit(void)
 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;
        }
@@ -315,7 +288,7 @@ static int vsllink_interface_init(void)
                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();
@@ -328,7 +301,7 @@ static int vsllink_interface_init(void)
 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);
@@ -341,7 +314,7 @@ static int vsllink_init(void)
                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 {
@@ -351,18 +324,18 @@ static int vsllink_init(void)
                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);
@@ -478,7 +451,7 @@ static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer,
                vsllink_state_move();
 }
 
-static void vsllink_reset(int trst, int srst)
+static int vsllink_reset(int trst, int srst)
 {
        LOG_DEBUG("trst: %i, srst: %i", trst, srst);
 
@@ -494,7 +467,7 @@ static void vsllink_reset(int trst, int srst)
                        versaloon_interface.adaptors.gpio.out(0, GPIO_TRST, 0);
        }
 
-       versaloon_interface.adaptors.peripheral_commit();
+       return versaloon_interface.adaptors.peripheral_commit();
 }
 
 COMMAND_HANDLER(vsllink_handle_usb_vid_command)
@@ -516,21 +489,6 @@ COMMAND_HANDLER(vsllink_handle_usb_pid_command)
        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)
@@ -690,8 +648,7 @@ static int vsllink_jtag_execute(void)
                                        return ERROR_JTAG_QUEUE_FAILED;
                                }
 
-                               if (pending_scan_result->buffer != NULL)
-                                       free(pending_scan_result->buffer);
+                               free(pending_scan_result->buffer);
                        }
                }
        } else {
@@ -804,14 +761,14 @@ static int vsllink_check_usb_strings(
        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;
        }
@@ -822,7 +779,7 @@ static int vsllink_check_usb_strings(
        if (retval < 0)
                return ERROR_FAIL;
 
-       if (strstr(desc_string, "Versaloon") == NULL)
+       if (!strstr(desc_string, "Versaloon"))
                return ERROR_FAIL;
 
        return ERROR_OK;
@@ -831,7 +788,7 @@ static int vsllink_check_usb_strings(
 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;
@@ -842,7 +799,7 @@ static int vsllink_usb_open(struct vsllink *vsllink)
                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)
@@ -857,7 +814,7 @@ static int vsllink_usb_open(struct vsllink *vsllink)
                        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);
@@ -906,44 +863,37 @@ static void vsllink_debug_buffer(uint8_t *buffer, int length)
        }
 }
 
-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",
@@ -952,28 +902,44 @@ static const struct command_registration vsllink_command_handlers[] = {
        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 = {
        .init = vsllink_swd_init,
-       .frequency = vsllink_swd_frequency,
        .switch_seq = vsllink_swd_switch_seq,
        .read_reg = vsllink_swd_read_reg,
        .write_reg = vsllink_swd_write_reg,
        .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,
-       .khz = vsllink_khz,
+       .reset = vsllink_reset,
        .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,
 };