1c5739aa6SSascha Wildner /* $FreeBSD: head/lib/libusb/libusb.h 277245 2015-01-16 12:11:01Z hselasky $ */ 21d96047eSMarkus Pfeiffer /*- 31d96047eSMarkus Pfeiffer * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 41d96047eSMarkus Pfeiffer * 51d96047eSMarkus Pfeiffer * Redistribution and use in source and binary forms, with or without 61d96047eSMarkus Pfeiffer * modification, are permitted provided that the following conditions 71d96047eSMarkus Pfeiffer * are met: 81d96047eSMarkus Pfeiffer * 1. Redistributions of source code must retain the above copyright 91d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer. 101d96047eSMarkus Pfeiffer * 2. Redistributions in binary form must reproduce the above copyright 111d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer in the 121d96047eSMarkus Pfeiffer * documentation and/or other materials provided with the distribution. 131d96047eSMarkus Pfeiffer * 141d96047eSMarkus Pfeiffer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 151d96047eSMarkus Pfeiffer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 161d96047eSMarkus Pfeiffer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 171d96047eSMarkus Pfeiffer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 181d96047eSMarkus Pfeiffer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 191d96047eSMarkus Pfeiffer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 201d96047eSMarkus Pfeiffer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 211d96047eSMarkus Pfeiffer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 221d96047eSMarkus Pfeiffer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 231d96047eSMarkus Pfeiffer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 241d96047eSMarkus Pfeiffer * SUCH DAMAGE. 251d96047eSMarkus Pfeiffer */ 261d96047eSMarkus Pfeiffer 271d96047eSMarkus Pfeiffer #ifndef __LIBUSB_H__ 281d96047eSMarkus Pfeiffer #define __LIBUSB_H__ 291d96047eSMarkus Pfeiffer 309b0c1abeSSascha Wildner #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 319b0c1abeSSascha Wildner #include <stdint.h> 321d96047eSMarkus Pfeiffer #include <sys/time.h> 331d96047eSMarkus Pfeiffer #include <sys/types.h> 349b0c1abeSSascha Wildner #endif 351d96047eSMarkus Pfeiffer 36c5739aa6SSascha Wildner #define LIBUSB_CALL 37c5739aa6SSascha Wildner 381d96047eSMarkus Pfeiffer #ifdef __cplusplus 391d96047eSMarkus Pfeiffer extern "C" { 401d96047eSMarkus Pfeiffer #endif 411d96047eSMarkus Pfeiffer #if 0 421d96047eSMarkus Pfeiffer } /* indent fix */ 431d96047eSMarkus Pfeiffer 441d96047eSMarkus Pfeiffer #endif 451d96047eSMarkus Pfeiffer 461d96047eSMarkus Pfeiffer /* libusb enums */ 471d96047eSMarkus Pfeiffer 481d96047eSMarkus Pfeiffer enum libusb_class_code { 491d96047eSMarkus Pfeiffer LIBUSB_CLASS_PER_INTERFACE = 0, 501d96047eSMarkus Pfeiffer LIBUSB_CLASS_AUDIO = 1, 511d96047eSMarkus Pfeiffer LIBUSB_CLASS_COMM = 2, 521d96047eSMarkus Pfeiffer LIBUSB_CLASS_HID = 3, 531d96047eSMarkus Pfeiffer LIBUSB_CLASS_PTP = 6, 54c5739aa6SSascha Wildner LIBUSB_CLASS_IMAGE = 6, 551d96047eSMarkus Pfeiffer LIBUSB_CLASS_PRINTER = 7, 561d96047eSMarkus Pfeiffer LIBUSB_CLASS_MASS_STORAGE = 8, 571d96047eSMarkus Pfeiffer LIBUSB_CLASS_HUB = 9, 581d96047eSMarkus Pfeiffer LIBUSB_CLASS_DATA = 10, 59c5739aa6SSascha Wildner LIBUSB_CLASS_SMART_CARD = 11, 60c5739aa6SSascha Wildner LIBUSB_CLASS_CONTENT_SECURITY = 13, 61c5739aa6SSascha Wildner LIBUSB_CLASS_VIDEO = 14, 62c5739aa6SSascha Wildner LIBUSB_CLASS_PERSONAL_HEALTHCARE = 15, 63c5739aa6SSascha Wildner LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, 64c5739aa6SSascha Wildner LIBUSB_CLASS_WIRELESS = 0xe0, 65c5739aa6SSascha Wildner LIBUSB_CLASS_APPLICATION = 0xfe, 661d96047eSMarkus Pfeiffer LIBUSB_CLASS_VENDOR_SPEC = 0xff, 671d96047eSMarkus Pfeiffer }; 681d96047eSMarkus Pfeiffer 691d96047eSMarkus Pfeiffer enum libusb_descriptor_type { 701d96047eSMarkus Pfeiffer LIBUSB_DT_DEVICE = 0x01, 711d96047eSMarkus Pfeiffer LIBUSB_DT_CONFIG = 0x02, 721d96047eSMarkus Pfeiffer LIBUSB_DT_STRING = 0x03, 731d96047eSMarkus Pfeiffer LIBUSB_DT_INTERFACE = 0x04, 741d96047eSMarkus Pfeiffer LIBUSB_DT_ENDPOINT = 0x05, 751d96047eSMarkus Pfeiffer LIBUSB_DT_HID = 0x21, 761d96047eSMarkus Pfeiffer LIBUSB_DT_REPORT = 0x22, 771d96047eSMarkus Pfeiffer LIBUSB_DT_PHYSICAL = 0x23, 781d96047eSMarkus Pfeiffer LIBUSB_DT_HUB = 0x29, 791d96047eSMarkus Pfeiffer LIBUSB_DT_BOS = 0x0f, 801d96047eSMarkus Pfeiffer LIBUSB_DT_DEVICE_CAPABILITY = 0x10, 811d96047eSMarkus Pfeiffer LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30, 821d96047eSMarkus Pfeiffer }; 831d96047eSMarkus Pfeiffer 841d96047eSMarkus Pfeiffer enum libusb_device_capability_type { 851d96047eSMarkus Pfeiffer LIBUSB_WIRELESS_USB_DEVICE_CAPABILITY = 0x1, 861d96047eSMarkus Pfeiffer LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY = 0x2, 871d96047eSMarkus Pfeiffer LIBUSB_SS_USB_DEVICE_CAPABILITY = 0x3, 881d96047eSMarkus Pfeiffer LIBUSB_CONTAINER_ID_DEVICE_CAPABILITY = 0x4, 891d96047eSMarkus Pfeiffer }; 901d96047eSMarkus Pfeiffer 911d96047eSMarkus Pfeiffer #define LIBUSB_DT_DEVICE_SIZE 18 921d96047eSMarkus Pfeiffer #define LIBUSB_DT_CONFIG_SIZE 9 931d96047eSMarkus Pfeiffer #define LIBUSB_DT_INTERFACE_SIZE 9 941d96047eSMarkus Pfeiffer #define LIBUSB_DT_ENDPOINT_SIZE 7 951d96047eSMarkus Pfeiffer #define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 961d96047eSMarkus Pfeiffer #define LIBUSB_DT_HUB_NONVAR_SIZE 7 971d96047eSMarkus Pfeiffer #define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 981d96047eSMarkus Pfeiffer #define LIBUSB_DT_BOS_SIZE 5 991d96047eSMarkus Pfeiffer #define LIBUSB_USB_2_0_EXTENSION_DEVICE_CAPABILITY_SIZE 7 1001d96047eSMarkus Pfeiffer #define LIBUSB_SS_USB_DEVICE_CAPABILITY_SIZE 10 1011d96047eSMarkus Pfeiffer 1021d96047eSMarkus Pfeiffer #define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f 1031d96047eSMarkus Pfeiffer #define LIBUSB_ENDPOINT_DIR_MASK 0x80 1041d96047eSMarkus Pfeiffer 1051d96047eSMarkus Pfeiffer enum libusb_endpoint_direction { 1061d96047eSMarkus Pfeiffer LIBUSB_ENDPOINT_IN = 0x80, 1071d96047eSMarkus Pfeiffer LIBUSB_ENDPOINT_OUT = 0x00, 1081d96047eSMarkus Pfeiffer }; 1091d96047eSMarkus Pfeiffer 1101d96047eSMarkus Pfeiffer #define LIBUSB_TRANSFER_TYPE_MASK 0x03 1111d96047eSMarkus Pfeiffer 1121d96047eSMarkus Pfeiffer enum libusb_transfer_type { 1131d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_TYPE_CONTROL = 0, 1141d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, 1151d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_TYPE_BULK = 2, 1161d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_TYPE_INTERRUPT = 3, 1171d96047eSMarkus Pfeiffer }; 1181d96047eSMarkus Pfeiffer 1191d96047eSMarkus Pfeiffer enum libusb_standard_request { 1201d96047eSMarkus Pfeiffer LIBUSB_REQUEST_GET_STATUS = 0x00, 1211d96047eSMarkus Pfeiffer LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, 1221d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SET_FEATURE = 0x03, 1231d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SET_ADDRESS = 0x05, 1241d96047eSMarkus Pfeiffer LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, 1251d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, 1261d96047eSMarkus Pfeiffer LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, 1271d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, 1281d96047eSMarkus Pfeiffer LIBUSB_REQUEST_GET_INTERFACE = 0x0A, 1291d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SET_INTERFACE = 0x0B, 1301d96047eSMarkus Pfeiffer LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, 131c5739aa6SSascha Wildner LIBUSB_REQUEST_SET_SEL = 0x30, 132c5739aa6SSascha Wildner LIBUSB_REQUEST_SET_ISOCH_DELAY = 0x31, 1331d96047eSMarkus Pfeiffer }; 1341d96047eSMarkus Pfeiffer 1351d96047eSMarkus Pfeiffer enum libusb_request_type { 1361d96047eSMarkus Pfeiffer LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), 1371d96047eSMarkus Pfeiffer LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), 1381d96047eSMarkus Pfeiffer LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), 1391d96047eSMarkus Pfeiffer LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5), 1401d96047eSMarkus Pfeiffer }; 1411d96047eSMarkus Pfeiffer 1421d96047eSMarkus Pfeiffer enum libusb_request_recipient { 1431d96047eSMarkus Pfeiffer LIBUSB_RECIPIENT_DEVICE = 0x00, 1441d96047eSMarkus Pfeiffer LIBUSB_RECIPIENT_INTERFACE = 0x01, 1451d96047eSMarkus Pfeiffer LIBUSB_RECIPIENT_ENDPOINT = 0x02, 1461d96047eSMarkus Pfeiffer LIBUSB_RECIPIENT_OTHER = 0x03, 1471d96047eSMarkus Pfeiffer }; 1481d96047eSMarkus Pfeiffer 1491d96047eSMarkus Pfeiffer #define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C 1501d96047eSMarkus Pfeiffer 1511d96047eSMarkus Pfeiffer enum libusb_iso_sync_type { 1521d96047eSMarkus Pfeiffer LIBUSB_ISO_SYNC_TYPE_NONE = 0, 1531d96047eSMarkus Pfeiffer LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, 1541d96047eSMarkus Pfeiffer LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, 1551d96047eSMarkus Pfeiffer LIBUSB_ISO_SYNC_TYPE_SYNC = 3, 1561d96047eSMarkus Pfeiffer }; 1571d96047eSMarkus Pfeiffer 1581d96047eSMarkus Pfeiffer #define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 1591d96047eSMarkus Pfeiffer 1601d96047eSMarkus Pfeiffer enum libusb_iso_usage_type { 1611d96047eSMarkus Pfeiffer LIBUSB_ISO_USAGE_TYPE_DATA = 0, 1621d96047eSMarkus Pfeiffer LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, 1631d96047eSMarkus Pfeiffer LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, 1641d96047eSMarkus Pfeiffer }; 1651d96047eSMarkus Pfeiffer 1661d96047eSMarkus Pfeiffer enum libusb_error { 1671d96047eSMarkus Pfeiffer LIBUSB_SUCCESS = 0, 1681d96047eSMarkus Pfeiffer LIBUSB_ERROR_IO = -1, 1691d96047eSMarkus Pfeiffer LIBUSB_ERROR_INVALID_PARAM = -2, 1701d96047eSMarkus Pfeiffer LIBUSB_ERROR_ACCESS = -3, 1711d96047eSMarkus Pfeiffer LIBUSB_ERROR_NO_DEVICE = -4, 1721d96047eSMarkus Pfeiffer LIBUSB_ERROR_NOT_FOUND = -5, 1731d96047eSMarkus Pfeiffer LIBUSB_ERROR_BUSY = -6, 1741d96047eSMarkus Pfeiffer LIBUSB_ERROR_TIMEOUT = -7, 1751d96047eSMarkus Pfeiffer LIBUSB_ERROR_OVERFLOW = -8, 1761d96047eSMarkus Pfeiffer LIBUSB_ERROR_PIPE = -9, 1771d96047eSMarkus Pfeiffer LIBUSB_ERROR_INTERRUPTED = -10, 1781d96047eSMarkus Pfeiffer LIBUSB_ERROR_NO_MEM = -11, 1791d96047eSMarkus Pfeiffer LIBUSB_ERROR_NOT_SUPPORTED = -12, 1801d96047eSMarkus Pfeiffer LIBUSB_ERROR_OTHER = -99, 1811d96047eSMarkus Pfeiffer }; 1821d96047eSMarkus Pfeiffer 1831d96047eSMarkus Pfeiffer enum libusb_speed { 1841d96047eSMarkus Pfeiffer LIBUSB_SPEED_UNKNOWN = 0, 1851d96047eSMarkus Pfeiffer LIBUSB_SPEED_LOW = 1, 1861d96047eSMarkus Pfeiffer LIBUSB_SPEED_FULL = 2, 1871d96047eSMarkus Pfeiffer LIBUSB_SPEED_HIGH = 3, 1881d96047eSMarkus Pfeiffer LIBUSB_SPEED_SUPER = 4, 1891d96047eSMarkus Pfeiffer }; 1901d96047eSMarkus Pfeiffer 1911d96047eSMarkus Pfeiffer enum libusb_transfer_status { 1921d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_COMPLETED, 1931d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_ERROR, 1941d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_TIMED_OUT, 1951d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_CANCELLED, 1961d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_STALL, 1971d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_NO_DEVICE, 1981d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_OVERFLOW, 1991d96047eSMarkus Pfeiffer }; 2001d96047eSMarkus Pfeiffer 2011d96047eSMarkus Pfeiffer enum libusb_transfer_flags { 2021d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_SHORT_NOT_OK = 1 << 0, 2031d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_FREE_BUFFER = 1 << 1, 2041d96047eSMarkus Pfeiffer LIBUSB_TRANSFER_FREE_TRANSFER = 1 << 2, 2051d96047eSMarkus Pfeiffer }; 2061d96047eSMarkus Pfeiffer 20725e8bf91SMarkus Pfeiffer enum libusb_log_level { 20825e8bf91SMarkus Pfeiffer LIBUSB_LOG_LEVEL_NONE = 0, 20925e8bf91SMarkus Pfeiffer LIBUSB_LOG_LEVEL_ERROR, 21025e8bf91SMarkus Pfeiffer LIBUSB_LOG_LEVEL_WARNING, 21125e8bf91SMarkus Pfeiffer LIBUSB_LOG_LEVEL_INFO, 21225e8bf91SMarkus Pfeiffer LIBUSB_LOG_LEVEL_DEBUG 21325e8bf91SMarkus Pfeiffer }; 21425e8bf91SMarkus Pfeiffer 21525e8bf91SMarkus Pfeiffer /* 21625e8bf91SMarkus Pfeiffer * XXX 21725e8bf91SMarkus Pfeiffer * libusb_set_debug should take parameters from libusb_log_level 21825e8bf91SMarkus Pfeiffer * above according to 21925e8bf91SMarkus Pfeiffer * http://libusb.sourceforge.net/api-1.0/group__lib.html 22025e8bf91SMarkus Pfeiffer */ 2211d96047eSMarkus Pfeiffer enum libusb_debug_level { 2221d96047eSMarkus Pfeiffer LIBUSB_DEBUG_NO=0, 2231d96047eSMarkus Pfeiffer LIBUSB_DEBUG_FUNCTION=1, 2241d96047eSMarkus Pfeiffer LIBUSB_DEBUG_TRANSFER=2, 2251d96047eSMarkus Pfeiffer }; 2261d96047eSMarkus Pfeiffer 227c4031fc1SImre Vadász #define LIBUSB_HOTPLUG_MATCH_ANY -1 228c4031fc1SImre Vadász 229c4031fc1SImre Vadász typedef enum { 230c4031fc1SImre Vadász LIBUSB_HOTPLUG_NO_FLAGS = 0, 231c4031fc1SImre Vadász LIBUSB_HOTPLUG_ENUMERATE = 1 << 0, 232c4031fc1SImre Vadász } libusb_hotplug_flag; 233c4031fc1SImre Vadász 234c4031fc1SImre Vadász typedef enum { 235c4031fc1SImre Vadász LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 1, 236c4031fc1SImre Vadász LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 2, 237c4031fc1SImre Vadász } libusb_hotplug_event; 238c4031fc1SImre Vadász 2391d96047eSMarkus Pfeiffer /* libusb structures */ 2401d96047eSMarkus Pfeiffer 2411d96047eSMarkus Pfeiffer struct libusb_context; 2421d96047eSMarkus Pfeiffer struct libusb_device; 2431d96047eSMarkus Pfeiffer struct libusb_transfer; 2441d96047eSMarkus Pfeiffer struct libusb_device_handle; 245*04a4f0d2SImre Vadász struct libusb_hotplug_callback_handle_struct; 2461d96047eSMarkus Pfeiffer 2471d96047eSMarkus Pfeiffer struct libusb_pollfd { 2481d96047eSMarkus Pfeiffer int fd; 2491d96047eSMarkus Pfeiffer short events; 2501d96047eSMarkus Pfeiffer }; 2511d96047eSMarkus Pfeiffer 2521d96047eSMarkus Pfeiffer typedef struct libusb_context libusb_context; 2531d96047eSMarkus Pfeiffer typedef struct libusb_device libusb_device; 2541d96047eSMarkus Pfeiffer typedef struct libusb_device_handle libusb_device_handle; 2551d96047eSMarkus Pfeiffer typedef struct libusb_pollfd libusb_pollfd; 2561d96047eSMarkus Pfeiffer typedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data); 2571d96047eSMarkus Pfeiffer typedef void (*libusb_pollfd_removed_cb) (int fd, void *user_data); 258*04a4f0d2SImre Vadász typedef struct libusb_hotplug_callback_handle_struct *libusb_hotplug_callback_handle; 2591d96047eSMarkus Pfeiffer 2601d96047eSMarkus Pfeiffer typedef struct libusb_device_descriptor { 2611d96047eSMarkus Pfeiffer uint8_t bLength; 2621d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 2631d96047eSMarkus Pfeiffer uint16_t bcdUSB; 2641d96047eSMarkus Pfeiffer uint8_t bDeviceClass; 2651d96047eSMarkus Pfeiffer uint8_t bDeviceSubClass; 2661d96047eSMarkus Pfeiffer uint8_t bDeviceProtocol; 2671d96047eSMarkus Pfeiffer uint8_t bMaxPacketSize0; 2681d96047eSMarkus Pfeiffer uint16_t idVendor; 2691d96047eSMarkus Pfeiffer uint16_t idProduct; 2701d96047eSMarkus Pfeiffer uint16_t bcdDevice; 2711d96047eSMarkus Pfeiffer uint8_t iManufacturer; 2721d96047eSMarkus Pfeiffer uint8_t iProduct; 2731d96047eSMarkus Pfeiffer uint8_t iSerialNumber; 2741d96047eSMarkus Pfeiffer uint8_t bNumConfigurations; 2751d96047eSMarkus Pfeiffer } libusb_device_descriptor; 2761d96047eSMarkus Pfeiffer 2771d96047eSMarkus Pfeiffer typedef struct libusb_endpoint_descriptor { 2781d96047eSMarkus Pfeiffer uint8_t bLength; 2791d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 2801d96047eSMarkus Pfeiffer uint8_t bEndpointAddress; 2811d96047eSMarkus Pfeiffer uint8_t bmAttributes; 2821d96047eSMarkus Pfeiffer uint16_t wMaxPacketSize; 2831d96047eSMarkus Pfeiffer uint8_t bInterval; 2841d96047eSMarkus Pfeiffer uint8_t bRefresh; 2851d96047eSMarkus Pfeiffer uint8_t bSynchAddress; 2861d96047eSMarkus Pfeiffer uint8_t *extra; 2871d96047eSMarkus Pfeiffer int extra_length; 2881d96047eSMarkus Pfeiffer } libusb_endpoint_descriptor __aligned(sizeof(void *)); 2891d96047eSMarkus Pfeiffer 2901d96047eSMarkus Pfeiffer typedef struct libusb_ss_endpoint_companion_descriptor { 2911d96047eSMarkus Pfeiffer uint8_t bLength; 2921d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 2931d96047eSMarkus Pfeiffer uint8_t bMaxBurst; 2941d96047eSMarkus Pfeiffer uint8_t bmAttributes; 2951d96047eSMarkus Pfeiffer uint16_t wBytesPerInterval; 2961d96047eSMarkus Pfeiffer } libusb_ss_endpoint_companion_descriptor __aligned(sizeof(void *)); 2971d96047eSMarkus Pfeiffer 2981d96047eSMarkus Pfeiffer typedef struct libusb_interface_descriptor { 2991d96047eSMarkus Pfeiffer uint8_t bLength; 3001d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 3011d96047eSMarkus Pfeiffer uint8_t bInterfaceNumber; 3021d96047eSMarkus Pfeiffer uint8_t bAlternateSetting; 3031d96047eSMarkus Pfeiffer uint8_t bNumEndpoints; 3041d96047eSMarkus Pfeiffer uint8_t bInterfaceClass; 3051d96047eSMarkus Pfeiffer uint8_t bInterfaceSubClass; 3061d96047eSMarkus Pfeiffer uint8_t bInterfaceProtocol; 3071d96047eSMarkus Pfeiffer uint8_t iInterface; 3081d96047eSMarkus Pfeiffer struct libusb_endpoint_descriptor *endpoint; 3091d96047eSMarkus Pfeiffer uint8_t *extra; 3101d96047eSMarkus Pfeiffer int extra_length; 3111d96047eSMarkus Pfeiffer } libusb_interface_descriptor __aligned(sizeof(void *)); 3121d96047eSMarkus Pfeiffer 3131d96047eSMarkus Pfeiffer typedef struct libusb_interface { 3141d96047eSMarkus Pfeiffer struct libusb_interface_descriptor *altsetting; 3151d96047eSMarkus Pfeiffer int num_altsetting; 3161d96047eSMarkus Pfeiffer } libusb_interface __aligned(sizeof(void *)); 3171d96047eSMarkus Pfeiffer 3181d96047eSMarkus Pfeiffer typedef struct libusb_config_descriptor { 3191d96047eSMarkus Pfeiffer uint8_t bLength; 3201d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 3211d96047eSMarkus Pfeiffer uint16_t wTotalLength; 3221d96047eSMarkus Pfeiffer uint8_t bNumInterfaces; 3231d96047eSMarkus Pfeiffer uint8_t bConfigurationValue; 3241d96047eSMarkus Pfeiffer uint8_t iConfiguration; 3251d96047eSMarkus Pfeiffer uint8_t bmAttributes; 3261d96047eSMarkus Pfeiffer uint8_t MaxPower; 3271d96047eSMarkus Pfeiffer struct libusb_interface *interface; 3281d96047eSMarkus Pfeiffer uint8_t *extra; 3291d96047eSMarkus Pfeiffer int extra_length; 3301d96047eSMarkus Pfeiffer } libusb_config_descriptor __aligned(sizeof(void *)); 3311d96047eSMarkus Pfeiffer 3321d96047eSMarkus Pfeiffer typedef struct libusb_usb_2_0_device_capability_descriptor { 3331d96047eSMarkus Pfeiffer uint8_t bLength; 3341d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 3351d96047eSMarkus Pfeiffer uint8_t bDevCapabilityType; 3361d96047eSMarkus Pfeiffer uint32_t bmAttributes; 3371d96047eSMarkus Pfeiffer #define LIBUSB_USB_2_0_CAPABILITY_LPM_SUPPORT (1 << 1) 3381d96047eSMarkus Pfeiffer } libusb_usb_2_0_device_capability_descriptor __aligned(sizeof(void *)); 3391d96047eSMarkus Pfeiffer 3401d96047eSMarkus Pfeiffer typedef struct libusb_ss_usb_device_capability_descriptor { 3411d96047eSMarkus Pfeiffer uint8_t bLength; 3421d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 3431d96047eSMarkus Pfeiffer uint8_t bDevCapabilityType; 3441d96047eSMarkus Pfeiffer uint8_t bmAttributes; 3451d96047eSMarkus Pfeiffer #define LIBUSB_SS_USB_CAPABILITY_LPM_SUPPORT (1 << 1) 3461d96047eSMarkus Pfeiffer uint16_t wSpeedSupported; 3471d96047eSMarkus Pfeiffer #define LIBUSB_CAPABILITY_LOW_SPEED_OPERATION (1) 3481d96047eSMarkus Pfeiffer #define LIBUSB_CAPABILITY_FULL_SPEED_OPERATION (1 << 1) 3491d96047eSMarkus Pfeiffer #define LIBUSB_CAPABILITY_HIGH_SPEED_OPERATION (1 << 2) 3501d96047eSMarkus Pfeiffer #define LIBUSB_CAPABILITY_5GBPS_OPERATION (1 << 3) 3511d96047eSMarkus Pfeiffer uint8_t bFunctionalitySupport; 3521d96047eSMarkus Pfeiffer uint8_t bU1DevExitLat; 3531d96047eSMarkus Pfeiffer uint16_t wU2DevExitLat; 3541d96047eSMarkus Pfeiffer } libusb_ss_usb_device_capability_descriptor __aligned(sizeof(void *)); 3551d96047eSMarkus Pfeiffer 3561d96047eSMarkus Pfeiffer typedef struct libusb_bos_descriptor { 3571d96047eSMarkus Pfeiffer uint8_t bLength; 3581d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 3591d96047eSMarkus Pfeiffer uint16_t wTotalLength; 3601d96047eSMarkus Pfeiffer uint8_t bNumDeviceCapabilities; 3611d96047eSMarkus Pfeiffer struct libusb_usb_2_0_device_capability_descriptor *usb_2_0_ext_cap; 3621d96047eSMarkus Pfeiffer struct libusb_ss_usb_device_capability_descriptor *ss_usb_cap; 3631d96047eSMarkus Pfeiffer } libusb_bos_descriptor __aligned(sizeof(void *)); 3641d96047eSMarkus Pfeiffer 3651d96047eSMarkus Pfeiffer typedef struct libusb_control_setup { 3661d96047eSMarkus Pfeiffer uint8_t bmRequestType; 3671d96047eSMarkus Pfeiffer uint8_t bRequest; 3681d96047eSMarkus Pfeiffer uint16_t wValue; 3691d96047eSMarkus Pfeiffer uint16_t wIndex; 3701d96047eSMarkus Pfeiffer uint16_t wLength; 3711d96047eSMarkus Pfeiffer } libusb_control_setup; 3721d96047eSMarkus Pfeiffer 3731d96047eSMarkus Pfeiffer #define LIBUSB_CONTROL_SETUP_SIZE 8 /* bytes */ 3741d96047eSMarkus Pfeiffer 3751d96047eSMarkus Pfeiffer typedef struct libusb_iso_packet_descriptor { 3761d96047eSMarkus Pfeiffer uint32_t length; 3771d96047eSMarkus Pfeiffer uint32_t actual_length; 3781d96047eSMarkus Pfeiffer enum libusb_transfer_status status; 3791d96047eSMarkus Pfeiffer } libusb_iso_packet_descriptor __aligned(sizeof(void *)); 3801d96047eSMarkus Pfeiffer 3811d96047eSMarkus Pfeiffer typedef void (*libusb_transfer_cb_fn) (struct libusb_transfer *transfer); 3821d96047eSMarkus Pfeiffer 3831d96047eSMarkus Pfeiffer typedef struct libusb_transfer { 3841d96047eSMarkus Pfeiffer libusb_device_handle *dev_handle; 3851d96047eSMarkus Pfeiffer uint8_t flags; 386aa3e5c14SSascha Wildner uint8_t endpoint; 3871d96047eSMarkus Pfeiffer uint8_t type; 3881d96047eSMarkus Pfeiffer uint32_t timeout; 3891d96047eSMarkus Pfeiffer enum libusb_transfer_status status; 3901d96047eSMarkus Pfeiffer int length; 3911d96047eSMarkus Pfeiffer int actual_length; 3921d96047eSMarkus Pfeiffer libusb_transfer_cb_fn callback; 3931d96047eSMarkus Pfeiffer void *user_data; 3941d96047eSMarkus Pfeiffer uint8_t *buffer; 3951d96047eSMarkus Pfeiffer int num_iso_packets; 3961d96047eSMarkus Pfeiffer struct libusb_iso_packet_descriptor iso_packet_desc[0]; 3971d96047eSMarkus Pfeiffer } libusb_transfer __aligned(sizeof(void *)); 3981d96047eSMarkus Pfeiffer 3991d96047eSMarkus Pfeiffer /* Library initialisation */ 4001d96047eSMarkus Pfeiffer 4011d96047eSMarkus Pfeiffer void libusb_set_debug(libusb_context * ctx, int level); 4021d96047eSMarkus Pfeiffer const char *libusb_strerror(int code); 4031d96047eSMarkus Pfeiffer const char *libusb_error_name(int code); 4041d96047eSMarkus Pfeiffer int libusb_init(libusb_context ** context); 4051d96047eSMarkus Pfeiffer void libusb_exit(struct libusb_context *ctx); 4061d96047eSMarkus Pfeiffer 4071d96047eSMarkus Pfeiffer /* Device handling and enumeration */ 4081d96047eSMarkus Pfeiffer 4091d96047eSMarkus Pfeiffer ssize_t libusb_get_device_list(libusb_context * ctx, libusb_device *** list); 4101d96047eSMarkus Pfeiffer void libusb_free_device_list(libusb_device ** list, int unref_devices); 4111d96047eSMarkus Pfeiffer uint8_t libusb_get_bus_number(libusb_device * dev); 4129b0c1abeSSascha Wildner int libusb_get_port_numbers(libusb_device *dev, uint8_t *buf, uint8_t bufsize); 4139b0c1abeSSascha Wildner int libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t *buf, uint8_t bufsize); 4141d96047eSMarkus Pfeiffer uint8_t libusb_get_device_address(libusb_device * dev); 4151d96047eSMarkus Pfeiffer enum libusb_speed libusb_get_device_speed(libusb_device * dev); 4161d96047eSMarkus Pfeiffer int libusb_clear_halt(libusb_device_handle *devh, uint8_t endpoint); 4171d96047eSMarkus Pfeiffer int libusb_get_max_packet_size(libusb_device * dev, uint8_t endpoint); 418aa3e5c14SSascha Wildner int libusb_get_max_iso_packet_size(libusb_device * dev, uint8_t endpoint); 4191d96047eSMarkus Pfeiffer libusb_device *libusb_ref_device(libusb_device * dev); 4201d96047eSMarkus Pfeiffer void libusb_unref_device(libusb_device * dev); 4211d96047eSMarkus Pfeiffer int libusb_open(libusb_device * dev, libusb_device_handle ** devh); 4221d96047eSMarkus Pfeiffer libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context * ctx, uint16_t vendor_id, uint16_t product_id); 4231d96047eSMarkus Pfeiffer void libusb_close(libusb_device_handle * devh); 4241d96047eSMarkus Pfeiffer libusb_device *libusb_get_device(libusb_device_handle * devh); 4251d96047eSMarkus Pfeiffer int libusb_get_configuration(libusb_device_handle * devh, int *config); 4261d96047eSMarkus Pfeiffer int libusb_set_configuration(libusb_device_handle * devh, int configuration); 4271d96047eSMarkus Pfeiffer int libusb_claim_interface(libusb_device_handle * devh, int interface_number); 4281d96047eSMarkus Pfeiffer int libusb_release_interface(libusb_device_handle * devh, int interface_number); 4291d96047eSMarkus Pfeiffer int libusb_reset_device(libusb_device_handle * devh); 4301d96047eSMarkus Pfeiffer int libusb_check_connected(libusb_device_handle * devh); 4311d96047eSMarkus Pfeiffer int libusb_kernel_driver_active(libusb_device_handle * devh, int interface); 4321d96047eSMarkus Pfeiffer int libusb_get_driver_np(libusb_device_handle * devh, int interface, char *name, int namelen); 4331d96047eSMarkus Pfeiffer int libusb_get_driver(libusb_device_handle * devh, int interface, char *name, int namelen); 4341d96047eSMarkus Pfeiffer int libusb_detach_kernel_driver_np(libusb_device_handle * devh, int interface); 4351d96047eSMarkus Pfeiffer int libusb_detach_kernel_driver(libusb_device_handle * devh, int interface); 4361d96047eSMarkus Pfeiffer int libusb_attach_kernel_driver(libusb_device_handle * devh, int interface); 4371d96047eSMarkus Pfeiffer int libusb_set_interface_alt_setting(libusb_device_handle * devh, int interface_number, int alternate_setting); 4381d96047eSMarkus Pfeiffer 4391d96047eSMarkus Pfeiffer /* USB Descriptors */ 4401d96047eSMarkus Pfeiffer 4411d96047eSMarkus Pfeiffer int libusb_get_device_descriptor(libusb_device * dev, struct libusb_device_descriptor *desc); 4421d96047eSMarkus Pfeiffer int libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_config_descriptor **config); 4431d96047eSMarkus Pfeiffer int libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config); 4441d96047eSMarkus Pfeiffer int libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config); 4451d96047eSMarkus Pfeiffer void libusb_free_config_descriptor(struct libusb_config_descriptor *config); 446aa3e5c14SSascha Wildner int libusb_get_string_descriptor(libusb_device_handle * devh, uint8_t desc_index, uint16_t langid, unsigned char *data, int length); 4471d96047eSMarkus Pfeiffer int libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length); 4481d96047eSMarkus Pfeiffer int libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length); 4491d96047eSMarkus Pfeiffer int libusb_parse_ss_endpoint_comp(const void *buf, int len, struct libusb_ss_endpoint_companion_descriptor **ep_comp); 4501d96047eSMarkus Pfeiffer void libusb_free_ss_endpoint_comp(struct libusb_ss_endpoint_companion_descriptor *ep_comp); 4511d96047eSMarkus Pfeiffer int libusb_parse_bos_descriptor(const void *buf, int len, struct libusb_bos_descriptor **bos); 4521d96047eSMarkus Pfeiffer void libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos); 4531d96047eSMarkus Pfeiffer 4541d96047eSMarkus Pfeiffer /* Asynchronous device I/O */ 4551d96047eSMarkus Pfeiffer 4561d96047eSMarkus Pfeiffer struct libusb_transfer *libusb_alloc_transfer(int iso_packets); 4571d96047eSMarkus Pfeiffer void libusb_free_transfer(struct libusb_transfer *transfer); 4581d96047eSMarkus Pfeiffer int libusb_submit_transfer(struct libusb_transfer *transfer); 4591d96047eSMarkus Pfeiffer int libusb_cancel_transfer(struct libusb_transfer *transfer); 4601d96047eSMarkus Pfeiffer uint8_t *libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index); 4611d96047eSMarkus Pfeiffer uint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index); 4621d96047eSMarkus Pfeiffer void libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length); 4631d96047eSMarkus Pfeiffer uint8_t *libusb_control_transfer_get_data(struct libusb_transfer *transfer); 4641d96047eSMarkus Pfeiffer struct libusb_control_setup *libusb_control_transfer_get_setup(struct libusb_transfer *transfer); 4651d96047eSMarkus Pfeiffer void libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength); 4661d96047eSMarkus Pfeiffer void libusb_fill_control_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t *buf, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout); 4671d96047eSMarkus Pfeiffer void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout); 4681d96047eSMarkus Pfeiffer void libusb_fill_interrupt_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout); 4691d96047eSMarkus Pfeiffer void libusb_fill_iso_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, int npacket, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout); 4701d96047eSMarkus Pfeiffer 4711d96047eSMarkus Pfeiffer /* Polling and timing */ 4721d96047eSMarkus Pfeiffer 4731d96047eSMarkus Pfeiffer int libusb_try_lock_events(libusb_context * ctx); 4741d96047eSMarkus Pfeiffer void libusb_lock_events(libusb_context * ctx); 4751d96047eSMarkus Pfeiffer void libusb_unlock_events(libusb_context * ctx); 4761d96047eSMarkus Pfeiffer int libusb_event_handling_ok(libusb_context * ctx); 4771d96047eSMarkus Pfeiffer int libusb_event_handler_active(libusb_context * ctx); 4781d96047eSMarkus Pfeiffer void libusb_lock_event_waiters(libusb_context * ctx); 4791d96047eSMarkus Pfeiffer void libusb_unlock_event_waiters(libusb_context * ctx); 4801d96047eSMarkus Pfeiffer int libusb_wait_for_event(libusb_context * ctx, struct timeval *tv); 4819b0c1abeSSascha Wildner int libusb_handle_events_timeout_completed(libusb_context * ctx, struct timeval *tv, int *completed); 4829b0c1abeSSascha Wildner int libusb_handle_events_completed(libusb_context * ctx, int *completed); 4831d96047eSMarkus Pfeiffer int libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv); 4841d96047eSMarkus Pfeiffer int libusb_handle_events(libusb_context * ctx); 4851d96047eSMarkus Pfeiffer int libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv); 4861d96047eSMarkus Pfeiffer int libusb_get_next_timeout(libusb_context * ctx, struct timeval *tv); 4871d96047eSMarkus Pfeiffer void libusb_set_pollfd_notifiers(libusb_context * ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data); 4889b0c1abeSSascha Wildner const struct libusb_pollfd **libusb_get_pollfds(libusb_context * ctx); 4891d96047eSMarkus Pfeiffer 4901d96047eSMarkus Pfeiffer /* Synchronous device I/O */ 4911d96047eSMarkus Pfeiffer 4921d96047eSMarkus Pfeiffer int libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, uint32_t timeout); 4931d96047eSMarkus Pfeiffer int libusb_bulk_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout); 4941d96047eSMarkus Pfeiffer int libusb_interrupt_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout); 4951d96047eSMarkus Pfeiffer 4961d96047eSMarkus Pfeiffer /* Byte-order */ 4971d96047eSMarkus Pfeiffer 4981d96047eSMarkus Pfeiffer uint16_t libusb_cpu_to_le16(uint16_t x); 4991d96047eSMarkus Pfeiffer uint16_t libusb_le16_to_cpu(uint16_t x); 5001d96047eSMarkus Pfeiffer 501c4031fc1SImre Vadász /* Hotplug support */ 502c4031fc1SImre Vadász 503c4031fc1SImre Vadász typedef int (*libusb_hotplug_callback_fn)(libusb_context *ctx, 504c4031fc1SImre Vadász libusb_device *device, libusb_hotplug_event event, void *user_data); 505c4031fc1SImre Vadász 506c4031fc1SImre Vadász int 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); 507c4031fc1SImre Vadász void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle handle); 508c4031fc1SImre Vadász 5091d96047eSMarkus Pfeiffer #if 0 5101d96047eSMarkus Pfeiffer { /* indent fix */ 5111d96047eSMarkus Pfeiffer #endif 5121d96047eSMarkus Pfeiffer #ifdef __cplusplus 5131d96047eSMarkus Pfeiffer } 5141d96047eSMarkus Pfeiffer 5151d96047eSMarkus Pfeiffer #endif 5161d96047eSMarkus Pfeiffer 5171d96047eSMarkus Pfeiffer #endif /* __LIBUSB_H__ */ 518