libusb: improve compatibility

Specifically, add LIBUSB_CLASS_PHYSICAL and the libusb_has_capability API.
Descriptions and functionality for these derived from the
documentation at [0].  The current set of capabilities are all supported by
libusb.

These were detected as missing after updating net/freerdp to 2.1.1, which
attempted to use both.

[0] http://libusb.sourceforge.net/api-1.0/group__libusb__misc.html

Reviewed by:	hselasky
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D25194
This commit is contained in:
Kyle Evans 2020-06-09 17:17:43 +00:00
parent b62d159cb3
commit 04391da364
4 changed files with 61 additions and 1 deletions

View File

@ -68,6 +68,7 @@ CFLAGS+= -I ../../sys
MLINKS += libusb.3 libusb_get_version.3 MLINKS += libusb.3 libusb_get_version.3
MLINKS += libusb.3 libusb_init.3 MLINKS += libusb.3 libusb_init.3
MLINKS += libusb.3 libusb_exit.3 MLINKS += libusb.3 libusb_exit.3
MLINKS += libusb.3 libusb_has_capability.3
MLINKS += libusb.3 libusb_strerror.3 MLINKS += libusb.3 libusb_strerror.3
MLINKS += libusb.3 libusb_error_name.3 MLINKS += libusb.3 libusb_error_name.3
MLINKS += libusb.3 libusb_set_debug.3 MLINKS += libusb.3 libusb_set_debug.3

View File

@ -26,7 +26,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd October 11, 2018 .Dd June 9, 2020
.Dt LIBUSB 3 .Dt LIBUSB 3
.Os .Os
.Sh NAME .Sh NAME
@ -61,6 +61,33 @@ Deinitialise libusb.
Must be called at the end of the application. Must be called at the end of the application.
Other libusb routines may not be called after this function. Other libusb routines may not be called after this function.
.Pp .Pp
.Ft int
.Fn libusb_has_capability "uint32_t capability"
This function checks the runtime capabilities of
.Nm .
This function will return non-zero if the given
.Fa capability
is supported, 0 if it is not supported.
The valid values for
.Fa capability
are:
.Bl -tag -width LIBUSB_CAP -offset indent
.It Va LIBUSB_CAP_HAS_CAPABILITY
.Nm
supports
.Fn libusb_has_capability .
.It Va LIBUSB_CAP_HAS_HOTPLUG
.Nm
supports hotplug notifications.
.It Va LIBUSB_CAP_HAS_HID_ACCESS
.Nm
can access HID devices without requiring user intervention.
.It Va LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER
.Nm
supports detaching of the default USB driver with
.Fn libusb_detach_kernel_driver .
.El
.Pp
.Ft const char * .Ft const char *
.Fn libusb_strerror "int code" .Fn libusb_strerror "int code"
Get the ASCII representation of the error given by the Get the ASCII representation of the error given by the

View File

@ -54,6 +54,7 @@ enum libusb_class_code {
LIBUSB_CLASS_AUDIO = 1, LIBUSB_CLASS_AUDIO = 1,
LIBUSB_CLASS_COMM = 2, LIBUSB_CLASS_COMM = 2,
LIBUSB_CLASS_HID = 3, LIBUSB_CLASS_HID = 3,
LIBUSB_CLASS_PHYSICAL = 5,
LIBUSB_CLASS_PTP = 6, LIBUSB_CLASS_PTP = 6,
LIBUSB_CLASS_IMAGE = 6, LIBUSB_CLASS_IMAGE = 6,
LIBUSB_CLASS_PRINTER = 7, LIBUSB_CLASS_PRINTER = 7,
@ -178,6 +179,21 @@ enum libusb_bos_type {
LIBUSB_BT_CONTAINER_ID = 4, LIBUSB_BT_CONTAINER_ID = 4,
}; };
enum libusb_capability {
/* libusb supports libusb_has_capability(). */
LIBUSB_CAP_HAS_CAPABILITY = 0,
/* Hotplug support is available. */
LIBUSB_CAP_HAS_HOTPLUG,
/* Can access HID devices without requiring user intervention. */
LIBUSB_CAP_HAS_HID_ACCESS,
/*
* Supports detaching of the default USB driver with
* libusb_detach_kernel_driver().
*/
LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER,
};
enum libusb_error { enum libusb_error {
LIBUSB_SUCCESS = 0, LIBUSB_SUCCESS = 0,
LIBUSB_ERROR_IO = -1, LIBUSB_ERROR_IO = -1,
@ -450,6 +466,7 @@ const char *libusb_strerror(int code);
const char *libusb_error_name(int code); const char *libusb_error_name(int code);
int libusb_init(libusb_context ** context); int libusb_init(libusb_context ** context);
void libusb_exit(struct libusb_context *ctx); void libusb_exit(struct libusb_context *ctx);
int libusb_has_capability(uint32_t capability);
/* Device handling and enumeration */ /* Device handling and enumeration */

View File

@ -1716,3 +1716,18 @@ libusb_error_name(int code)
return ("LIBUSB_ERROR_UNKNOWN"); return ("LIBUSB_ERROR_UNKNOWN");
} }
} }
int
libusb_has_capability(uint32_t capability)
{
switch (capability) {
case LIBUSB_CAP_HAS_CAPABILITY:
case LIBUSB_CAP_HAS_HOTPLUG:
case LIBUSB_CAP_HAS_HID_ACCESS:
case LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER:
return (1);
default:
return (0);
}
}