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__
Paul Fertser 2013-05-31 14:57:56 +04:00 committed by Spencer Oliver
parent 703781c5ab
commit 71ee5f6b5f
5 changed files with 60 additions and 5 deletions

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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;

View File

@ -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;
} }