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>
use_libusb1=no
if test $build_usb = yes -o $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_DEFINE(HAVE_LIBUSB1, 1, [Define if you have libusb-1.0]) check_libusb0=no use_libusb1=yes ],
- [ check_libusb0=yes use_libusb1=no ])
+ 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_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
if test $check_libusb0 = yes -o $build_usb = yes; then
return retcode;
}
#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
#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 */
/** Free the device list **/
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 0;
}
return -ENODEV;
err = libusb_open(device, &ctx->usb_dev);
if (err != LIBUSB_SUCCESS) {
- LOG_ERROR("libusb_open() failed with %d", err);
+ LOG_ERROR("libusb_open() failed with %s",
+ libusb_error_name(err));
continue;
}