openocd: fix SPDX tag format for files .c
[fw/openocd] / src / jtag / drivers / presto.c
index 49caa679f9022036ff7e357aa7b105b63529f709..f6e13f7eb4eaf7443ae85ac69ada4a2c54738a03 100644 (file)
@@ -1,19 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2007 by Pavel Chromy                                    *
  *   chromy@asix.cz                                                        *
- *                                                                         *
- *   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/>. *
  ***************************************************************************/
 
 /**
 #include "windows.h"
 #endif
 
+#include <jtag/adapter.h>
 #include <jtag/interface.h>
 #include <helper/time_support.h>
 #include "bitq.h"
 
 /* PRESTO access library includes */
-#include <ftdi.h>
+#include "libftdi_helper.h"
 
 /* -------------------------------------------------------------------------- */
 
@@ -117,8 +107,7 @@ static int presto_read(uint8_t *buf, uint32_t size)
                ftbytes += presto->retval;
 
                gettimeofday(&now, NULL);
-               if ((now.tv_sec > timeout.tv_sec) ||
-                               ((now.tv_sec == timeout.tv_sec) && (now.tv_usec > timeout.tv_usec)))
+               if (timeval_compare(&now, &timeout) > 0)
                        break;
        }
 
@@ -133,7 +122,7 @@ static int presto_read(uint8_t *buf, uint32_t size)
        return ERROR_OK;
 }
 
-static int presto_open_libftdi(char *req_serial)
+static int presto_open_libftdi(const char *req_serial)
 {
        uint8_t presto_data;
 
@@ -161,8 +150,8 @@ static int presto_open_libftdi(char *req_serial)
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
-       if (ftdi_usb_purge_buffers(&presto->ftdic) < 0) {
-               LOG_ERROR("unable to purge PRESTO buffers");
+       if (ftdi_tcioflush(&presto->ftdic) < 0) {
+               LOG_ERROR("unable to flush PRESTO buffers");
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
@@ -175,7 +164,7 @@ static int presto_open_libftdi(char *req_serial)
        if (presto_read(&presto_data, 1) != ERROR_OK) {
                LOG_DEBUG("no response from PRESTO, retrying");
 
-               if (ftdi_usb_purge_buffers(&presto->ftdic) < 0)
+               if (ftdi_tcioflush(&presto->ftdic) < 0)
                        return ERROR_JTAG_DEVICE_ERROR;
 
                presto_data = 0xD0;
@@ -196,7 +185,7 @@ static int presto_open_libftdi(char *req_serial)
        return ERROR_OK;
 }
 
-static int presto_open(char *req_serial)
+static int presto_open(const char *req_serial)
 {
        presto->buff_out_pos = 0;
        presto->buff_in_pos = 0;
@@ -352,7 +341,7 @@ static int presto_bitq_out(int tms, int tdi, int tdo_req)
        unsigned char cmd;
 
        if (presto->jtag_tck == 0)
-               presto_sendbyte(0xA4);  /* LED idicator - JTAG active */
+               presto_sendbyte(0xA4);  /* LED indicator - JTAG active */
        else if (presto->jtag_speed == 0 && !tdo_req && tms == presto->jtag_tms) {
                presto->jtag_tdi_data |= (tdi != 0) << presto->jtag_tdi_count;
 
@@ -393,7 +382,7 @@ static int presto_bitq_flush(void)
        presto_tdi_flush();
        presto_tck_idle();
 
-       presto_sendbyte(0xA0);  /* LED idicator - JTAG idle */
+       presto_sendbyte(0xA0);  /* LED indicator - JTAG idle */
 
        return presto_flush();
 }
@@ -507,36 +496,13 @@ static int presto_jtag_speed(int speed)
        return 0;
 }
 
-static char *presto_serial;
-
-COMMAND_HANDLER(presto_handle_serial_command)
-{
-       if (CMD_ARGC == 1) {
-               if (presto_serial)
-                       free(presto_serial);
-               presto_serial = strdup(CMD_ARGV[0]);
-       } else
-               return ERROR_COMMAND_SYNTAX_ERROR;
-
-       return ERROR_OK;
-}
-
-static const struct command_registration presto_command_handlers[] = {
-       {
-               .name = "presto_serial",
-               .handler = presto_handle_serial_command,
-               .mode = COMMAND_CONFIG,
-               .help = "Configure USB serial number of Presto device.",
-               .usage = "serial_string",
-       },
-       COMMAND_REGISTRATION_DONE
-};
-
 static int presto_jtag_init(void)
 {
+       const char *presto_serial = adapter_get_required_serial();
+
        if (presto_open(presto_serial) != ERROR_OK) {
                presto_close();
-               if (presto_serial != NULL)
+               if (presto_serial)
                        LOG_ERROR("Cannot open PRESTO, serial number '%s'", presto_serial);
                else
                        LOG_ERROR("Cannot open PRESTO");
@@ -553,23 +519,22 @@ static int presto_jtag_quit(void)
        bitq_cleanup();
        presto_close();
        LOG_INFO("PRESTO closed");
-
-       if (presto_serial) {
-               free(presto_serial);
-               presto_serial = NULL;
-       }
-
        return ERROR_OK;
 }
 
-struct jtag_interface presto_interface = {
+static struct jtag_interface presto_interface = {
+       .execute_queue = bitq_execute_queue,
+};
+
+struct adapter_driver presto_adapter_driver = {
        .name = "presto",
-       .commands = presto_command_handlers,
+       .transports = jtag_only,
 
-       .execute_queue = bitq_execute_queue,
+       .init = presto_jtag_init,
+       .quit = presto_jtag_quit,
        .speed = presto_jtag_speed,
        .khz = presto_adapter_khz,
        .speed_div = presto_jtag_speed_div,
-       .init = presto_jtag_init,
-       .quit = presto_jtag_quit,
+
+       .jtag_ops = &presto_interface,
 };