#include "rlink_st7.h"
#include "rlink_ep1_cmd.h"
#include "rlink_dtc_cmd.h"
-#include "usb_common.h"
+#include "libusb_helper.h"
/* This feature is made useless by running the DTC all the time. When automatic, the LED is on
*whenever the DTC is running. Otherwise, USB messages are sent to turn it on and off. */
#define ST7_PC_TDO ST7_PC_IO9
#define ST7_PA_DBGACK ST7_PA_IO10
-static usb_dev_handle *pHDev;
+static libusb_device_handle *pHDev;
/*
* ep1 commands are up to USB_EP1OUT_SIZE bytes in length.
* This function takes care of zeroing the unused bytes before sending the packet.
* Any reply packet is not handled by this function.
*/
-static int ep1_generic_commandl(usb_dev_handle *pHDev_param, size_t length, ...)
+static int ep1_generic_commandl(libusb_device_handle *pHDev_param, size_t length, ...)
{
uint8_t usb_buffer[USB_EP1OUT_SIZE];
uint8_t *usb_buffer_p;
va_list ap;
int usb_ret;
+ int transferred;
if (length > sizeof(usb_buffer))
length = sizeof(usb_buffer);
sizeof(usb_buffer) - (usb_buffer_p - usb_buffer)
);
- usb_ret = usb_bulk_write(
+ usb_ret = jtag_libusb_bulk_write(
pHDev_param,
USB_EP1OUT_ADDR,
(char *)usb_buffer, sizeof(usb_buffer),
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- return usb_ret;
+ if (usb_ret != ERROR_OK)
+ return usb_ret;
+ return transferred;
}
#if 0
static ssize_t ep1_memory_read(
- usb_dev_handle *pHDev, uint16_t addr,
+ libusb_device_handle *pHDev_param, uint16_t addr,
size_t length, uint8_t *buffer)
{
uint8_t usb_buffer[USB_EP1OUT_SIZE];
int usb_ret;
size_t remain;
ssize_t count;
+ int transferred;
usb_buffer[0] = EP1_CMD_MEMORY_READ;
memset(
usb_buffer[2] = addr;
usb_buffer[3] = length;
- usb_ret = usb_bulk_write(
- pHDev, USB_EP1OUT_ADDR,
- usb_buffer, sizeof(usb_buffer),
- USB_TIMEOUT_MS
+ usb_ret = jtag_libusb_bulk_write(
+ pHDev_param, USB_EP1OUT_ADDR,
+ (char *)usb_buffer, sizeof(usb_buffer),
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_ret < sizeof(usb_buffer))
+ if (usb_ret != ERROR_OK || transferred < (int)sizeof(usb_buffer))
break;
- usb_ret = usb_bulk_read(
- pHDev, USB_EP1IN_ADDR,
- buffer, length,
- USB_TIMEOUT_MS
+ usb_ret = jtag_libusb_bulk_read(
+ pHDev_param, USB_EP1IN_ADDR,
+ (char *)buffer, length,
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_ret < length)
+ if (usb_ret != ERROR_OK || transferred < (int)length)
break;
addr += length;
}
#endif
-static ssize_t ep1_memory_write(usb_dev_handle *pHDev_param, uint16_t addr,
+static ssize_t ep1_memory_write(libusb_device_handle *pHDev_param, uint16_t addr,
size_t length, uint8_t const *buffer)
{
uint8_t usb_buffer[USB_EP1OUT_SIZE];
sizeof(usb_buffer) - 4 - length
);
- usb_ret = usb_bulk_write(
+ int transferred;
+
+ usb_ret = jtag_libusb_bulk_write(
pHDev_param, USB_EP1OUT_ADDR,
(char *)usb_buffer, sizeof(usb_buffer),
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if ((size_t)usb_ret < sizeof(usb_buffer))
+ if (usb_ret != ERROR_OK || transferred < (int)sizeof(usb_buffer))
break;
addr += length;
#if 0
-static ssize_t ep1_memory_writel(usb_dev_handle *pHDev, uint16_t addr,
+static ssize_t ep1_memory_writel(libusb_device_handle *pHDev_param, uint16_t addr,
size_t length, ...)
{
uint8_t buffer[USB_EP1OUT_SIZE - 4];
remain--;
}
- return ep1_memory_write(pHDev, addr, length, buffer);
+ return ep1_memory_write(pHDev_param, addr, length, buffer);
}
#endif
static uint8_t dtc_entry_download;
/* The buffer is specially formatted to represent a valid image to load into the DTC. */
-static int dtc_load_from_buffer(usb_dev_handle *pHDev_param, const uint8_t *buffer,
+static int dtc_load_from_buffer(libusb_device_handle *pHDev_param, const uint8_t *buffer,
size_t length)
{
struct header_s {
{
int usb_err;
uint8_t ep2txr;
+ int transferred;
/* set up for download mode and make sure EP2 is set up to transmit */
usb_err = ep1_generic_commandl(
return usb_err;
/* read back ep2txr */
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)&ep2txr, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_err < 0)
+ if (usb_err != ERROR_OK)
return usb_err;
usb_err = ep1_generic_commandl(
return usb_err;
/* wait for completion */
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)&ep2txr, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
return usb_err;
}
static int dtc_run_download(
- usb_dev_handle *pHDev_param,
+ libusb_device_handle *pHDev_param,
uint8_t *command_buffer,
int command_buffer_size,
uint8_t *reply_buffer,
char dtc_status;
int usb_err;
int i;
+ int transferred;
LOG_DEBUG("%d/%d", command_buffer_size, reply_buffer_size);
- usb_err = usb_bulk_write(
+ usb_err = jtag_libusb_bulk_write(
pHDev_param,
USB_EP2OUT_ADDR,
(char *)command_buffer, USB_EP2BANK_SIZE,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
if (usb_err < 0)
return usb_err;
if (usb_err < 0)
return usb_err;
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev_param,
USB_EP1IN_ADDR,
&dtc_status, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
if (usb_err < 0)
return usb_err;
if (!--i) {
LOG_ERROR("too many retries waiting for DTC status");
- return -ETIMEDOUT;
+ return LIBUSB_ERROR_TIMEOUT;
}
}
if (reply_buffer && reply_buffer_size) {
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev_param,
USB_EP2IN_ADDR,
(char *)reply_buffer, reply_buffer_size,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_err < reply_buffer_size) {
+ if (usb_err != ERROR_OK || transferred < reply_buffer_size) {
LOG_ERROR("Read of endpoint 2 returned %d, expected %d",
usb_err, reply_buffer_size
);
reply_buffer, sizeof(reply_buffer)
);
if (usb_err < 0) {
- LOG_ERROR("dtc_run_download: %s", usb_strerror());
+ LOG_ERROR("dtc_run_download: %s", libusb_error_name(usb_err));
exit(1);
}
{
uint8_t bitmap;
int usb_err;
+ int transferred;
/* Read port A for bit op */
usb_err = ep1_generic_commandl(
1
);
if (usb_err < 0) {
- LOG_ERROR("%s", usb_strerror());
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)&bitmap, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_err < 1) {
- LOG_ERROR("%s", usb_strerror());
+ if (usb_err != ERROR_OK || transferred < 1) {
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
1
);
if (usb_err < 0) {
- LOG_ERROR("%s", usb_strerror());
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)&bitmap, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_err < 1) {
- LOG_ERROR("%s", usb_strerror());
+ if (usb_err != ERROR_OK || transferred < 1) {
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
EP1_CMD_DTC_GET_CACHED_STATUS
);
if (usb_err < 0) {
- LOG_ERROR("%s", usb_strerror());
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
- usb_err = usb_bulk_read(
+ usb_err = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)&bitmap, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
- if (usb_err < 1) {
- LOG_ERROR("%s", usb_strerror());
+ if (usb_err != ERROR_OK || transferred < 1) {
+ LOG_ERROR("%s", libusb_error_name(usb_err));
exit(1);
}
}
exit(1);
}
- if (dtc_start_download() < 0) {
- LOG_ERROR("starting DTC: %s", usb_strerror());
+ int ret = dtc_start_download();
+ if (ret < 0) {
+ LOG_ERROR("starting DTC: %s", libusb_error_name(ret));
exit(1);
}
{
int i, j, retries;
uint8_t reply_buffer[USB_EP1IN_SIZE];
+ int transferred;
- usb_init();
const uint16_t vids[] = { USB_IDVENDOR, 0 };
const uint16_t pids[] = { USB_IDPRODUCT, 0 };
- if (jtag_usb_open(vids, pids, &pHDev) != ERROR_OK)
+ if (jtag_libusb_open(vids, pids, NULL, &pHDev, NULL) != ERROR_OK)
return ERROR_FAIL;
- struct usb_device *dev = usb_device(pHDev);
- if (dev->descriptor.bNumConfigurations > 1) {
+ struct libusb_device_descriptor descriptor;
+ struct libusb_device *usb_dev = libusb_get_device(pHDev);
+ int r = libusb_get_device_descriptor(usb_dev, &descriptor);
+ if (r < 0) {
+ LOG_ERROR("error %d getting device descriptor", r);
+ return ERROR_FAIL;
+ }
+
+ if (descriptor.bNumConfigurations > 1) {
LOG_ERROR("Whoops! NumConfigurations is not 1, don't know what to do...");
return ERROR_FAIL;
}
- if (dev->config->bNumInterfaces > 1) {
+ struct libusb_config_descriptor *config;
+ libusb_get_config_descriptor(usb_dev, 0, &config);
+ if (config->bNumInterfaces > 1) {
LOG_ERROR("Whoops! NumInterfaces is not 1, don't know what to do...");
return ERROR_FAIL;
}
LOG_DEBUG("Opened device, pHDev = %p", pHDev);
/* usb_set_configuration required under win32 */
- usb_set_configuration(pHDev, dev->config[0].bConfigurationValue);
+ libusb_set_configuration(pHDev, config->bConfigurationValue);
retries = 3;
do {
- i = usb_claim_interface(pHDev, 0);
- if (i) {
- LOG_ERROR("usb_claim_interface: %s", usb_strerror());
-#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
- j = usb_detach_kernel_driver_np(pHDev, 0);
- if (j)
- LOG_ERROR("detach kernel driver: %s", usb_strerror());
-#endif
+ i = libusb_claim_interface(pHDev, 0);
+ if (i != LIBUSB_SUCCESS) {
+ LOG_ERROR("usb_claim_interface: %s", libusb_error_name(i));
+ j = libusb_detach_kernel_driver(pHDev, 0);
+ if (j != LIBUSB_SUCCESS)
+ LOG_ERROR("detach kernel driver: %s", libusb_error_name(j));
} else {
LOG_DEBUG("interface claimed!");
break;
}
} while (--retries);
- if (i) {
+ if (i != LIBUSB_SUCCESS) {
LOG_ERROR("Initialisation failed.");
return ERROR_FAIL;
}
- if (usb_set_altinterface(pHDev, 0) != 0) {
+ if (libusb_set_interface_alt_setting(pHDev, 0, 0) != LIBUSB_SUCCESS) {
LOG_ERROR("Failed to set interface.");
return ERROR_FAIL;
}
EP1_CMD_GET_FWREV
);
if (j < USB_EP1OUT_SIZE) {
- LOG_ERROR("USB write error: %s", usb_strerror());
+ LOG_ERROR("USB write error: %s", libusb_error_name(j));
return ERROR_FAIL;
}
- j = usb_bulk_read(
+ j = jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)reply_buffer, sizeof(reply_buffer),
- 200
+ 200,
+ &transferred
);
- if (j != -ETIMEDOUT)
+ if (j != LIBUSB_ERROR_TIMEOUT)
break;
}
- if (j < (int)sizeof(reply_buffer)) {
- LOG_ERROR("USB read error: %s", usb_strerror());
+ if (j != ERROR_OK || transferred != (int)sizeof(reply_buffer)) {
+ LOG_ERROR("USB read error: %s", libusb_error_name(j));
return ERROR_FAIL;
}
LOG_DEBUG(INTERFACE_NAME " firmware version: %d.%d.%d",
ST7_PE_ADAPTER_SENSE_OUT
);
- usb_bulk_read(
+ jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)reply_buffer, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
if ((reply_buffer[0] & ST7_PE_ADAPTER_SENSE_IN) != 0)
0x00 /* OR */
);
- usb_bulk_read(
+ jtag_libusb_bulk_read(
pHDev, USB_EP1IN_ADDR,
(char *)reply_buffer, 1,
- USB_TIMEOUT_MS
+ USB_TIMEOUT_MS,
+ &transferred
);
~0
);
- usb_release_interface(pHDev, 0);
- usb_close(pHDev);
+ libusb_release_interface(pHDev, 0);
+ libusb_close(pHDev);
return ERROR_OK;
}