openocd: fix SPDX tag format for files .c
[fw/openocd] / src / jtag / drivers / xds110.c
index 1a17f70cc882fb00697d2e2d0ee0b2d091a992e6..ecba36bb9a2e7f1472cdf1ecd1c90aa678b43766 100644 (file)
@@ -1,18 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2017 by Texas Instruments, Inc.                         *
- *                                                                         *
- *   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/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #include <transport/transport.h>
+#include <jtag/adapter.h>
 #include <jtag/swd.h>
 #include <jtag/interface.h>
 #include <jtag/commands.h>
 #include <jtag/tcl.h>
 #include <libusb.h>
 
-/* XDS110 USB serial number length */
-#define XDS110_SERIAL_LEN 8
-
 /* XDS110 stand-alone probe voltage supply limits */
 #define XDS110_MIN_VOLTAGE 1800
 #define XDS110_MAX_VOLTAGE 3600
@@ -238,8 +225,6 @@ struct xds110_info {
        /* TCK speed and delay count*/
        uint32_t speed;
        uint32_t delay_count;
-       /* XDS110 serial number */
-       char serial[XDS110_SERIAL_LEN + 1];
        /* XDS110 voltage supply setting */
        uint32_t voltage;
        /* XDS110 firmware and hardware version */
@@ -269,7 +254,6 @@ static struct xds110_info xds110 = {
        .is_ap_dirty = false,
        .speed = XDS110_DEFAULT_TCK_SPEED,
        .delay_count = 0,
-       .serial = {0},
        .voltage = 0,
        .firmware = 0,
        .hardware = 0,
@@ -341,7 +325,7 @@ static bool usb_connect(void)
        /* Initialize libusb context */
        result = libusb_init(&ctx);
 
-       if (0 == result) {
+       if (result == 0) {
                /* Get list of USB devices attached to system */
                count = libusb_get_device_list(ctx, &list);
                if (count <= 0) {
@@ -350,7 +334,7 @@ static bool usb_connect(void)
                }
        }
 
-       if (0 == result) {
+       if (result == 0) {
                /* Scan through list of devices for any XDS110s */
                for (i = 0; i < count; i++) {
                        /* Check for device vid/pid match */
@@ -365,13 +349,13 @@ static bool usb_connect(void)
                        }
                        if (match) {
                                result = libusb_open(list[i], &dev);
-                               if (0 == result) {
+                               if (result == 0) {
                                        const int max_data = 256;
                                        unsigned char data[max_data + 1];
                                        *data = '\0';
 
                                        /* May be the requested device if serial number matches */
-                                       if (0 == xds110.serial[0]) {
+                                       if (!adapter_get_required_serial()) {
                                                /* No serial number given; match first XDS110 found */
                                                found = true;
                                                break;
@@ -380,7 +364,7 @@ static bool usb_connect(void)
                                                result = libusb_get_string_descriptor_ascii(dev,
                                                                        desc.iSerialNumber, data, max_data);
                                                if (result > 0 &&
-                                                       strcmp((char *)data, (char *)xds110.serial) == 0) {
+                                                       strcmp((char *)data, adapter_get_required_serial()) == 0) {
                                                        found = true;
                                                        break;
                                                }
@@ -400,7 +384,7 @@ static bool usb_connect(void)
         * 2) didn't find the XDS110, and no devices are currently open
         */
 
-       if (NULL != list) {
+       if (list) {
                /* Free the device list, we're done with it */
                libusb_free_device_list(list, 1);
        }
@@ -430,36 +414,36 @@ static bool usb_connect(void)
        }
 
        /* On an error, clean up what we can */
-       if (0 != result) {
-               if (NULL != dev) {
+       if (result != 0) {
+               if (dev) {
                        /* Release the debug and data interface on the XDS110 */
                        (void)libusb_release_interface(dev, xds110.interface);
                        libusb_close(dev);
                }
-               if (NULL != ctx)
+               if (ctx)
                        libusb_exit(ctx);
                xds110.ctx = NULL;
                xds110.dev = NULL;
        }
 
        /* Log the results */
-       if (0 == result)
+       if (result == 0)
                LOG_INFO("XDS110: connected");
        else
                LOG_ERROR("XDS110: failed to connect");
 
-       return (0 == result) ? true : false;
+       return (result == 0) ? true : false;
 }
 
 static void usb_disconnect(void)
 {
-       if (NULL != xds110.dev) {
+       if (xds110.dev) {
                /* Release the debug and data interface on the XDS110 */
                (void)libusb_release_interface(xds110.dev, xds110.interface);
                libusb_close(xds110.dev);
                xds110.dev = NULL;
        }
-       if (NULL != xds110.ctx) {
+       if (xds110.ctx) {
                libusb_exit(xds110.ctx);
                xds110.ctx = NULL;
        }
@@ -472,17 +456,17 @@ static bool usb_read(unsigned char *buffer, int size, int *bytes_read,
 {
        int result;
 
-       if (NULL == xds110.dev || NULL == buffer || NULL == bytes_read)
+       if (!xds110.dev || !buffer || !bytes_read)
                return false;
 
        /* Force a non-zero timeout to prevent blocking */
-       if (0 == timeout)
+       if (timeout == 0)
                timeout = DEFAULT_TIMEOUT;
 
        result = libusb_bulk_transfer(xds110.dev, xds110.endpoint_in, buffer, size,
                                bytes_read, timeout);
 
-       return (0 == result) ? true : false;
+       return (result == 0) ? true : false;
 }
 
 static bool usb_write(unsigned char *buffer, int size, int *written)
@@ -491,7 +475,7 @@ static bool usb_write(unsigned char *buffer, int size, int *written)
        int result = LIBUSB_SUCCESS;
        int retries = 0;
 
-       if (NULL == xds110.dev || NULL == buffer)
+       if (!xds110.dev || !buffer)
                return false;
 
        result = libusb_bulk_transfer(xds110.dev, xds110.endpoint_out, buffer,
@@ -505,7 +489,7 @@ static bool usb_write(unsigned char *buffer, int size, int *written)
                retries++;
        }
 
-       if (NULL != written)
+       if (written)
                *written = bytes_written;
 
        return (result == 0 && size == bytes_written) ? true : false;
@@ -550,7 +534,7 @@ static bool usb_get_response(uint32_t *total_bytes_read, uint32_t timeout)
 
        /* Abort now if we didn't receive a valid response */
        if (!success) {
-               if (NULL != total_bytes_read)
+               if (total_bytes_read)
                        *total_bytes_read = 0;
                return false;
        }
@@ -587,7 +571,7 @@ static bool usb_get_response(uint32_t *total_bytes_read, uint32_t timeout)
 
        if (!success)
                count = 0;
-       if (NULL != total_bytes_read)
+       if (total_bytes_read)
                *total_bytes_read = count;
 
        return success;
@@ -636,7 +620,7 @@ static bool xds_execute(uint32_t out_length, uint32_t in_length,
        int error = 0;
        uint32_t bytes_read = 0;
 
-       if (NULL == xds110.dev)
+       if (!xds110.dev)
                return false;
 
        while (!done && attempts > 0) {
@@ -671,7 +655,7 @@ static bool xds_execute(uint32_t out_length, uint32_t in_length,
        if (!success)
                error = SC_ERR_XDS110_FAIL;
 
-       if (0 != error)
+       if (error != 0)
                success = false;
 
        return success;
@@ -714,9 +698,9 @@ static bool xds_version(uint32_t *firmware_id, uint16_t *hardware_id)
                                DEFAULT_TIMEOUT);
 
        if (success) {
-               if (NULL != firmware_id)
+               if (firmware_id)
                        *firmware_id = xds110_get_u32(fw_id_pntr);
-               if (NULL != hardware_id)
+               if (hardware_id)
                        *hardware_id = xds110_get_u16(hw_id_pntr);
        }
 
@@ -863,7 +847,7 @@ static bool cmapi_connect(uint32_t *idcode)
                                DEFAULT_TIMEOUT);
 
        if (success) {
-               if (NULL != idcode)
+               if (idcode)
                        *idcode = xds110_get_u32(idcode_pntr);
        }
 
@@ -926,7 +910,7 @@ static bool cmapi_read_dap_reg(uint32_t type, uint32_t ap_num,
                                DEFAULT_TIMEOUT);
 
        if (success) {
-               if (NULL != value)
+               if (value)
                        *value = xds110_get_u32(value_pntr);
        }
 
@@ -943,7 +927,7 @@ static bool cmapi_write_dap_reg(uint32_t type, uint32_t ap_num,
 
        bool success;
 
-       if (NULL == value)
+       if (!value)
                return false;
 
        xds110.write_payload[0] = CMAPI_REG_WRITE;
@@ -1037,7 +1021,7 @@ static bool ocd_dap_request(uint8_t *dap_requests, uint32_t request_size,
 
        bool success;
 
-       if (NULL == dap_requests || NULL == dap_results)
+       if (!dap_requests || !dap_results)
                return false;
 
        xds110.write_payload[0] = OCD_DAP_REQUEST;
@@ -1062,7 +1046,7 @@ static bool ocd_scan_request(uint8_t *scan_requests, uint32_t request_size,
 
        bool success;
 
-       if (NULL == scan_requests || NULL == scan_results)
+       if (!scan_requests || !scan_results)
                return false;
 
        xds110.write_payload[0] = OCD_SCAN_REQUEST;
@@ -1086,7 +1070,7 @@ static bool ocd_pathmove(uint32_t num_states, uint8_t *path)
 
        bool success;
 
-       if (NULL == path)
+       if (!path)
                return false;
 
        xds110.write_payload[0] = OCD_PATHMOVE;
@@ -1209,7 +1193,7 @@ static bool xds110_legacy_read_reg(uint8_t cmd, uint32_t *value)
        /* Handle result of read attempt */
        if (!success)
                LOG_ERROR("XDS110: failed to read DAP register");
-       else if (NULL != value)
+       else if (value)
                *value = reg_value;
 
        if (success && DAP_AP == type) {
@@ -1280,7 +1264,7 @@ static int xds110_swd_run_queue(void)
        uint32_t value;
        bool success = true;
 
-       if (0 == xds110.txn_request_size)
+       if (xds110.txn_request_size == 0)
                return ERROR_OK;
 
        /* Terminate request queue */
@@ -1316,7 +1300,7 @@ static int xds110_swd_run_queue(void)
 
        /* Transfer results into caller's buffers */
        for (result = 0; result < xds110.txn_result_count; result++)
-               if (0 != xds110.txn_dap_results[result])
+               if (xds110.txn_dap_results[result] != 0)
                        *xds110.txn_dap_results[result] = dap_results[result];
 
        xds110.txn_request_size = 0;
@@ -1395,8 +1379,8 @@ static void xds110_show_info(void)
                (((firmware >> 12) & 0xf) * 10) + ((firmware >>  8) & 0xf),
                (((firmware >>  4) & 0xf) * 10) + ((firmware >>  0) & 0xf));
        LOG_INFO("XDS110: hardware version = 0x%04x", xds110.hardware);
-       if (0 != xds110.serial[0])
-               LOG_INFO("XDS110: serial number = %s", xds110.serial);
+       if (adapter_get_required_serial())
+               LOG_INFO("XDS110: serial number = %s", adapter_get_required_serial());
        if (xds110.is_swd_mode) {
                LOG_INFO("XDS110: connected to target via SWD");
                LOG_INFO("XDS110: SWCLK set to %" PRIu32 " kHz", xds110.speed);
@@ -1470,12 +1454,12 @@ static int xds110_init(void)
 
        if (success) {
                /* Set supply voltage for stand-alone probes */
-               if (XDS110_STAND_ALONE_ID == xds110.hardware) {
+               if (xds110.hardware == XDS110_STAND_ALONE_ID) {
                        success = xds_set_supply(xds110.voltage);
                        /* Allow time for target device to power up */
                        /* (CC32xx takes up to 1300 ms before debug is enabled) */
                        alive_sleep(1500);
-               } else if (0 != xds110.voltage) {
+               } else if (xds110.voltage != 0) {
                        /* Voltage supply not a feature of embedded probes */
                        LOG_WARNING(
                                "XDS110: ignoring supply voltage, not supported on this probe");
@@ -1557,7 +1541,7 @@ static void xds110_flush(void)
        uint8_t data_in[MAX_DATA_BLOCK];
        uint8_t *data_pntr;
 
-       if (0 == xds110.txn_request_size)
+       if (xds110.txn_request_size == 0)
                return;
 
        /* Terminate request queue */
@@ -1867,7 +1851,7 @@ static int xds110_execute_queue(void)
 {
        struct jtag_command *cmd = jtag_command_queue;
 
-       while (cmd != NULL) {
+       while (cmd) {
                xds110_execute_command(cmd);
                cmd = cmd->next;
        }
@@ -2024,34 +2008,6 @@ COMMAND_HANDLER(xds110_handle_info_command)
        return ERROR_OK;
 }
 
-COMMAND_HANDLER(xds110_handle_serial_command)
-{
-       wchar_t serial[XDS110_SERIAL_LEN + 1];
-
-       xds110.serial[0] = 0;
-
-       if (CMD_ARGC == 1) {
-               size_t len = mbstowcs(0, CMD_ARGV[0], 0);
-               if (len > XDS110_SERIAL_LEN) {
-                       LOG_ERROR("XDS110: serial number is limited to %d characters",
-                               XDS110_SERIAL_LEN);
-                       return ERROR_FAIL;
-               }
-               if ((size_t)-1 == mbstowcs(serial, CMD_ARGV[0], len + 1)) {
-                       LOG_ERROR("XDS110: unable to convert serial number");
-                       return ERROR_FAIL;
-               }
-
-               for (uint32_t i = 0; i < len; i++)
-                       xds110.serial[i] = (char)serial[i];
-
-               xds110.serial[len] = 0;
-       } else
-               return ERROR_COMMAND_SYNTAX_ERROR;
-
-       return ERROR_OK;
-}
-
 COMMAND_HANDLER(xds110_handle_supply_voltage_command)
 {
        uint32_t voltage = 0;
@@ -2082,13 +2038,6 @@ static const struct command_registration xds110_subcommand_handlers[] = {
                .help = "show XDS110 info",
                .usage = "",
        },
-       {
-               .name = "serial",
-               .handler = &xds110_handle_serial_command,
-               .mode = COMMAND_CONFIG,
-               .help = "set the XDS110 probe serial number",
-               .usage = "serial_string",
-       },
        {
                .name = "supply",
                .handler = &xds110_handle_supply_voltage_command,