projects
/
fw
/
openocd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drivers: USB Blaster II: claim interface before using it
[fw/openocd]
/
src
/
jtag
/
drivers
/
usb_blaster
/
ublast2_access_libusb.c
diff --git
a/src/jtag/drivers/usb_blaster/ublast2_access_libusb.c
b/src/jtag/drivers/usb_blaster/ublast2_access_libusb.c
index fb1e4440a5a4aa89ba23daa05e38d6f18b8fad23..82dc95071f625fa7a1d05933eacb1f45cd2121eb 100644
(file)
--- a/
src/jtag/drivers/usb_blaster/ublast2_access_libusb.c
+++ b/
src/jtag/drivers/usb_blaster/ublast2_access_libusb.c
@@
-23,7
+23,7
@@
#endif
#include <jtag/interface.h>
#include <jtag/commands.h>
#endif
#include <jtag/interface.h>
#include <jtag/commands.h>
-#include <libusb_
common
.h>
+#include <libusb_
helper
.h>
#include <target/image.h>
#include "ublast_access.h"
#include <target/image.h>
#include "ublast_access.h"
@@
-45,7
+45,7
@@
static int ublast2_libusb_read(struct ublast_lowlevel *low, uint8_t *buf,
int ret, tmp = 0;
ret = jtag_libusb_bulk_read(low->libusb_dev,
int ret, tmp = 0;
ret = jtag_libusb_bulk_read(low->libusb_dev,
- USBBLASTER_EPIN |
\
+ USBBLASTER_EPIN |
LIBUSB_ENDPOINT_IN,
(char *)buf,
size,
LIBUSB_ENDPOINT_IN,
(char *)buf,
size,
@@
-61,7
+61,7
@@
static int ublast2_libusb_write(struct ublast_lowlevel *low, uint8_t *buf,
int ret, tmp = 0;
ret = jtag_libusb_bulk_write(low->libusb_dev,
int ret, tmp = 0;
ret = jtag_libusb_bulk_write(low->libusb_dev,
- USBBLASTER_EPOUT |
\
+ USBBLASTER_EPOUT |
LIBUSB_ENDPOINT_OUT,
(char *)buf,
size,
LIBUSB_ENDPOINT_OUT,
(char *)buf,
size,
@@
-72,7
+72,7
@@
static int ublast2_libusb_write(struct ublast_lowlevel *low, uint8_t *buf,
}
}
-static int ublast2_write_firmware_section(struct
jtag_
libusb_device_handle *libusb_dev,
+static int ublast2_write_firmware_section(struct libusb_device_handle *libusb_dev,
struct image *firmware_image, int section_index)
{
uint16_t chunk_size;
struct image *firmware_image, int section_index)
{
uint16_t chunk_size;
@@
-106,7
+106,7
@@
static int ublast2_write_firmware_section(struct jtag_libusb_device_handle *libu
chunk_size = bytes_remaining;
jtag_libusb_control_transfer(libusb_dev,
chunk_size = bytes_remaining;
jtag_libusb_control_transfer(libusb_dev,
- LIBUSB_REQUEST_TYPE_VENDOR |
\
+ LIBUSB_REQUEST_TYPE_VENDOR |
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
addr,
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
addr,
@@
-123,7
+123,7
@@
static int ublast2_write_firmware_section(struct jtag_libusb_device_handle *libu
return ERROR_OK;
}
return ERROR_OK;
}
-static int load_usb_blaster_firmware(struct
jtag_
libusb_device_handle *libusb_dev,
+static int load_usb_blaster_firmware(struct libusb_device_handle *libusb_dev,
struct ublast_lowlevel *low)
{
struct image ublast2_firmware_image;
struct ublast_lowlevel *low)
{
struct image ublast2_firmware_image;
@@
-133,8
+133,13
@@
static int load_usb_blaster_firmware(struct jtag_libusb_device_handle *libusb_de
return ERROR_FAIL;
}
return ERROR_FAIL;
}
+ if (libusb_claim_interface(libusb_dev, 0)) {
+ LOG_ERROR("unable to claim interface");
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
ublast2_firmware_image.base_address = 0;
ublast2_firmware_image.base_address = 0;
- ublast2_firmware_image.base_address_set =
0
;
+ ublast2_firmware_image.base_address_set =
false
;
int ret = image_open(&ublast2_firmware_image, low->firmware_path, "ihex");
if (ret != ERROR_OK) {
int ret = image_open(&ublast2_firmware_image, low->firmware_path, "ihex");
if (ret != ERROR_OK) {
@@
-152,7
+157,7
@@
static int load_usb_blaster_firmware(struct jtag_libusb_device_handle *libusb_de
char value = CPU_RESET;
jtag_libusb_control_transfer(libusb_dev,
char value = CPU_RESET;
jtag_libusb_control_transfer(libusb_dev,
- LIBUSB_REQUEST_TYPE_VENDOR |
\
+ LIBUSB_REQUEST_TYPE_VENDOR |
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
EZUSB_CPUCS,
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
EZUSB_CPUCS,
@@
-162,7
+167,7
@@
static int load_usb_blaster_firmware(struct jtag_libusb_device_handle *libusb_de
100);
/* Download all sections in the image to ULINK */
100);
/* Download all sections in the image to ULINK */
- for (int i = 0; i < ublast2_firmware_image.num_sections; i++) {
+ for (
unsigned
int i = 0; i < ublast2_firmware_image.num_sections; i++) {
ret = ublast2_write_firmware_section(libusb_dev,
&ublast2_firmware_image, i);
if (ret != ERROR_OK) {
ret = ublast2_write_firmware_section(libusb_dev,
&ublast2_firmware_image, i);
if (ret != ERROR_OK) {
@@
-173,7
+178,7
@@
static int load_usb_blaster_firmware(struct jtag_libusb_device_handle *libusb_de
value = !CPU_RESET;
jtag_libusb_control_transfer(libusb_dev,
value = !CPU_RESET;
jtag_libusb_control_transfer(libusb_dev,
- LIBUSB_REQUEST_TYPE_VENDOR |
\
+ LIBUSB_REQUEST_TYPE_VENDOR |
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
EZUSB_CPUCS,
LIBUSB_ENDPOINT_OUT,
USBBLASTER_CTRL_LOAD_FIRM,
EZUSB_CPUCS,
@@
-184,6
+189,13
@@
static int load_usb_blaster_firmware(struct jtag_libusb_device_handle *libusb_de
image_close(&ublast2_firmware_image);
image_close(&ublast2_firmware_image);
+ /*
+ * Release claimed interface. Most probably it is already disconnected
+ * and re-enumerated as new devices after firmware upload, so we do
+ * not need to care about errors.
+ */
+ libusb_release_interface(libusb_dev, 0);
+
return ERROR_OK;
}
return ERROR_OK;
}
@@
-191,11
+203,11
@@
static int ublast2_libusb_init(struct ublast_lowlevel *low)
{
const uint16_t vids[] = { low->ublast_vid_uninit, 0 };
const uint16_t pids[] = { low->ublast_pid_uninit, 0 };
{
const uint16_t vids[] = { low->ublast_vid_uninit, 0 };
const uint16_t pids[] = { low->ublast_pid_uninit, 0 };
- struct
jtag_
libusb_device_handle *temp;
+ struct libusb_device_handle *temp;
bool renumeration = false;
int ret;
bool renumeration = false;
int ret;
- if (jtag_libusb_open(vids, pids, NULL, &temp) == ERROR_OK) {
+ if (jtag_libusb_open(vids, pids, NULL, &temp
, NULL
) == ERROR_OK) {
LOG_INFO("Altera USB-Blaster II (uninitialized) found");
LOG_INFO("Loading firmware...");
ret = load_usb_blaster_firmware(temp, low);
LOG_INFO("Altera USB-Blaster II (uninitialized) found");
LOG_INFO("Loading firmware...");
ret = load_usb_blaster_firmware(temp, low);
@@
-209,15
+221,17
@@
static int ublast2_libusb_init(struct ublast_lowlevel *low)
const uint16_t pids_renum[] = { low->ublast_pid, 0 };
if (renumeration == false) {
const uint16_t pids_renum[] = { low->ublast_pid, 0 };
if (renumeration == false) {
- if (jtag_libusb_open(vids_renum, pids_renum, NULL, &low->libusb_dev) != ERROR_OK) {
+ if (jtag_libusb_open(vids_renum, pids_renum, NULL,
+ &low->libusb_dev, NULL) != ERROR_OK) {
LOG_ERROR("Altera USB-Blaster II not found");
return ERROR_FAIL;
}
} else {
int retry = 10;
LOG_ERROR("Altera USB-Blaster II not found");
return ERROR_FAIL;
}
} else {
int retry = 10;
- while (jtag_libusb_open(vids_renum, pids_renum, NULL, &low->libusb_dev) != ERROR_OK && retry--) {
+ while (jtag_libusb_open(vids_renum, pids_renum, NULL,
+ &low->libusb_dev, NULL) != ERROR_OK && retry--) {
usleep(1000000);
usleep(1000000);
- LOG_INFO("Waiting for renumerate...");
+ LOG_INFO("Waiting for re
e
numerate...");
}
if (!retry) {
}
if (!retry) {
@@
-226,9
+240,15
@@
static int ublast2_libusb_init(struct ublast_lowlevel *low)
}
}
}
}
+ if (libusb_claim_interface(low->libusb_dev, 0)) {
+ LOG_ERROR("unable to claim interface");
+ jtag_libusb_close(low->libusb_dev);
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
char buffer[5];
jtag_libusb_control_transfer(low->libusb_dev,
char buffer[5];
jtag_libusb_control_transfer(low->libusb_dev,
- LIBUSB_REQUEST_TYPE_VENDOR |
\
+ LIBUSB_REQUEST_TYPE_VENDOR |
LIBUSB_ENDPOINT_IN,
USBBLASTER_CTRL_READ_REV,
0,
LIBUSB_ENDPOINT_IN,
USBBLASTER_CTRL_READ_REV,
0,
@@
-244,6
+264,9
@@
static int ublast2_libusb_init(struct ublast_lowlevel *low)
static int ublast2_libusb_quit(struct ublast_lowlevel *low)
{
static int ublast2_libusb_quit(struct ublast_lowlevel *low)
{
+ if (libusb_release_interface(low->libusb_dev, 0))
+ LOG_ERROR("usb release interface failed");
+
jtag_libusb_close(low->libusb_dev);
return ERROR_OK;
};
jtag_libusb_close(low->libusb_dev);
return ERROR_OK;
};