+// SPDX-License-Identifier: GPL-2.0-or-later
+
/***************************************************************************
* *
* Copyright (C) 2009 by Cahya Wirawan <cahya@gmx.at> *
* *
* Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk *
- * *
- * 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., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <jtag/interface.h>
#include <jtag/commands.h>
-#include "libusb_common.h"
+#include "libusb_helper.h"
#include <string.h>
-#include <sys/timeb.h>
#include <time.h>
#define OPENDOUS_MAX_VIDS_PIDS 4
/* define some probes with similar interface */
struct opendous_probe {
- char *name;
+ const char *name;
uint16_t VID[OPENDOUS_MAX_VIDS_PIDS];
uint16_t PID[OPENDOUS_MAX_VIDS_PIDS];
uint8_t READ_EP;
int BUFFERSIZE;
};
-static struct opendous_probe opendous_probes[] = {
+static const struct opendous_probe opendous_probes[] = {
{"usbprog-jtag", {0x1781, 0}, {0x0C63, 0}, 0x82, 0x02, 0x00, 510 },
{"opendous", {0x1781, 0x03EB, 0}, {0xC0C0, 0x204F, 0}, 0x81, 0x02, 0x00, 360 },
{"usbvlab", {0x16C0, 0}, {0x05DC, 0}, 0x81, 0x02, 0x01, 360 },
#define FUNC_READ_DATA 0x51
static char *opendous_type;
-static struct opendous_probe *opendous_probe;
+static const struct opendous_probe *opendous_probe;
/* External interface functions */
static int opendous_execute_queue(void);
/* opendous lowlevel functions */
struct opendous_jtag {
- struct jtag_libusb_device_handle *usb_handle;
+ struct libusb_device_handle *usb_handle;
};
static struct opendous_jtag *opendous_usb_open(void);
static int opendous_usb_read(struct opendous_jtag *opendous_jtag);
/* helper functions */
-int opendous_get_version_info(void);
+static int opendous_get_version_info(void);
#ifdef _DEBUG_USB_COMMS_
-char time_str[50];
static void opendous_debug_buffer(uint8_t *buffer, int length);
-char *opendous_get_time(char *);
#endif
static struct opendous_jtag *opendous_jtag_handle;
return ERROR_OK;
/* only if the cable name wasn't overwritten by cmdline */
- if (opendous_type == NULL) {
+ if (!opendous_type) {
/* REVISIT first verify that it's listed in cables[] ... */
opendous_type = strdup(CMD_ARGV[0]);
}
{
switch (CMD_ARGC) {
case 0:
- command_print(CMD_CTX, "opendous hw jtag %i", opendous_hw_jtag_version);
+ command_print(CMD, "opendous hw jtag %i", opendous_hw_jtag_version);
break;
case 1: {
.handler = &opendous_handle_opendous_info_command,
.mode = COMMAND_EXEC,
.help = "show opendous info",
+ .usage = "",
},
{
.name = "opendous_hw_jtag",
COMMAND_REGISTRATION_DONE
};
-struct jtag_interface opendous_interface = {
+static struct jtag_interface opendous_interface = {
+ .execute_queue = opendous_execute_queue,
+};
+
+struct adapter_driver opendous_adapter_driver = {
.name = "opendous",
+ .transports = jtag_only,
.commands = opendous_command_handlers,
- .execute_queue = opendous_execute_queue,
+
.init = opendous_init,
.quit = opendous_quit,
+
+ .jtag_ops = &opendous_interface,
};
static int opendous_execute_queue(void)
enum scan_type type;
uint8_t *buffer;
- while (cmd != NULL) {
+ while (cmd) {
switch (cmd->type) {
case JTAG_RUNTEST:
- DEBUG_JTAG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, \
+ LOG_DEBUG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state);
if (cmd->cmd.runtest->end_state != -1)
break;
case JTAG_TLR_RESET:
- DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
+ LOG_DEBUG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
if (cmd->cmd.statemove->end_state != -1)
opendous_end_state(cmd->cmd.statemove->end_state);
break;
case JTAG_PATHMOVE:
- DEBUG_JTAG_IO("pathmove: %i states, end in %i", \
- cmd->cmd.pathmove->num_states, \
+ LOG_DEBUG_IO("pathmove: %i states, end in %i",
+ cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
opendous_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
break;
case JTAG_SCAN:
- DEBUG_JTAG_IO("scan end in %i", cmd->cmd.scan->end_state);
+ LOG_DEBUG_IO("scan end in %i", cmd->cmd.scan->end_state);
if (cmd->cmd.scan->end_state != -1)
opendous_end_state(cmd->cmd.scan->end_state);
scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
- DEBUG_JTAG_IO("scan input, length = %d", scan_size);
+ LOG_DEBUG_IO("scan input, length = %d", scan_size);
#ifdef _DEBUG_USB_COMMS_
opendous_debug_buffer(buffer, (scan_size + 7) / 8);
break;
case JTAG_RESET:
- DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+ LOG_DEBUG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
opendous_tap_execute();
break;
case JTAG_SLEEP:
- DEBUG_JTAG_IO("sleep %" PRIi32, cmd->cmd.sleep->us);
+ LOG_DEBUG_IO("sleep %" PRIu32, cmd->cmd.sleep->us);
opendous_tap_execute();
jtag_sleep(cmd->cmd.sleep->us);
break;
static int opendous_init(void)
{
int check_cnt;
- struct opendous_probe *cur_opendous_probe;
+ const struct opendous_probe *cur_opendous_probe;
cur_opendous_probe = opendous_probes;
- if (opendous_type == NULL) {
+ if (!opendous_type) {
opendous_type = strdup("opendous");
LOG_WARNING("No opendous_type specified, using default 'opendous'");
}
{
opendous_usb_close(opendous_jtag_handle);
- if (usb_out_buffer) {
- free(usb_out_buffer);
- usb_out_buffer = NULL;
- }
+ free(usb_out_buffer);
+ usb_out_buffer = NULL;
- if (usb_in_buffer) {
- free(usb_in_buffer);
- usb_in_buffer = NULL;
- }
+ free(usb_in_buffer);
+ usb_in_buffer = NULL;
- if (pending_scan_results_buffer) {
- free(pending_scan_results_buffer);
- pending_scan_results_buffer = NULL;
- }
+ free(pending_scan_results_buffer);
+ pending_scan_results_buffer = NULL;
- if (opendous_type) {
- free(opendous_type);
- opendous_type = NULL;
- }
+ free(opendous_type);
+ opendous_type = NULL;
return ERROR_OK;
}
{
int result;
- DEBUG_JTAG_IO("0x%02x 0x%02x", command, _data);
+ LOG_DEBUG_IO("0x%02x 0x%02x", command, _data);
usb_out_buffer[0] = 2;
usb_out_buffer[1] = 0;
return ERROR_OK;
}
-int opendous_get_version_info(void)
+static int opendous_get_version_info(void)
{
return ERROR_OK;
}
if (!bits)
tms_buffer[tap_index] = 0;
- tms_buffer[tap_index] |= (_tdi << bits)|(_tms << (bits + 1)) ;
+ tms_buffer[tap_index] |= (_tdi << bits)|(_tms << (bits + 1));
tap_length++;
} else
LOG_ERROR("opendous_tap_append_step, overflow");
void opendous_tap_append_scan(int length, uint8_t *buffer, struct scan_command *command)
{
- DEBUG_JTAG_IO("append scan, length = %d", length);
+ LOG_DEBUG_IO("append scan, length = %d", length);
struct pending_scan_result *pending_scan_result = &pending_scan_results_buffer[pending_scan_results_length];
int i;
/* Copy to buffer */
buf_set_buf(tdo_buffer, first, buffer, 0, length);
- DEBUG_JTAG_IO("pending scan result, length = %d", length);
+ LOG_DEBUG_IO("pending scan result, length = %d", length);
#ifdef _DEBUG_USB_COMMS_
opendous_debug_buffer(buffer, byte_length_out);
return ERROR_JTAG_QUEUE_FAILED;
}
- if (pending_scan_result->buffer != NULL)
- free(pending_scan_result->buffer);
+ free(pending_scan_result->buffer);
}
opendous_tap_init();
{
struct opendous_jtag *result;
- struct jtag_libusb_device_handle *devh;
- if (jtag_libusb_open(opendous_probe->VID, opendous_probe->PID, &devh) != ERROR_OK)
+ struct libusb_device_handle *devh;
+ if (jtag_libusb_open(opendous_probe->VID, opendous_probe->PID, &devh, NULL) != ERROR_OK)
return NULL;
jtag_libusb_set_configuration(devh, 0);
- jtag_libusb_claim_interface(devh, 0);
+ libusb_claim_interface(devh, 0);
result = malloc(sizeof(*result));
result->usb_handle = devh;
}
#ifdef _DEBUG_USB_COMMS_
- LOG_DEBUG("%s: USB write begin", opendous_get_time(time_str));
+ LOG_DEBUG("USB write begin");
#endif
if (opendous_probe->CONTROL_TRANSFER) {
result = jtag_libusb_control_transfer(opendous_jtag->usb_handle,
LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
FUNC_WRITE_DATA, 0, 0, (char *) usb_out_buffer, out_length, OPENDOUS_USB_TIMEOUT);
} else {
- result = jtag_libusb_bulk_write(opendous_jtag->usb_handle, OPENDOUS_WRITE_ENDPOINT, \
- (char *)usb_out_buffer, out_length, OPENDOUS_USB_TIMEOUT);
+ jtag_libusb_bulk_write(opendous_jtag->usb_handle, OPENDOUS_WRITE_ENDPOINT,
+ (char *)usb_out_buffer, out_length, OPENDOUS_USB_TIMEOUT, &result);
}
#ifdef _DEBUG_USB_COMMS_
- LOG_DEBUG("%s: USB write end: %d bytes", opendous_get_time(time_str), result);
+ LOG_DEBUG("USB write end: %d bytes", result);
#endif
- DEBUG_JTAG_IO("opendous_usb_write, out_length = %d, result = %d", out_length, result);
+ LOG_DEBUG_IO("opendous_usb_write, out_length = %d, result = %d", out_length, result);
#ifdef _DEBUG_USB_COMMS_
opendous_debug_buffer(usb_out_buffer, out_length);
int opendous_usb_read(struct opendous_jtag *opendous_jtag)
{
#ifdef _DEBUG_USB_COMMS_
- LOG_DEBUG("%s: USB read begin", opendous_get_time(time_str));
+ LOG_DEBUG("USB read begin");
#endif
int result;
if (opendous_probe->CONTROL_TRANSFER) {
LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
FUNC_READ_DATA, 0, 0, (char *) usb_in_buffer, OPENDOUS_IN_BUFFER_SIZE, OPENDOUS_USB_TIMEOUT);
} else {
- result = jtag_libusb_bulk_read(opendous_jtag->usb_handle, OPENDOUS_READ_ENDPOINT,
- (char *)usb_in_buffer, OPENDOUS_IN_BUFFER_SIZE, OPENDOUS_USB_TIMEOUT);
+ jtag_libusb_bulk_read(opendous_jtag->usb_handle, OPENDOUS_READ_ENDPOINT,
+ (char *)usb_in_buffer, OPENDOUS_IN_BUFFER_SIZE, OPENDOUS_USB_TIMEOUT, &result);
}
#ifdef _DEBUG_USB_COMMS_
- LOG_DEBUG("%s: USB read end: %d bytes", opendous_get_time(time_str), result);
+ LOG_DEBUG("USB read end: %d bytes", result);
#endif
- DEBUG_JTAG_IO("opendous_usb_read, result = %d", result);
+ LOG_DEBUG_IO("opendous_usb_read, result = %d", result);
#ifdef _DEBUG_USB_COMMS_
opendous_debug_buffer(usb_in_buffer, result);
LOG_DEBUG("%s", line);
}
}
-
-char *opendous_get_time(char *str)
-{
- struct timeb timebuffer;
- char *timeline;
-
- ftime(&timebuffer);
- timeline = ctime(&(timebuffer.time));
- snprintf(str, 49, "%.8s.%hu", &timeline[11], timebuffer.millitm);
- return str;
-}
#endif