openocd: fix SPDX tag format for files .c
[fw/openocd] / src / jtag / drivers / osbdm.c
index 2560db18f248a026fc9af3c4ee8d9526832cee95..d8fe7135e72bced3958391fb12bef70d95b2ddd3 100644 (file)
@@ -1,21 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2012 by Jan Dakinevich                                  *
  *   jan.dakinevich@gmail.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, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 #ifdef HAVE_CONFIG_H
 #      include "config.h"
@@ -25,7 +12,7 @@
 #include <helper/binarybuffer.h>
 #include <helper/command.h>
 #include <jtag/interface.h>
-#include "libusb_common.h"
+#include "libusb_helper.h"
 
 struct sequence {
        int len;
@@ -48,7 +35,7 @@ static struct sequence *queue_add_tail(struct queue *queue, int len)
        }
 
        struct sequence *next;
-       next = (struct sequence *)malloc(sizeof(*next));
+       next = malloc(sizeof(*next));
        if (next) {
                next->tms = calloc(1, DIV_ROUND_UP(len, 8));
                if (next->tms) {
@@ -98,7 +85,7 @@ static void queue_free(struct queue *queue)
 
 static struct queue *queue_alloc(void)
 {
-       struct queue *queue = (struct queue *)malloc(sizeof(struct queue));
+       struct queue *queue = malloc(sizeof(*queue));
        if (queue)
                queue->head = NULL;
        else
@@ -107,7 +94,7 @@ static struct queue *queue_alloc(void)
        return queue;
 }
 
-/* Size of usb communnication buffer */
+/* Size of usb communication buffer */
 #define OSBDM_USB_BUFSIZE 64
 /* Timeout for USB transfer, ms */
 #define OSBDM_USB_TIMEOUT 1000
@@ -130,11 +117,11 @@ static struct queue *queue_alloc(void)
 
 /* Lists of valid VID/PID pairs
  */
-static const uint16_t osbdm_vid[] = { 0x15a2, 0x15a2, 0 };
-static const uint16_t osbdm_pid[] = { 0x0042, 0x0058, 0 };
+static const uint16_t osbdm_vid[] = { 0x15a2, 0x15a2, 0x15a2, 0 };
+static const uint16_t osbdm_pid[] = { 0x0042, 0x0058, 0x005e, 0 };
 
 struct osbdm {
-       struct jtag_libusb_device_handle *devh; /* USB handle */
+       struct libusb_device_handle *devh; /* USB handle */
        uint8_t buffer[OSBDM_USB_BUFSIZE]; /* Data to send and receive */
        int count; /* Count data to send and to read */
 };
@@ -146,11 +133,13 @@ static struct osbdm osbdm_context;
 static int osbdm_send_and_recv(struct osbdm *osbdm)
 {
        /* Send request */
-       int count = jtag_libusb_bulk_write(osbdm->devh, OSBDM_USB_EP_WRITE,
-               (char *)osbdm->buffer, osbdm->count, OSBDM_USB_TIMEOUT);
+       int count, ret;
 
-       if (count != osbdm->count) {
-               LOG_ERROR("OSBDM communnication error: can't write");
+       ret = jtag_libusb_bulk_write(osbdm->devh, OSBDM_USB_EP_WRITE,
+                                    (char *)osbdm->buffer, osbdm->count,
+                                    OSBDM_USB_TIMEOUT, &count);
+       if (ret || count != osbdm->count) {
+               LOG_ERROR("OSBDM communication error: can't write");
                return ERROR_FAIL;
        }
 
@@ -158,29 +147,28 @@ static int osbdm_send_and_recv(struct osbdm *osbdm)
        uint8_t cmd_saved = osbdm->buffer[0];
 
        /* Reading answer */
-       osbdm->count = jtag_libusb_bulk_read(osbdm->devh, OSBDM_USB_EP_READ,
-               (char *)osbdm->buffer, OSBDM_USB_BUFSIZE, OSBDM_USB_TIMEOUT);
-
+       ret = jtag_libusb_bulk_read(osbdm->devh, OSBDM_USB_EP_READ,
+                                   (char *)osbdm->buffer, OSBDM_USB_BUFSIZE,
+                                   OSBDM_USB_TIMEOUT, &osbdm->count);
        /* Now perform basic checks for data sent by BDM device
         */
-
-       if (osbdm->count < 0) {
-               LOG_ERROR("OSBDM communnication error: can't read");
+       if (ret) {
+               LOG_ERROR("OSBDM communication error: can't read");
                return ERROR_FAIL;
        }
 
        if (osbdm->count < 2) {
-               LOG_ERROR("OSBDM communnication error: answer too small");
+               LOG_ERROR("OSBDM communication error: reply too small");
                return ERROR_FAIL;
        }
 
        if (osbdm->count != osbdm->buffer[1])  {
-               LOG_ERROR("OSBDM communnication error: answer size mismatch");
+               LOG_ERROR("OSBDM communication error: reply size mismatch");
                return ERROR_FAIL;
        }
 
        if (cmd_saved != osbdm->buffer[0]) {
-               LOG_ERROR("OSBDM communnication error: answer command mismatch");
+               LOG_ERROR("OSBDM communication error: reply command mismatch");
                return ERROR_FAIL;
        }
 
@@ -219,7 +207,7 @@ static int osbdm_swap(struct osbdm *osbdm, void *tms, void *tdi,
        }
 
        if (length <= 0) {
-               LOG_ERROR("BUG: bit sequence equal or less to 0");
+               LOG_ERROR("BUG: bit sequence equal or less than 0");
                return ERROR_FAIL;
        }
 
@@ -271,13 +259,13 @@ static int osbdm_swap(struct osbdm *osbdm, void *tms, void *tdi,
        /*      Extra check
         */
        if (((osbdm->buffer[2] << 8) | osbdm->buffer[3]) != 2 * swap_count) {
-               LOG_ERROR("OSBDM communnication error: not proper answer to swap command");
+               LOG_ERROR("OSBDM communication error: invalid swap command reply");
                return ERROR_FAIL;
        }
 
-       /* Copy TDO responce
+       /* Copy TDO response
         */
-       uint8_t *buffer = (uint8_t *)osbdm->buffer + 4;
+       uint8_t *buffer = osbdm->buffer + 4;
        for (int bit_idx = 0; bit_idx < length; ) {
                int bit_count = length - bit_idx;
                if (bit_count > 16)
@@ -298,7 +286,7 @@ static int osbdm_swap(struct osbdm *osbdm, void *tms, void *tdi,
        return ERROR_OK;
 }
 
-static int osbdm_flush(struct osbdm *osbdm, struct queuequeue)
+static int osbdm_flush(struct osbdm *osbdm, struct queue *queue)
 {
        uint8_t tms[DIV_ROUND_UP(OSBDM_SWAP_MAX, 8)];
        uint8_t tdi[DIV_ROUND_UP(OSBDM_SWAP_MAX, 8)];
@@ -375,10 +363,10 @@ static int osbdm_flush(struct osbdm *osbdm, struct queue* queue)
 static int osbdm_open(struct osbdm *osbdm)
 {
        (void)memset(osbdm, 0, sizeof(*osbdm));
-       if (jtag_libusb_open(osbdm_vid, osbdm_pid, &osbdm->devh) != ERROR_OK)
+       if (jtag_libusb_open(osbdm_vid, osbdm_pid, &osbdm->devh, NULL) != ERROR_OK)
                return ERROR_FAIL;
 
-       if (jtag_libusb_claim_interface(osbdm->devh, 0) != ERROR_OK)
+       if (libusb_claim_interface(osbdm->devh, 0) != ERROR_OK)
                return ERROR_FAIL;
 
        return ERROR_OK;
@@ -431,7 +419,7 @@ static int osbdm_add_statemove(
        int skip_first)
 {
        int len = 0;
-       int tms;
+       int tms = 0;
 
        tap_set_end_state(new_state);
        if (tap_get_end_state() == TAP_RESET) {
@@ -678,7 +666,7 @@ static int osbdm_init(void)
                return ERROR_FAIL;
        } else {
                /* Device successfully opened */
-               LOG_INFO("OSBDM has opened");
+               LOG_DEBUG("OSBDM init");
        }
 
        /* Perform initialize command */
@@ -690,12 +678,16 @@ static int osbdm_init(void)
        return ERROR_OK;
 }
 
-struct jtag_interface osbdm_interface = {
-       .name = "osbdm",
+static struct jtag_interface osbdm_interface = {
+       .execute_queue = osbdm_execute_queue,
+};
 
+struct adapter_driver osbdm_adapter_driver = {
+       .name = "osbdm",
        .transports = jtag_only,
-       .execute_queue = osbdm_execute_queue,
 
        .init = osbdm_init,
-       .quit = osbdm_quit
+       .quit = osbdm_quit,
+
+       .jtag_ops = &osbdm_interface,
 };