From aa28209336a9ce00ad695581e4b4f92b94ebf9e0 Mon Sep 17 00:00:00 2001 From: Serge Vakulenko Date: Thu, 6 Sep 2018 12:10:01 -0700 Subject: [PATCH] Add stub for windows dfu version. --- .gitignore | 1 + Makefile | 4 +- Makefile-mingw | 9 +- dfu.c => dfu-libusb.c | 0 dfu-windows.c | 63 + libusb-win32/README.txt | 61 - libusb-win32/libusb-1.0.a | Bin 172614 -> 0 bytes libusb-win32/libusb-1.0/libusb.h | 1999 ------------------------------ main.c | 17 +- 9 files changed, 78 insertions(+), 2076 deletions(-) rename dfu.c => dfu-libusb.c (100%) create mode 100644 dfu-windows.c delete mode 100644 libusb-win32/README.txt delete mode 100644 libusb-win32/libusb-1.0.a delete mode 100644 libusb-win32/libusb-1.0/libusb.h diff --git a/.gitignore b/.gitignore index 7d5afb7..b61db24 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.o *.hd dmrconfig +dmrconfig.exe diff --git a/Makefile b/Makefile index 959114d..e53a1f9 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ GITCOUNT = $(shell git rev-list HEAD --count) CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"' LDFLAGS = -g -OBJS = main.o util.o radio.o dfu.o uv380.o md380.o +OBJS = main.o util.o radio.o dfu-libusb.o uv380.o md380.o LIBS = -lusb-1.0 # Mac OS X @@ -28,7 +28,7 @@ dmrconfig.linux: dmrconfig strip $@ ### -dfu.o: dfu.c util.h +dfu-libusb.o: dfu-libusb.c util.h main.o: main.c radio.h util.h md380.o: md380.c radio.h util.h radio.o: radio.c radio.h util.h diff --git a/Makefile-mingw b/Makefile-mingw index a2fdb9d..f17244c 100644 --- a/Makefile-mingw +++ b/Makefile-mingw @@ -5,8 +5,8 @@ GITCOUNT = $(shell git rev-list HEAD --count) CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"' -Ilibusb-win32 LDFLAGS = -g -s -OBJS = main.o util.o radio.o dfu.o uv380.o md380.o -LIBS = -Llibusb-win32 -lusb-1.0 +OBJS = main.o util.o radio.o dfu-windows.o uv380.o md380.o +LIBS = # Compiling Windows binary from Linux ifeq (/usr/bin/i586-mingw32msvc-gcc,$(wildcard /usr/bin/i586-mingw32msvc-gcc)) @@ -15,9 +15,6 @@ endif ifeq (/usr/bin/i686-w64-mingw32-gcc,$(wildcard /usr/bin/i686-w64-mingw32-gcc)) CC = i686-w64-mingw32-gcc endif -ifeq (/usr/bin/i686-w64-mingw32-gcc-win32,$(wildcard /usr/bin/i686-w64-mingw32-gcc-win32)) - CC = i686-w64-mingw32-gcc-win32 -endif all: dmrconfig.exe @@ -31,7 +28,7 @@ install: dmrconfig install -c -s dmrconfig /usr/local/bin/dmrconfig ### -dfu.o: dfu.c util.h +dfu-windows.o: dfu-windows.c util.h main.o: main.c radio.h util.h md380.o: md380.c radio.h util.h radio.o: radio.c radio.h util.h diff --git a/dfu.c b/dfu-libusb.c similarity index 100% rename from dfu.c rename to dfu-libusb.c diff --git a/dfu-windows.c b/dfu-windows.c new file mode 100644 index 0000000..546f893 --- /dev/null +++ b/dfu-windows.c @@ -0,0 +1,63 @@ +/* + * DFU routines. + * + * Copyright (C) 2018 Serge Vakulenko, KK6ABQ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include "util.h" + +const char *dfu_init(unsigned vid, unsigned pid) +{ + //TODO: use STDFU.dll + fprintf(stderr, "DFU for Windows not implemented yet.\n"); + exit(-1); + return 0; +} + +void dfu_close() +{ + //TODO +} + +void dfu_erase(unsigned start, unsigned finish) +{ + //TODO +} + +void dfu_read_block(int bno, unsigned char *data, int nbytes) +{ + //TODO +} + +void dfu_write_block(int bno, unsigned char *data, int nbytes) +{ + //TODO +} + +void dfu_reboot() +{ + //TODO +} diff --git a/libusb-win32/README.txt b/libusb-win32/README.txt deleted file mode 100644 index 2ad8395..0000000 --- a/libusb-win32/README.txt +++ /dev/null @@ -1,61 +0,0 @@ - libusb 1.0 Windows binary snapshot - README - - ********************************************************************* - * The latest version of this snapshot can always be downloaded at: * - * https://sourceforge.net/projects/libusb/files/ * - ********************************************************************* - -o Visual Studio: - - Open existing or create a new project for your application - - Copy libusb.h, from the include\libusb-1.0\ directory, into your project and - make sure that the location where the file reside appears in the 'Additional - Include Directories' section (Configuration Properties -> C/C++ -> General). - - Copy the relevant .lib file from MS32\ or MS64\ and add 'libusb-1.0.lib' to - your 'Additional Dependencies' (Configuration Properties -> Linker -> Input) - Also make sure that the directory where libusb-1.0.lib resides is added to - 'Additional Library Directories' (Configuration Properties -> Linker - -> General) - - If you use the static version of the libusb library, make sure that - 'Runtime Library' is set to 'Multi-threaded DLL (/MD)' (Configuration - Properties -> C/C++ -> Code Generation). - NB: If your application requires /MT (Multi-threaded/libCMT), you need to - recompile a static libusb 1.0 library from source. - - Compile and run your application. If you use the DLL version of libusb-1.0, - remember that you need to have a copy of the DLL either in the runtime - directory or in system32 - -o WDK/DDK: - - The following is an example of a sources files that you can use to compile - a libusb 1.0 based console application. In this sample ..\libusb\ is the - directory where you would have copied libusb.h as well as the relevant - libusb-1.0.lib - - TARGETNAME=your_app - TARGETTYPE=PROGRAM - USE_MSVCRT=1 - UMTYPE=console - INCLUDES=..\libusb;$(DDK_INC_PATH) - TARGETLIBS=..\libusb\libusb-1.0.lib - SOURCES=your_app.c - - - Note that if you plan to use libCMT instead of MSVCRT (USE_LIBCMT=1 instead - of USE_MSVCRT=1), you will need to recompile libusb to use libCMT. This can - easily be achieved, in the DDK environment, by running 'ddk_build /MT' - -o MinGW/cygwin - - Copy libusb.h, from include/libusb-1.0/ to your default include directory, - and copy the MinGW32/ or MinGW64/ .a files to your default library directory. - Or, if you don't want to use the default locations, make sure that you feed - the relevant -I and -L options to the compiler. - - Add the '-lusb-1.0' linker option when compiling. - -o Additional information: - - The libusb 1.0 API documentation can be accessed at: - http://api.libusb.info - - For some libusb samples (including source), please have a look in examples/ - - For additional information on the libusb 1.0 Windows backend please visit: - http://windows.libusb.info - - The MinGW and MS generated DLLs are fully interchangeable, provided that you - use the import libs provided or generate one from the .def also provided. - - If you find any issue, please visit http://libusb.info/ and check the - Support section diff --git a/libusb-win32/libusb-1.0.a b/libusb-win32/libusb-1.0.a deleted file mode 100644 index aaa3e5af09ccb70c28ced2ca87e05c40dfc3a10e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172614 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 diff --git a/libusb-win32/libusb-1.0/libusb.h b/libusb-win32/libusb-1.0/libusb.h deleted file mode 100644 index c165a76..0000000 --- a/libusb-win32/libusb-1.0/libusb.h +++ /dev/null @@ -1,1999 +0,0 @@ -/* - * Public libusb header file - * Copyright © 2001 Johannes Erdfelt - * 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 - -/* '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"))) -#else -#define LIBUSB_DEPRECATED_FOR(f) -#endif /* __GNUC__ */ - -/** \def LIBUSB_CALL - * \ingroup 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 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 0x01000104 - -/* 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 - * recieve 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 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 -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup 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 -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup 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 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 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 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 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 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_debug() 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 contexts. - */ -typedef struct libusb_context libusb_context; - -/** \ingroup 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 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 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, -}; - -/** \ingroup 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 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 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 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 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 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 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() */ - 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 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 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 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 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 millseconds. 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 -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup 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 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 stdout, warning - * and error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stdout, - * warnings and errors to stderr - */ -enum libusb_log_level { - LIBUSB_LOG_LEVEL_NONE = 0, - LIBUSB_LOG_LEVEL_ERROR, - LIBUSB_LOG_LEVEL_WARNING, - LIBUSB_LOG_LEVEL_INFO, - LIBUSB_LOG_LEVEL_DEBUG, -}; - -int LIBUSB_CALL libusb_init(libusb_context **ctx); -void LIBUSB_CALL libusb_exit(libusb_context *ctx); -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 *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 **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, - int configuration); -int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev, - int interface_number); -int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev, - 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, - int interface_number, int alternate_setting); -int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev, - unsigned char endpoint); -int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev); - -int LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints); -int LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev, - unsigned char *endpoints, int num_endpoints); - -int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev, - int interface_number); -int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev, - int interface_number); -int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev, - int interface_number); -int LIBUSB_CALL libusb_set_auto_detach_kernel_driver( - libusb_device_handle *dev, int enable); - -/* async I/O */ - -/** \ingroup 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 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 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 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 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 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 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 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 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 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 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 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 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, - uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) -{ - return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, - LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index), - 0, data, (uint16_t) length, 1000); -} - -/** \ingroup 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 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, - uint8_t desc_index, uint16_t langid, unsigned char *data, int length) -{ - return libusb_control_transfer(dev, 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, - 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_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 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 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 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 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 hotplug. - */ -typedef int libusb_hotplug_callback_handle; - -/** \ingroup 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 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 hotplug - * Wildcard matching for hotplug events */ -#define LIBUSB_HOTPLUG_MATCH_ANY -1 - -/** \ingroup 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 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 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] 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 *handle); - -/** \ingroup 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] handle the handle of the callback to deregister - */ -void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, - libusb_hotplug_callback_handle handle); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/main.c b/main.c index b46b77b..8b4b042 100644 --- a/main.c +++ b/main.c @@ -42,23 +42,24 @@ void usage() fprintf(stderr, _("DMR Config, Version %s, %s\n"), version, copyright); fprintf(stderr, _("Usage:\n")); fprintf(stderr, _(" dmrconfig -r [-t]\n")); - fprintf(stderr, _(" Read codeplug from the radio and save it to a binary file 'device.img'.\n")); - fprintf(stderr, _(" Save configuration to a text file 'device.conf'.\n")); + fprintf(stderr, _(" Read codeplug from the radio to a file 'device.img'.\n")); + fprintf(stderr, _(" Save configuration to a text file 'device.conf'.\n")); fprintf(stderr, _(" dmrconfig -w [-t] file.img\n")); - fprintf(stderr, _(" Write codeplug to the radio.\n")); + fprintf(stderr, _(" Write codeplug to the radio.\n")); fprintf(stderr, _(" dmrconfig -c [-t] file.conf\n")); - fprintf(stderr, _(" Apply configuration script to the radio.\n")); + fprintf(stderr, _(" Apply configuration script to the radio.\n")); fprintf(stderr, _(" dmrconfig -c file.img file.conf\n")); - fprintf(stderr, _(" Apply configuration script to the codeplug image.\n")); - fprintf(stderr, _(" Store modified copy to a file 'device.img'.\n")); + fprintf(stderr, _(" Apply configuration script to the codeplug image.\n")); + fprintf(stderr, _(" Store modified copy to a file 'device.img'.\n")); fprintf(stderr, _(" dmrconfig file.img\n")); - fprintf(stderr, _(" Display configuration from the codeplug image.\n")); + fprintf(stderr, _(" Display configuration from the codeplug image.\n")); fprintf(stderr, _(" dmrconfig -u [-t] file.csv\n")); - fprintf(stderr, _(" Update contacts database.\n")); + fprintf(stderr, _(" Update contacts database from CSV file.\n")); fprintf(stderr, _("Options:\n")); fprintf(stderr, _(" -r Read codeplug from the radio.\n")); fprintf(stderr, _(" -w Write codeplug to the radio.\n")); fprintf(stderr, _(" -c Configure the radio from a text script.\n")); + fprintf(stderr, _(" -u Update contacts database.\n")); fprintf(stderr, _(" -t Trace USB protocol.\n")); exit(-1); }