libusb1_common, ftdi: clarify libusb_open error message
Print a user-friendly message when libusb_open() fails, e.g. Error: libusb_open() failed with LIBUSB_ERROR_ACCESS when there's a permissions problem. Also output a configure warning if libusb older than 1.0.9 is detected. Change-Id: I800f71f06672fe06c0a98a4e469f853b5021bcfe Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-on: http://openocd.zylin.com/1430 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>__archive__
parent
703781c5ab
commit
71ee5f6b5f
11
configure.ac
11
configure.ac
|
@ -1200,9 +1200,14 @@ use_libusb0=no
|
||||||
use_libusb1=no
|
use_libusb1=no
|
||||||
if test $build_usb = yes -o $build_usb_ng = yes; then
|
if test $build_usb = yes -o $build_usb_ng = yes; then
|
||||||
if test $check_libusb0 = no -a $build_usb_ng = yes; then
|
if test $check_libusb0 = no -a $build_usb_ng = yes; then
|
||||||
AC_CHECK_HEADER([libusb-1.0/libusb.h],
|
AC_CHECK_HEADER([libusb-1.0/libusb.h], [
|
||||||
[AC_DEFINE(HAVE_LIBUSB1, 1, [Define if you have libusb-1.0]) check_libusb0=no use_libusb1=yes ],
|
AC_DEFINE(HAVE_LIBUSB1, 1, [Define if you have libusb-1.0])
|
||||||
[ check_libusb0=yes use_libusb1=no ])
|
check_libusb0=no use_libusb1=yes
|
||||||
|
AC_SEARCH_LIBS([libusb_error_name], [usb-1.0],
|
||||||
|
[AC_DEFINE(HAVE_LIBUSB_ERROR_NAME, 1, [Define if your libusb has libusb_error_name()])],
|
||||||
|
[AC_MSG_WARN([libusb-1 older than 1.0.9 detected, consider updating])])
|
||||||
|
], [
|
||||||
|
check_libusb0=yes use_libusb1=no ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test $check_libusb0 = yes -o $build_usb = yes; then
|
if test $check_libusb0 = yes -o $build_usb = yes; then
|
||||||
|
|
|
@ -276,3 +276,45 @@ int win_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct time
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_LIBUSB1 && !defined HAVE_LIBUSB_ERROR_NAME
|
||||||
|
#include <libusb-1.0/libusb.h>
|
||||||
|
/* Verbatim from git://git.libusb.org/libusb.git tag 1.0.9
|
||||||
|
* The libusb_error enum is compatible down to v0.9.1
|
||||||
|
*/
|
||||||
|
const char *libusb_error_name(int error_code)
|
||||||
|
{
|
||||||
|
enum libusb_error error = error_code;
|
||||||
|
switch (error) {
|
||||||
|
case LIBUSB_SUCCESS:
|
||||||
|
return "LIBUSB_SUCCESS";
|
||||||
|
case LIBUSB_ERROR_IO:
|
||||||
|
return "LIBUSB_ERROR_IO";
|
||||||
|
case LIBUSB_ERROR_INVALID_PARAM:
|
||||||
|
return "LIBUSB_ERROR_INVALID_PARAM";
|
||||||
|
case LIBUSB_ERROR_ACCESS:
|
||||||
|
return "LIBUSB_ERROR_ACCESS";
|
||||||
|
case LIBUSB_ERROR_NO_DEVICE:
|
||||||
|
return "LIBUSB_ERROR_NO_DEVICE";
|
||||||
|
case LIBUSB_ERROR_NOT_FOUND:
|
||||||
|
return "LIBUSB_ERROR_NOT_FOUND";
|
||||||
|
case LIBUSB_ERROR_BUSY:
|
||||||
|
return "LIBUSB_ERROR_BUSY";
|
||||||
|
case LIBUSB_ERROR_TIMEOUT:
|
||||||
|
return "LIBUSB_ERROR_TIMEOUT";
|
||||||
|
case LIBUSB_ERROR_OVERFLOW:
|
||||||
|
return "LIBUSB_ERROR_OVERFLOW";
|
||||||
|
case LIBUSB_ERROR_PIPE:
|
||||||
|
return "LIBUSB_ERROR_PIPE";
|
||||||
|
case LIBUSB_ERROR_INTERRUPTED:
|
||||||
|
return "LIBUSB_ERROR_INTERRUPTED";
|
||||||
|
case LIBUSB_ERROR_NO_MEM:
|
||||||
|
return "LIBUSB_ERROR_NO_MEM";
|
||||||
|
case LIBUSB_ERROR_NOT_SUPPORTED:
|
||||||
|
return "LIBUSB_ERROR_NOT_SUPPORTED";
|
||||||
|
case LIBUSB_ERROR_OTHER:
|
||||||
|
return "LIBUSB_ERROR_OTHER";
|
||||||
|
}
|
||||||
|
return "**UNKNOWN**";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -279,4 +279,8 @@ typedef struct {
|
||||||
|
|
||||||
#endif /* HAVE_ELF_H */
|
#endif /* HAVE_ELF_H */
|
||||||
|
|
||||||
|
#if defined HAVE_LIBUSB1 && !defined HAVE_LIBUSB_ERROR_NAME
|
||||||
|
const char *libusb_error_name(int error_code);
|
||||||
|
#endif /* defined HAVE_LIBUSB1 && !defined HAVE_LIBUSB_ERROR_NAME */
|
||||||
|
|
||||||
#endif /* REPLACEMENTS_H */
|
#endif /* REPLACEMENTS_H */
|
||||||
|
|
|
@ -62,8 +62,11 @@ int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[],
|
||||||
/** Free the device list **/
|
/** Free the device list **/
|
||||||
libusb_free_device_list(devs, 1);
|
libusb_free_device_list(devs, 1);
|
||||||
|
|
||||||
if (errCode < 0)
|
if (errCode) {
|
||||||
|
LOG_ERROR("libusb_open() failed with %s",
|
||||||
|
libusb_error_name(errCode));
|
||||||
return errCode;
|
return errCode;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
|
@ -135,7 +135,8 @@ static bool open_matching_device(struct mpsse_ctx *ctx, const uint16_t *vid, con
|
||||||
|
|
||||||
err = libusb_open(device, &ctx->usb_dev);
|
err = libusb_open(device, &ctx->usb_dev);
|
||||||
if (err != LIBUSB_SUCCESS) {
|
if (err != LIBUSB_SUCCESS) {
|
||||||
LOG_ERROR("libusb_open() failed with %d", err);
|
LOG_ERROR("libusb_open() failed with %s",
|
||||||
|
libusb_error_name(err));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue