From 4ff0713e5980cb10b10083737e2dc9e9694c196b Mon Sep 17 00:00:00 2001 From: Oscar Bailey Date: Wed, 12 Dec 2018 15:37:31 +0000 Subject: [PATCH] Add Windows support to xmosdfu Needs WinUSB drivers installed on interface 0. --- lib_xua/host/xmosdfu/Makefile.Win32 | 28 + lib_xua/host/xmosdfu/libusb-1.0.dll | Bin 0 -> 125440 bytes .../host/xmosdfu/libusb/Win32/libusb-1.0.lib | Bin 0 -> 49464 bytes lib_xua/host/xmosdfu/libusb/Win32/libusb.h | 2039 +++++++++++++++++ lib_xua/host/xmosdfu/xmosdfu.cpp | 14 +- 5 files changed, 2079 insertions(+), 2 deletions(-) create mode 100644 lib_xua/host/xmosdfu/Makefile.Win32 create mode 100644 lib_xua/host/xmosdfu/libusb-1.0.dll create mode 100644 lib_xua/host/xmosdfu/libusb/Win32/libusb-1.0.lib create mode 100644 lib_xua/host/xmosdfu/libusb/Win32/libusb.h diff --git a/lib_xua/host/xmosdfu/Makefile.Win32 b/lib_xua/host/xmosdfu/Makefile.Win32 new file mode 100644 index 00000000..9ab2fc40 --- /dev/null +++ b/lib_xua/host/xmosdfu/Makefile.Win32 @@ -0,0 +1,28 @@ +# Build tested with Visual Studio 2017 command prompt +# +# Run: nmake /f Makefile.Win32 + +COMMON_FLAGS = \ + /D BECLEAR_HOST=1 \ + /I libusb\Win32 \ + /nologo \ + /W4 \ + /WX- \ + /O2 \ + /EHa \ + /D _CRT_SECURE_NO_WARNINGS \ + xmosdfu.cpp \ + +all: xmosdfu + +xmosdfu: + if not exist bin mkdir bin + CL.exe \ + $(COMMON_FLAGS) \ + /Fe"bin\xmosdfu.exe" \ + /link "libusb\Win32\libusb-1.0.lib"" + copy libusb-1.0.dll bin + del *.obj + +clean: + rmdir /s /q bin diff --git a/lib_xua/host/xmosdfu/libusb-1.0.dll b/lib_xua/host/xmosdfu/libusb-1.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..d58c4be3268a6eaf83239232bd868e143a68bba1 GIT binary patch literal 125440 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 literal 0 HcmV?d00001 diff --git a/lib_xua/host/xmosdfu/libusb/Win32/libusb-1.0.lib b/lib_xua/host/xmosdfu/libusb/Win32/libusb-1.0.lib new file mode 100644 index 0000000000000000000000000000000000000000..760f13d190da2accdde27fc72e5999a13043ad57 GIT binary patch literal 49464 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 + * Copyright © 2007-2008 Daniel Drake + * Copyright © 2012 Pete Batard + * Copyright © 2012 Nathan Hjelm + * For more information, please visit: http://libusb.info + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_H +#define LIBUSB_H + +#ifdef _MSC_VER +/* on MS environments, the inline keyword is available in C++ only */ +#if !defined(__cplusplus) +#define inline __inline +#endif +/* ssize_t is also not available (copy/paste from MinGW) */ +#ifndef _SSIZE_T_DEFINED +#define _SSIZE_T_DEFINED +#undef ssize_t +#ifdef _WIN64 + typedef __int64 ssize_t; +#else + typedef int ssize_t; +#endif /* _WIN64 */ +#endif /* _SSIZE_T_DEFINED */ +#endif /* _MSC_VER */ + +/* stdint.h is not available on older MSVC */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#else +#include +#endif + +#if !defined(_WIN32_WCE) +#include +#endif + +#if defined(__linux__) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__) +#include +#endif + +#include +#include + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#define ZERO_SIZED_ARRAY /* [] - valid C99 code */ +#else +#define ZERO_SIZED_ARRAY 0 /* [0] - non-standard, but usually working code */ +#endif + +/* 'interface' might be defined as a macro on Windows, so we need to + * undefine it so as not to break the current libusb API, because + * libusb_config_descriptor has an 'interface' member + * As this can be problematic if you include windows.h after libusb.h + * in your sources, we force windows.h to be included first. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#include +#if defined(interface) +#undef interface +#endif +#if !defined(__CYGWIN__) +#include +#endif +#endif + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define LIBUSB_DEPRECATED_FOR(f) \ + __attribute__((deprecated("Use " #f " instead"))) +#elif __GNUC__ >= 3 +#define LIBUSB_DEPRECATED_FOR(f) __attribute__((deprecated)) +#else +#define LIBUSB_DEPRECATED_FOR(f) +#endif /* __GNUC__ */ + +/** \def LIBUSB_CALL + * \ingroup libusb_misc + * libusb's Windows calling convention. + * + * Under Windows, the selection of available compilers and configurations + * means that, unlike other platforms, there is not one true calling + * convention (calling convention: the manner in which parameters are + * passed to functions in the generated assembly code). + * + * Matching the Windows API itself, libusb uses the WINAPI convention (which + * translates to the stdcall convention) and guarantees that the + * library is compiled in this way. The public header file also includes + * appropriate annotations so that your own software will use the right + * convention, even if another convention is being used by default within + * your codebase. + * + * The one consideration that you must apply in your software is to mark + * all functions which you use as libusb callbacks with this LIBUSB_CALL + * annotation, so that they too get compiled for the correct calling + * convention. + * + * On non-Windows operating systems, this macro is defined as nothing. This + * means that you can apply it to your code without worrying about + * cross-platform compatibility. + */ +/* LIBUSB_CALL must be defined on both definition and declaration of libusb + * functions. You'd think that declaration would be enough, but cygwin will + * complain about conflicting types unless both are marked this way. + * The placement of this macro is important too; it must appear after the + * return type, before the function name. See internal documentation for + * API_EXPORTED. + */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#define LIBUSB_CALL WINAPI +#else +#define LIBUSB_CALL +#endif + +/** \def LIBUSB_API_VERSION + * \ingroup libusb_misc + * libusb's API version. + * + * Since version 1.0.13, to help with feature detection, libusb defines + * a LIBUSB_API_VERSION macro that gets increased every time there is a + * significant change to the API, such as the introduction of a new call, + * the definition of a new macro/enum member, or any other element that + * libusb applications may want to detect at compilation time. + * + * The macro is typically used in an application as follows: + * \code + * #if defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01001234) + * // Use one of the newer features from the libusb API + * #endif + * \endcode + * + * Internally, LIBUSB_API_VERSION is defined as follows: + * (libusb major << 24) | (libusb minor << 16) | (16 bit incremental) + */ +#define LIBUSB_API_VERSION 0x01000106 + +/* The following is kept for compatibility, but will be deprecated in the future */ +#define LIBUSBX_API_VERSION LIBUSB_API_VERSION + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup libusb_misc + * Convert a 16-bit value from host-endian to little-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the host-endian value to convert + * \returns the value in little-endian byte order + */ +static inline uint16_t libusb_cpu_to_le16(const uint16_t x) +{ + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + _tmp.b8[1] = (uint8_t) (x >> 8); + _tmp.b8[0] = (uint8_t) (x & 0xff); + return _tmp.b16; +} + +/** \def libusb_le16_to_cpu + * \ingroup libusb_misc + * Convert a 16-bit value from little-endian to host-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the little-endian value to convert + * \returns the value in host-endian byte order + */ +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +/* standard USB stuff */ + +/** \ingroup libusb_desc + * Device and/or Interface Class codes */ +enum libusb_class_code { + /** In the context of a \ref libusb_device_descriptor "device descriptor", + * this bDeviceClass value indicates that each interface specifies its + * own class information and all interfaces operate independently. + */ + LIBUSB_CLASS_PER_INTERFACE = 0, + + /** Audio class */ + LIBUSB_CLASS_AUDIO = 1, + + /** Communications class */ + LIBUSB_CLASS_COMM = 2, + + /** Human Interface Device class */ + LIBUSB_CLASS_HID = 3, + + /** Physical */ + LIBUSB_CLASS_PHYSICAL = 5, + + /** Printer class */ + LIBUSB_CLASS_PRINTER = 7, + + /** Image class */ + LIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ + LIBUSB_CLASS_IMAGE = 6, + + /** Mass storage class */ + LIBUSB_CLASS_MASS_STORAGE = 8, + + /** Hub class */ + LIBUSB_CLASS_HUB = 9, + + /** Data class */ + LIBUSB_CLASS_DATA = 10, + + /** Smart Card */ + LIBUSB_CLASS_SMART_CARD = 0x0b, + + /** Content Security */ + LIBUSB_CLASS_CONTENT_SECURITY = 0x0d, + + /** Video */ + LIBUSB_CLASS_VIDEO = 0x0e, + + /** Personal Healthcare */ + LIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f, + + /** Diagnostic Device */ + LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, + + /** Wireless class */ + LIBUSB_CLASS_WIRELESS = 0xe0, + + /** Application class */ + LIBUSB_CLASS_APPLICATION = 0xfe, + + /** Class is vendor-specific */ + LIBUSB_CLASS_VENDOR_SPEC = 0xff +}; + +/** \ingroup libusb_desc + * Descriptor types as defined by the USB specification. */ +enum libusb_descriptor_type { + /** Device descriptor. See libusb_device_descriptor. */ + LIBUSB_DT_DEVICE = 0x01, + + /** Configuration descriptor. See libusb_config_descriptor. */ + LIBUSB_DT_CONFIG = 0x02, + + /** String descriptor */ + LIBUSB_DT_STRING = 0x03, + + /** Interface descriptor. See libusb_interface_descriptor. */ + LIBUSB_DT_INTERFACE = 0x04, + + /** Endpoint descriptor. See libusb_endpoint_descriptor. */ + LIBUSB_DT_ENDPOINT = 0x05, + + /** BOS descriptor */ + LIBUSB_DT_BOS = 0x0f, + + /** Device Capability descriptor */ + LIBUSB_DT_DEVICE_CAPABILITY = 0x10, + + /** HID descriptor */ + LIBUSB_DT_HID = 0x21, + + /** HID report descriptor */ + LIBUSB_DT_REPORT = 0x22, + + /** Physical descriptor */ + LIBUSB_DT_PHYSICAL = 0x23, + + /** Hub descriptor */ + LIBUSB_DT_HUB = 0x29, + + /** SuperSpeed Hub descriptor */ + LIBUSB_DT_SUPERSPEED_HUB = 0x2a, + + /** SuperSpeed Endpoint Companion descriptor */ + LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30 +}; + +/* Descriptor sizes per descriptor type */ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 +#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 +#define LIBUSB_DT_BOS_SIZE 5 +#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE 3 + +/* BOS descriptor sizes */ +#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE 7 +#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE 10 +#define LIBUSB_BT_CONTAINER_ID_SIZE 20 + +/* We unwrap the BOS => define its max size */ +#define LIBUSB_DT_BOS_MAX_SIZE ((LIBUSB_DT_BOS_SIZE) +\ + (LIBUSB_BT_USB_2_0_EXTENSION_SIZE) +\ + (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) +\ + (LIBUSB_BT_CONTAINER_ID_SIZE)) + +#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define LIBUSB_ENDPOINT_DIR_MASK 0x80 + +/** \ingroup libusb_desc + * Endpoint direction. Values for bit 7 of the + * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. + */ +enum libusb_endpoint_direction { + /** In: device-to-host */ + LIBUSB_ENDPOINT_IN = 0x80, + + /** Out: host-to-device */ + LIBUSB_ENDPOINT_OUT = 0x00 +}; + +#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ + +/** \ingroup libusb_desc + * Endpoint transfer type. Values for bits 0:1 of the + * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. + */ +enum libusb_transfer_type { + /** Control endpoint */ + LIBUSB_TRANSFER_TYPE_CONTROL = 0, + + /** Isochronous endpoint */ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, + + /** Bulk endpoint */ + LIBUSB_TRANSFER_TYPE_BULK = 2, + + /** Interrupt endpoint */ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3, + + /** Stream endpoint */ + LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4, +}; + +/** \ingroup libusb_misc + * Standard requests, as defined in table 9-5 of the USB 3.0 specifications */ +enum libusb_standard_request { + /** Request status of the specific recipient */ + LIBUSB_REQUEST_GET_STATUS = 0x00, + + /** Clear or disable a specific feature */ + LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, + + /* 0x02 is reserved */ + + /** Set or enable a specific feature */ + LIBUSB_REQUEST_SET_FEATURE = 0x03, + + /* 0x04 is reserved */ + + /** Set device address for all future accesses */ + LIBUSB_REQUEST_SET_ADDRESS = 0x05, + + /** Get the specified descriptor */ + LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, + + /** Used to update existing descriptors or add new descriptors */ + LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, + + /** Get the current device configuration value */ + LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, + + /** Set device configuration */ + LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, + + /** Return the selected alternate setting for the specified interface */ + LIBUSB_REQUEST_GET_INTERFACE = 0x0A, + + /** Select an alternate interface for the specified interface */ + LIBUSB_REQUEST_SET_INTERFACE = 0x0B, + + /** Set then report an endpoint's synchronization frame */ + LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, + + /** Sets both the U1 and U2 Exit Latency */ + LIBUSB_REQUEST_SET_SEL = 0x30, + + /** Delay from the time a host transmits a packet to the time it is + * received by the device. */ + LIBUSB_SET_ISOCH_DELAY = 0x31, +}; + +/** \ingroup libusb_misc + * Request type bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. */ +enum libusb_request_type { + /** Standard */ + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + + /** Class */ + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + + /** Vendor */ + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + + /** Reserved */ + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) +}; + +/** \ingroup libusb_misc + * Recipient bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. Values 4 through 31 are reserved. */ +enum libusb_request_recipient { + /** Device */ + LIBUSB_RECIPIENT_DEVICE = 0x00, + + /** Interface */ + LIBUSB_RECIPIENT_INTERFACE = 0x01, + + /** Endpoint */ + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + + /** Other */ + LIBUSB_RECIPIENT_OTHER = 0x03, +}; + +#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C + +/** \ingroup libusb_desc + * Synchronization type for isochronous endpoints. Values for bits 2:3 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_sync_type { + /** No synchronization */ + LIBUSB_ISO_SYNC_TYPE_NONE = 0, + + /** Asynchronous */ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, + + /** Adaptive */ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, + + /** Synchronous */ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +}; + +#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 + +/** \ingroup libusb_desc + * Usage type for isochronous endpoints. Values for bits 4:5 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_usage_type { + /** Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_DATA = 0, + + /** Feedback endpoint */ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, + + /** Implicit feedback Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB device descriptor. This + * descriptor is documented in section 9.6.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_device_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this + * context. */ + uint8_t bDescriptorType; + + /** USB specification release number in binary-coded decimal. A value of + * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ + uint16_t bcdUSB; + + /** USB-IF class code for the device. See \ref libusb_class_code. */ + uint8_t bDeviceClass; + + /** USB-IF subclass code for the device, qualified by the bDeviceClass + * value */ + uint8_t bDeviceSubClass; + + /** USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values */ + uint8_t bDeviceProtocol; + + /** Maximum packet size for endpoint 0 */ + uint8_t bMaxPacketSize0; + + /** USB-IF vendor ID */ + uint16_t idVendor; + + /** USB-IF product ID */ + uint16_t idProduct; + + /** Device release number in binary-coded decimal */ + uint16_t bcdDevice; + + /** Index of string descriptor describing manufacturer */ + uint8_t iManufacturer; + + /** Index of string descriptor describing product */ + uint8_t iProduct; + + /** Index of string descriptor containing device serial number */ + uint8_t iSerialNumber; + + /** Number of possible configurations */ + uint8_t bNumConfigurations; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB endpoint descriptor. This + * descriptor is documented in section 9.6.6 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_endpoint_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in + * this context. */ + uint8_t bDescriptorType; + + /** The address of the endpoint described by this descriptor. Bits 0:3 are + * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, + * see \ref libusb_endpoint_direction. + */ + uint8_t bEndpointAddress; + + /** Attributes which apply to the endpoint when it is configured using + * the bConfigurationValue. Bits 0:1 determine the transfer type and + * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for + * isochronous endpoints and correspond to \ref libusb_iso_sync_type. + * Bits 4:5 are also only used for isochronous endpoints and correspond to + * \ref libusb_iso_usage_type. Bits 6:7 are reserved. + */ + uint8_t bmAttributes; + + /** Maximum packet size this endpoint is capable of sending/receiving. */ + uint16_t wMaxPacketSize; + + /** Interval for polling endpoint for data transfers. */ + uint8_t bInterval; + + /** For audio devices only: the rate at which synchronization feedback + * is provided. */ + uint8_t bRefresh; + + /** For audio devices only: the address if the synch endpoint */ + uint8_t bSynchAddress; + + /** Extra descriptors. If libusb encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB interface descriptor. This + * descriptor is documented in section 9.6.5 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_interface_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE + * in this context. */ + uint8_t bDescriptorType; + + /** Number of this interface */ + uint8_t bInterfaceNumber; + + /** Value used to select this alternate setting for this interface */ + uint8_t bAlternateSetting; + + /** Number of endpoints used by this interface (excluding the control + * endpoint). */ + uint8_t bNumEndpoints; + + /** USB-IF class code for this interface. See \ref libusb_class_code. */ + uint8_t bInterfaceClass; + + /** USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value */ + uint8_t bInterfaceSubClass; + + /** USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values */ + uint8_t bInterfaceProtocol; + + /** Index of string descriptor describing this interface */ + uint8_t iInterface; + + /** Array of endpoint descriptors. This length of this array is determined + * by the bNumEndpoints field. */ + const struct libusb_endpoint_descriptor *endpoint; + + /** Extra descriptors. If libusb encounters unknown interface descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A collection of alternate settings for a particular USB interface. + */ +struct libusb_interface { + /** Array of interface descriptors. The length of this array is determined + * by the num_altsetting field. */ + const struct libusb_interface_descriptor *altsetting; + + /** The number of alternate settings that belong to this interface */ + int num_altsetting; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB configuration descriptor. This + * descriptor is documented in section 9.6.3 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_config_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG + * in this context. */ + uint8_t bDescriptorType; + + /** Total length of data returned for this configuration */ + uint16_t wTotalLength; + + /** Number of interfaces supported by this configuration */ + uint8_t bNumInterfaces; + + /** Identifier value for this configuration */ + uint8_t bConfigurationValue; + + /** Index of string descriptor describing this configuration */ + uint8_t iConfiguration; + + /** Configuration characteristics */ + uint8_t bmAttributes; + + /** Maximum power consumption of the USB device from this bus in this + * configuration when the device is fully operation. Expressed in units + * of 2 mA when the device is operating in high-speed mode and in units + * of 8 mA when the device is operating in super-speed mode. */ + uint8_t MaxPower; + + /** Array of interfaces supported by this configuration. The length of + * this array is determined by the bNumInterfaces field. */ + const struct libusb_interface *interface; + + /** Extra descriptors. If libusb encounters unknown configuration + * descriptors, it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A structure representing the superspeed endpoint companion + * descriptor. This descriptor is documented in section 9.6.7 of + * the USB 3.0 specification. All multiple-byte fields are represented in + * host-endian format. + */ +struct libusb_ss_endpoint_companion_descriptor { + + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_SS_ENDPOINT_COMPANION in + * this context. */ + uint8_t bDescriptorType; + + + /** The maximum number of packets the endpoint can send or + * receive as part of a burst. */ + uint8_t bMaxBurst; + + /** In bulk EP: bits 4:0 represents the maximum number of + * streams the EP supports. In isochronous EP: bits 1:0 + * represents the Mult - a zero based value that determines + * the maximum number of packets within a service interval */ + uint8_t bmAttributes; + + /** The total number of bytes this EP will transfer every + * service interval. valid only for periodic EPs. */ + uint16_t wBytesPerInterval; +}; + +/** \ingroup libusb_desc + * A generic representation of a BOS Device Capability descriptor. It is + * advised to check bDevCapabilityType and call the matching + * libusb_get_*_descriptor function to get a structure fully matching the type. + */ +struct libusb_bos_dev_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + /** Device Capability type */ + uint8_t bDevCapabilityType; + /** Device Capability data (bLength - 3 bytes) */ + uint8_t dev_capability_data[ZERO_SIZED_ARRAY]; +}; + +/** \ingroup libusb_desc + * A structure representing the Binary Device Object Store (BOS) descriptor. + * This descriptor is documented in section 9.6.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_bos_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_BOS LIBUSB_DT_BOS + * in this context. */ + uint8_t bDescriptorType; + + /** Length of this descriptor and all of its sub descriptors */ + uint16_t wTotalLength; + + /** The number of separate device capability descriptors in + * the BOS */ + uint8_t bNumDeviceCaps; + + /** bNumDeviceCap Device Capability Descriptors */ + struct libusb_bos_dev_capability_descriptor *dev_capability[ZERO_SIZED_ARRAY]; +}; + +/** \ingroup libusb_desc + * A structure representing the USB 2.0 Extension descriptor + * This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_usb_2_0_extension_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION + * LIBUSB_BT_USB_2_0_EXTENSION in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_usb_2_0_extension_attributes. */ + uint32_t bmAttributes; +}; + +/** \ingroup libusb_desc + * A structure representing the SuperSpeed USB Device Capability descriptor + * This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_ss_usb_device_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_ss_usb_device_capability_attributes. */ + uint8_t bmAttributes; + + /** Bitmap encoding of the speed supported by this device when + * operating in SuperSpeed mode. See \ref libusb_supported_speed. */ + uint16_t wSpeedSupported; + + /** The lowest speed at which all the functionality supported + * by the device is available to the user. For example if the + * device supports all its functionality when connected at + * full speed and above then it sets this value to 1. */ + uint8_t bFunctionalitySupport; + + /** U1 Device Exit Latency. */ + uint8_t bU1DevExitLat; + + /** U2 Device Exit Latency. */ + uint16_t bU2DevExitLat; +}; + +/** \ingroup libusb_desc + * A structure representing the Container ID descriptor. + * This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification. + * All multiple-byte fields, except UUIDs, are represented in host-endian format. + */ +struct libusb_container_id_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID + * LIBUSB_BT_CONTAINER_ID in this context. */ + uint8_t bDevCapabilityType; + + /** Reserved field */ + uint8_t bReserved; + + /** 128 bit UUID */ + uint8_t ContainerID[16]; +}; + +/** \ingroup libusb_asyncio + * Setup packet for control transfers. */ +struct libusb_control_setup { + /** Request type. Bits 0:4 determine recipient, see + * \ref libusb_request_recipient. Bits 5:6 determine type, see + * \ref libusb_request_type. Bit 7 determines data transfer direction, see + * \ref libusb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref libusb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +}; + +#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) + +/* libusb */ + +struct libusb_context; +struct libusb_device; +struct libusb_device_handle; + +/** \ingroup libusb_lib + * Structure providing the version of the libusb runtime + */ +struct libusb_version { + /** Library major version. */ + const uint16_t major; + + /** Library minor version. */ + const uint16_t minor; + + /** Library micro version. */ + const uint16_t micro; + + /** Library nano version. */ + const uint16_t nano; + + /** Library release candidate suffix string, e.g. "-rc4". */ + const char *rc; + + /** For ABI compatibility only. */ + const char* describe; +}; + +/** \ingroup libusb_lib + * Structure representing a libusb session. The concept of individual libusb + * sessions allows for your program to use two libraries (or dynamically + * load two modules) which both independently use libusb. This will prevent + * interference between the individual libusb users - for example + * libusb_set_option() will not affect the other user of the library, and + * libusb_exit() will not destroy resources that the other user is still + * using. + * + * Sessions are created by libusb_init() and destroyed through libusb_exit(). + * If your application is guaranteed to only ever include a single libusb + * user (i.e. you), you do not have to worry about contexts: pass NULL in + * every function call where a context is required. The default context + * will be used. + * + * For more information, see \ref libusb_contexts. + */ +typedef struct libusb_context libusb_context; + +/** \ingroup libusb_dev + * Structure representing a USB device detected on the system. This is an + * opaque type for which you are only ever provided with a pointer, usually + * originating from libusb_get_device_list(). + * + * Certain operations can be performed on a device, but in order to do any + * I/O you will have to first obtain a device handle using libusb_open(). + * + * Devices are reference counted with libusb_ref_device() and + * libusb_unref_device(), and are freed when the reference count reaches 0. + * New devices presented by libusb_get_device_list() have a reference count of + * 1, and libusb_free_device_list() can optionally decrease the reference count + * on all devices in the list. libusb_open() adds another reference which is + * later destroyed by libusb_close(). + */ +typedef struct libusb_device libusb_device; + + +/** \ingroup libusb_dev + * Structure representing a handle on a USB device. This is an opaque type for + * which you are only ever provided with a pointer, usually originating from + * libusb_open(). + * + * A device handle is used to perform I/O and other operations. When finished + * with a device handle, you should call libusb_close(). + */ +typedef struct libusb_device_handle libusb_device_handle; + +/** \ingroup libusb_dev + * Speed codes. Indicates the speed at which the device is operating. + */ +enum libusb_speed { + /** The OS doesn't report or know the device speed. */ + LIBUSB_SPEED_UNKNOWN = 0, + + /** The device is operating at low speed (1.5MBit/s). */ + LIBUSB_SPEED_LOW = 1, + + /** The device is operating at full speed (12MBit/s). */ + LIBUSB_SPEED_FULL = 2, + + /** The device is operating at high speed (480MBit/s). */ + LIBUSB_SPEED_HIGH = 3, + + /** The device is operating at super speed (5000MBit/s). */ + LIBUSB_SPEED_SUPER = 4, + + /** The device is operating at super speed plus (10000MBit/s). */ + LIBUSB_SPEED_SUPER_PLUS = 5, +}; + +/** \ingroup libusb_dev + * Supported speeds (wSpeedSupported) bitfield. Indicates what + * speeds the device supports. + */ +enum libusb_supported_speed { + /** Low speed operation supported (1.5MBit/s). */ + LIBUSB_LOW_SPEED_OPERATION = 1, + + /** Full speed operation supported (12MBit/s). */ + LIBUSB_FULL_SPEED_OPERATION = 2, + + /** High speed operation supported (480MBit/s). */ + LIBUSB_HIGH_SPEED_OPERATION = 4, + + /** Superspeed operation supported (5000MBit/s). */ + LIBUSB_SUPER_SPEED_OPERATION = 8, +}; + +/** \ingroup libusb_dev + * Masks for the bits of the + * \ref libusb_usb_2_0_extension_descriptor::bmAttributes "bmAttributes" field + * of the USB 2.0 Extension descriptor. + */ +enum libusb_usb_2_0_extension_attributes { + /** Supports Link Power Management (LPM) */ + LIBUSB_BM_LPM_SUPPORT = 2, +}; + +/** \ingroup libusb_dev + * Masks for the bits of the + * \ref libusb_ss_usb_device_capability_descriptor::bmAttributes "bmAttributes" field + * field of the SuperSpeed USB Device Capability descriptor. + */ +enum libusb_ss_usb_device_capability_attributes { + /** Supports Latency Tolerance Messages (LTM) */ + LIBUSB_BM_LTM_SUPPORT = 2, +}; + +/** \ingroup libusb_dev + * USB capability types + */ +enum libusb_bos_type { + /** Wireless USB device capability */ + LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY = 1, + + /** USB 2.0 extensions */ + LIBUSB_BT_USB_2_0_EXTENSION = 2, + + /** SuperSpeed USB device capability */ + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY = 3, + + /** Container ID type */ + LIBUSB_BT_CONTAINER_ID = 4, +}; + +/** \ingroup libusb_misc + * Error codes. Most libusb functions return 0 on success or one of these + * codes on failure. + * You can call libusb_error_name() to retrieve a string representation of an + * error code or libusb_strerror() to get an end-user suitable description of + * an error code. + */ +enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the + message strings in strerror.c when adding new error codes here. */ + + /** Other error */ + LIBUSB_ERROR_OTHER = -99, +}; + +/* Total number of error codes in enum libusb_error */ +#define LIBUSB_ERROR_COUNT 14 + +/** \ingroup libusb_asyncio + * Transfer status codes */ +enum libusb_transfer_status { + /** Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. */ + LIBUSB_TRANSFER_COMPLETED, + + /** Transfer failed */ + LIBUSB_TRANSFER_ERROR, + + /** Transfer timed out */ + LIBUSB_TRANSFER_TIMED_OUT, + + /** Transfer was cancelled */ + LIBUSB_TRANSFER_CANCELLED, + + /** For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. */ + LIBUSB_TRANSFER_STALL, + + /** Device was disconnected */ + LIBUSB_TRANSFER_NO_DEVICE, + + /** Device sent more data than requested */ + LIBUSB_TRANSFER_OVERFLOW, + + /* NB! Remember to update libusb_error_name() + when adding new status codes here. */ +}; + +/** \ingroup libusb_asyncio + * libusb_transfer.flags values */ +enum libusb_transfer_flags { + /** Report short frames as errors */ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, + + /** Automatically free() transfer buffer during libusb_free_transfer(). + * Note that buffers allocated with libusb_dev_mem_alloc() should not + * be attempted freed in this way, since free() is not an appropriate + * way to release such memory. */ + LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, + + /** Automatically call libusb_free_transfer() after callback returns. + * If this flag is set, it is illegal to call libusb_free_transfer() + * from your transfer callback, as this will result in a double-free + * when this flag is acted upon. */ + LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2, + + /** Terminate transfers that are a multiple of the endpoint's + * wMaxPacketSize with an extra zero length packet. This is useful + * when a device protocol mandates that each logical request is + * terminated by an incomplete packet (i.e. the logical requests are + * not separated by other means). + * + * This flag only affects host-to-device transfers to bulk and interrupt + * endpoints. In other situations, it is ignored. + * + * This flag only affects transfers with a length that is a multiple of + * the endpoint's wMaxPacketSize. On transfers of other lengths, this + * flag has no effect. Therefore, if you are working with a device that + * needs a ZLP whenever the end of the logical request falls on a packet + * boundary, then it is sensible to set this flag on every + * transfer (you do not have to worry about only setting it on transfers + * that end on the boundary). + * + * This flag is currently only supported on Linux. + * On other systems, libusb_submit_transfer() will return + * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set. + * + * Available since libusb-1.0.9. + */ + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, +}; + +/** \ingroup libusb_asyncio + * Isochronous packet descriptor. */ +struct libusb_iso_packet_descriptor { + /** Length of data to request in this packet */ + unsigned int length; + + /** Amount of data that was actually transferred */ + unsigned int actual_length; + + /** Status code for this packet */ + enum libusb_transfer_status status; +}; + +struct libusb_transfer; + +/** \ingroup libusb_asyncio + * Asynchronous transfer callback function type. When submitting asynchronous + * transfers, you pass a pointer to a callback function of this type via the + * \ref libusb_transfer::callback "callback" member of the libusb_transfer + * structure. libusb will call this function later, when the transfer has + * completed or failed. See \ref libusb_asyncio for more information. + * \param transfer The libusb_transfer struct the callback function is being + * notified about. + */ +typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); + +/** \ingroup libusb_asyncio + * The generic USB transfer structure. The user populates this structure and + * then submits it in order to request a transfer. After the transfer has + * completed, the library populates the transfer with the results and passes + * it back to the user. + */ +struct libusb_transfer { + /** Handle of the device that this transfer will be submitted to */ + libusb_device_handle *dev_handle; + + /** A bitwise OR combination of \ref libusb_transfer_flags. */ + uint8_t flags; + + /** Address of the endpoint where this transfer will be sent. */ + unsigned char endpoint; + + /** Type of the endpoint from \ref libusb_transfer_type */ + unsigned char type; + + /** Timeout for this transfer in milliseconds. A value of 0 indicates no + * timeout. */ + unsigned int timeout; + + /** The status of the transfer. Read-only, and only for use within + * transfer callback function. + * + * If this is an isochronous transfer, this field may read COMPLETED even + * if there were errors in the frames. Use the + * \ref libusb_iso_packet_descriptor::status "status" field in each packet + * to determine if errors occurred. */ + enum libusb_transfer_status status; + + /** Length of the data buffer */ + int length; + + /** Actual length of data that was transferred. Read-only, and only for + * use within transfer callback function. Not valid for isochronous + * endpoint transfers. */ + int actual_length; + + /** Callback function. This will be invoked when the transfer completes, + * fails, or is cancelled. */ + libusb_transfer_cb_fn callback; + + /** User context data to pass to the callback function. */ + void *user_data; + + /** Data buffer */ + unsigned char *buffer; + + /** Number of isochronous packets. Only used for I/O with isochronous + * endpoints. */ + int num_iso_packets; + + /** Isochronous packet descriptors, for isochronous transfers only. */ + struct libusb_iso_packet_descriptor iso_packet_desc[ZERO_SIZED_ARRAY]; +}; + +/** \ingroup libusb_misc + * Capabilities supported by an instance of libusb on the current running + * platform. Test if the loaded library supports a given capability by calling + * \ref libusb_has_capability(). + */ +enum libusb_capability { + /** The libusb_has_capability() API is available. */ + LIBUSB_CAP_HAS_CAPABILITY = 0x0000, + /** Hotplug support is available on this platform. */ + LIBUSB_CAP_HAS_HOTPLUG = 0x0001, + /** The library can access HID devices without requiring user intervention. + * Note that before being able to actually access an HID device, you may + * still have to call additional libusb functions such as + * \ref libusb_detach_kernel_driver(). */ + LIBUSB_CAP_HAS_HID_ACCESS = 0x0100, + /** The library supports detaching of the default USB driver, using + * \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */ + LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101 +}; + +/** \ingroup libusb_lib + * Log message levels. + * - LIBUSB_LOG_LEVEL_NONE (0) : no messages ever printed by the library (default) + * - LIBUSB_LOG_LEVEL_ERROR (1) : error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stderr + * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stderr + */ +enum libusb_log_level { + LIBUSB_LOG_LEVEL_NONE = 0, + LIBUSB_LOG_LEVEL_ERROR = 1, + LIBUSB_LOG_LEVEL_WARNING = 2, + LIBUSB_LOG_LEVEL_INFO = 3, + LIBUSB_LOG_LEVEL_DEBUG = 4, +}; + +int LIBUSB_CALL libusb_init(libusb_context **ctx); +void LIBUSB_CALL libusb_exit(libusb_context *ctx); +LIBUSB_DEPRECATED_FOR(libusb_set_option) +void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); +const struct libusb_version * LIBUSB_CALL libusb_get_version(void); +int LIBUSB_CALL libusb_has_capability(uint32_t capability); +const char * LIBUSB_CALL libusb_error_name(int errcode); +int LIBUSB_CALL libusb_setlocale(const char *locale); +const char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode); + +ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, + libusb_device ***list); +void LIBUSB_CALL libusb_free_device_list(libusb_device **list, + int unref_devices); +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); +void LIBUSB_CALL libusb_unref_device(libusb_device *dev); + +int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, + int *config); +int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc); +int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config); +void LIBUSB_CALL libusb_free_config_descriptor( + struct libusb_config_descriptor *config); +int LIBUSB_CALL libusb_get_ss_endpoint_companion_descriptor( + struct libusb_context *ctx, + const struct libusb_endpoint_descriptor *endpoint, + struct libusb_ss_endpoint_companion_descriptor **ep_comp); +void LIBUSB_CALL libusb_free_ss_endpoint_companion_descriptor( + struct libusb_ss_endpoint_companion_descriptor *ep_comp); +int LIBUSB_CALL libusb_get_bos_descriptor(libusb_device_handle *dev_handle, + struct libusb_bos_descriptor **bos); +void LIBUSB_CALL libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos); +int LIBUSB_CALL libusb_get_usb_2_0_extension_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension); +void LIBUSB_CALL libusb_free_usb_2_0_extension_descriptor( + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension); +int LIBUSB_CALL libusb_get_ss_usb_device_capability_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap); +void LIBUSB_CALL libusb_free_ss_usb_device_capability_descriptor( + struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap); +int LIBUSB_CALL libusb_get_container_id_descriptor(struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_container_id_descriptor **container_id); +void LIBUSB_CALL libusb_free_container_id_descriptor( + struct libusb_container_id_descriptor *container_id); +uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_port_number(libusb_device *dev); +int LIBUSB_CALL libusb_get_port_numbers(libusb_device *dev, uint8_t* port_numbers, int port_numbers_len); +LIBUSB_DEPRECATED_FOR(libusb_get_port_numbers) +int LIBUSB_CALL libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t* path, uint8_t path_length); +libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); +int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev); +int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint); + +int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **dev_handle); +void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev_handle, + int configuration); +int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev_handle, + int interface_number); + +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); + +int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, + int interface_number, int alternate_setting); +int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev_handle, + unsigned char endpoint); +int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev_handle, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints); +int LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev_handle, + unsigned char *endpoints, int num_endpoints); + +unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle, + size_t length); +int LIBUSB_CALL libusb_dev_mem_free(libusb_device_handle *dev_handle, + unsigned char *buffer, size_t length); + +int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_set_auto_detach_kernel_driver( + libusb_device_handle *dev_handle, int enable); + +/* async I/O */ + +/** \ingroup libusb_asyncio + * Get the data section of a control transfer. This convenience function is here + * to remind you that the data does not start until 8 bytes into the actual + * buffer, as the setup packet comes first. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns pointer to the first byte of the data section + */ +static inline unsigned char *libusb_control_transfer_get_data( + struct libusb_transfer *transfer) +{ + return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; +} + +/** \ingroup libusb_asyncio + * Get the control setup packet of a control transfer. This convenience + * function is here to remind you that the control setup occupies the first + * 8 bytes of the transfer data buffer. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns a casted pointer to the start of the transfer data buffer + */ +static inline struct libusb_control_setup *libusb_control_transfer_get_setup( + struct libusb_transfer *transfer) +{ + return (struct libusb_control_setup *)(void *) transfer->buffer; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the setup packet (first 8 bytes of the data + * buffer) for a control transfer. The wIndex, wValue and wLength values should + * be given in host-endian byte order. + * + * \param buffer buffer to output the setup packet into + * This pointer must be aligned to at least 2 bytes boundary. + * \param bmRequestType see the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field of + * \ref libusb_control_setup + * \param bRequest see the + * \ref libusb_control_setup::bRequest "bRequest" field of + * \ref libusb_control_setup + * \param wValue see the + * \ref libusb_control_setup::wValue "wValue" field of + * \ref libusb_control_setup + * \param wIndex see the + * \ref libusb_control_setup::wIndex "wIndex" field of + * \ref libusb_control_setup + * \param wLength see the + * \ref libusb_control_setup::wLength "wLength" field of + * \ref libusb_control_setup + */ +static inline void libusb_fill_control_setup(unsigned char *buffer, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; + setup->bmRequestType = bmRequestType; + setup->bRequest = bRequest; + setup->wValue = libusb_cpu_to_le16(wValue); + setup->wIndex = libusb_cpu_to_le16(wIndex); + setup->wLength = libusb_cpu_to_le16(wLength); +} + +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); +int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); +int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_transfer_set_stream_id( + struct libusb_transfer *transfer, uint32_t stream_id); +uint32_t LIBUSB_CALL libusb_transfer_get_stream_id( + struct libusb_transfer *transfer); + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a control transfer. + * + * If you pass a transfer buffer to this function, the first 8 bytes will + * be interpreted as a control setup packet, and the wLength field will be + * used to automatically populate the \ref libusb_transfer::length "length" + * field of the transfer. Therefore the recommended approach is: + * -# Allocate a suitably sized data buffer (including space for control setup) + * -# Call libusb_fill_control_setup() + * -# If this is a host-to-device transfer with a data stage, put the data + * in place after the setup packet + * -# Call this function + * -# Call libusb_submit_transfer() + * + * It is also legal to pass a NULL buffer to this function, in which case this + * function will not attempt to populate the length field. Remember that you + * must then populate the buffer and length fields later. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param buffer data buffer. If provided, this function will interpret the + * first 8 bytes as a setup packet and infer the transfer length from that. + * This pointer must be aligned to at least 2 bytes boundary. + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_control_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, + unsigned int timeout) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; + transfer->dev_handle = dev_handle; + transfer->endpoint = 0; + transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; + transfer->timeout = timeout; + transfer->buffer = buffer; + if (setup) + transfer->length = (int) (LIBUSB_CONTROL_SETUP_SIZE + + libusb_le16_to_cpu(setup->wLength)); + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_BULK; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer using bulk streams. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param stream_id bulk stream id for this transfer + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_stream_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, uint32_t stream_id, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, + length, callback, user_data, timeout); + transfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM; + libusb_transfer_set_stream_id(transfer, stream_id); +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an interrupt transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_interrupt_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an isochronous transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param num_iso_packets the number of isochronous packets + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, int num_iso_packets, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->num_iso_packets = num_iso_packets; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Convenience function to set the length of all packets in an isochronous + * transfer, based on the num_iso_packets field in the transfer structure. + * + * \param transfer a transfer + * \param length the length to set in each isochronous packet descriptor + * \see libusb_get_max_packet_size() + */ +static inline void libusb_set_iso_packet_lengths( + struct libusb_transfer *transfer, unsigned int length) +{ + int i; + for (i = 0; i < transfer->num_iso_packets; i++) + transfer->iso_packet_desc[i].length = length; +} + +/** \ingroup libusb_asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer. + * + * This is a thorough function which loops through all preceding packets, + * accumulating their lengths to find the position of the specified packet. + * Typically you will assign equal lengths to each packet in the transfer, + * and hence the above method is sub-optimal. You may wish to use + * libusb_get_iso_packet_buffer_simple() instead. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer_simple() + */ +static inline unsigned char *libusb_get_iso_packet_buffer( + struct libusb_transfer *transfer, unsigned int packet) +{ + int i; + size_t offset = 0; + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + for (i = 0; i < _packet; i++) + offset += transfer->iso_packet_desc[i].length; + + return transfer->buffer + offset; +} + +/** \ingroup libusb_asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer, for transfers where each + * packet is of identical size. + * + * This function relies on the assumption that every packet within the transfer + * is of identical size to the first packet. Calculating the location of + * the packet buffer is then just a simple calculation: + * buffer + (packet_size * packet) + * + * Do not use this function on transfers other than those that have identical + * packet lengths for each packet. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer() + */ +static inline unsigned char *libusb_get_iso_packet_buffer_simple( + struct libusb_transfer *transfer, unsigned int packet) +{ + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + return transfer->buffer + ((int) transfer->iso_packet_desc[0].length * _packet); +} + +/* sync I/O */ + +int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout); + +int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +/** \ingroup libusb_desc + * Retrieve a descriptor from the default control pipe. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. + * + * \param dev_handle a device handle + * \param desc_type the descriptor type, see \ref libusb_descriptor_type + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +static inline int libusb_get_descriptor(libusb_device_handle *dev_handle, + uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) +{ + return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index), + 0, data, (uint16_t) length, 1000); +} + +/** \ingroup libusb_desc + * Retrieve a descriptor from a device. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. The string returned is Unicode, as + * detailed in the USB specifications. + * + * \param dev_handle a device handle + * \param desc_index the index of the descriptor to retrieve + * \param langid the language ID for the string descriptor + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + * \see libusb_get_string_descriptor_ascii() + */ +static inline int libusb_get_string_descriptor(libusb_device_handle *dev_handle, + uint8_t desc_index, uint16_t langid, unsigned char *data, int length) +{ + return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index), + langid, data, (uint16_t) length, 1000); +} + +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, + uint8_t desc_index, unsigned char *data, int length); + +/* polling and timeouts */ + +int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); +void LIBUSB_CALL libusb_interrupt_event_handler(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); +int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + +int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed); +int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); +int LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed); +int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); +int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv); + +/** \ingroup libusb_poll + * File descriptor for polling + */ +struct libusb_pollfd { + /** Numeric file descriptor */ + int fd; + + /** Event flags to poll for from . POLLIN indicates that you + * should monitor this file descriptor for becoming ready to read from, + * and POLLOUT indicates that you should monitor this file descriptor for + * nonblocking write readiness. */ + short events; +}; + +/** \ingroup libusb_poll + * Callback function, invoked when a new file descriptor should be added + * to the set of file descriptors monitored for events. + * \param fd the new file descriptor + * \param events events to monitor for, see \ref libusb_pollfd for a + * description + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, + void *user_data); + +/** \ingroup libusb_poll + * Callback function, invoked when a file descriptor should be removed from + * the set of file descriptors being monitored for events. After returning + * from this callback, do not use that file descriptor again. + * \param fd the file descriptor to stop monitoring + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); + +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx); +void LIBUSB_CALL libusb_free_pollfds(const struct libusb_pollfd **pollfds); +void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data); + +/** \ingroup libusb_hotplug + * Callback handle. + * + * Callbacks handles are generated by libusb_hotplug_register_callback() + * and can be used to deregister callbacks. Callback handles are unique + * per libusb_context and it is safe to call libusb_hotplug_deregister_callback() + * on an already deregisted callback. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * For more information, see \ref libusb_hotplug. + */ +typedef int libusb_hotplug_callback_handle; + +/** \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * Flags for hotplug events */ +typedef enum { + /** Default value when not using any flags. */ + LIBUSB_HOTPLUG_NO_FLAGS = 0, + + /** Arm the callback and fire it for all matching currently attached devices. */ + LIBUSB_HOTPLUG_ENUMERATE = 1<<0, +} libusb_hotplug_flag; + +/** \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * Hotplug events */ +typedef enum { + /** A device has been plugged in and is ready to use */ + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01, + + /** A device has left and is no longer available. + * It is the user's responsibility to call libusb_close on any handle associated with a disconnected device. + * It is safe to call libusb_get_device_descriptor on a device that has left */ + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 0x02, +} libusb_hotplug_event; + +/** \ingroup libusb_hotplug + * Wildcard matching for hotplug events */ +#define LIBUSB_HOTPLUG_MATCH_ANY -1 + +/** \ingroup libusb_hotplug + * Hotplug callback function type. When requesting hotplug event notifications, + * you pass a pointer to a callback function of this type. + * + * This callback may be called by an internal event thread and as such it is + * recommended the callback do minimal processing before returning. + * + * libusb will call this function later, when a matching event had happened on + * a matching device. See \ref libusb_hotplug for more information. + * + * It is safe to call either libusb_hotplug_register_callback() or + * libusb_hotplug_deregister_callback() from within a callback function. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param ctx context of this notification + * \param device libusb_device this event occurred on + * \param event event that occurred + * \param user_data user data provided when this callback was registered + * \returns bool whether this callback is finished processing events. + * returning 1 will cause this callback to be deregistered + */ +typedef int (LIBUSB_CALL *libusb_hotplug_callback_fn)(libusb_context *ctx, + libusb_device *device, + libusb_hotplug_event event, + void *user_data); + +/** \ingroup libusb_hotplug + * Register a hotplug callback function + * + * Register a callback with the libusb_context. The callback will fire + * when a matching event occurs on a matching device. The callback is + * armed until either it is deregistered with libusb_hotplug_deregister_callback() + * or the supplied callback returns 1 to indicate it is finished processing events. + * + * If the \ref LIBUSB_HOTPLUG_ENUMERATE is passed the callback will be + * called with a \ref LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED for all devices + * already plugged into the machine. Note that libusb modifies its internal + * device list from a separate thread, while calling hotplug callbacks from + * libusb_handle_events(), so it is possible for a device to already be present + * on, or removed from, its internal device list, while the hotplug callbacks + * still need to be dispatched. This means that when using \ref + * LIBUSB_HOTPLUG_ENUMERATE, your callback may be called twice for the arrival + * of the same device, once from libusb_hotplug_register_callback() and once + * from libusb_handle_events(); and/or your callback may be called for the + * removal of a device for which an arrived call was never made. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param[in] ctx context to register this callback with + * \param[in] events bitwise or of events that will trigger this callback. See \ref + * libusb_hotplug_event + * \param[in] flags hotplug callback flags. See \ref libusb_hotplug_flag + * \param[in] vendor_id the vendor id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] product_id the product id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] dev_class the device class to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] cb_fn the function to be invoked on a matching event/device + * \param[in] user_data user data to pass to the callback function + * \param[out] callback_handle pointer to store the handle of the allocated callback (can be NULL) + * \returns LIBUSB_SUCCESS on success LIBUSB_ERROR code on failure + */ +int LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx, + libusb_hotplug_event events, + libusb_hotplug_flag flags, + int vendor_id, int product_id, + int dev_class, + libusb_hotplug_callback_fn cb_fn, + void *user_data, + libusb_hotplug_callback_handle *callback_handle); + +/** \ingroup libusb_hotplug + * Deregisters a hotplug callback. + * + * Deregister a callback from a libusb_context. This function is safe to call from within + * a hotplug callback. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param[in] ctx context this callback is registered with + * \param[in] callback_handle the handle of the callback to deregister + */ +void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, + libusb_hotplug_callback_handle callback_handle); + +/** \ingroup libusb_lib + * Available option values for libusb_set_option(). + */ +enum libusb_option { + /** Set the log message verbosity. + * + * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever + * printed. If you choose to increase the message verbosity level, ensure + * that your application does not close the stderr file descriptor. + * + * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative + * with its message logging and most of the time, will only log messages that + * explain error conditions and other oddities. This will help you debug + * your software. + * + * If the LIBUSB_DEBUG environment variable was set when libusb was + * initialized, this function does nothing: the message verbosity is fixed + * to the value in the environment variable. + * + * If libusb was compiled without any message logging, this function does + * nothing: you'll never get any messages. + * + * If libusb was compiled with verbose debug message logging, this function + * does nothing: you'll always get messages from all levels. + */ + LIBUSB_OPTION_LOG_LEVEL, + + /** Use the UsbDk backend for a specific context, if available. + * + * This option should be set immediately after calling libusb_init(), otherwise + * unspecified behavior may occur. + * + * Only valid on Windows. + */ + LIBUSB_OPTION_USE_USBDK, +}; + +int LIBUSB_CALL libusb_set_option(libusb_context *ctx, enum libusb_option option, ...); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib_xua/host/xmosdfu/xmosdfu.cpp b/lib_xua/host/xmosdfu/xmosdfu.cpp index a9f86f81..2c33fcd4 100644 --- a/lib_xua/host/xmosdfu/xmosdfu.cpp +++ b/lib_xua/host/xmosdfu/xmosdfu.cpp @@ -2,6 +2,16 @@ #include #include #include +#ifdef _WIN32 +#include +#else +#include + +void Sleep(unsigned milliseconds) { + usleep(milliseconds * 1000); +} +#endif + #include "libusb.h" /* the device's vendor and product id */ @@ -501,7 +511,7 @@ int main(int argc, char **argv) printf("Waiting for device to restart and enter DFU mode...\n"); // Wait for device to enter dfu mode and restart - system("sleep 20"); + Sleep(20 * 1000); #endif // NOW IN DFU APPLICATION MODE @@ -556,7 +566,7 @@ int main(int argc, char **argv) printf("... Reverting device to factory image\n"); xmos_dfu_revertfactory(); // Give device time to revert firmware - system("sleep 2"); + Sleep(2 * 1000); xmos_dfu_resetfromdfu(XMOS_DFU_IF); } else