1*9b0c1abeSSascha Wildner /* $FreeBSD: head/lib/libusb/usb.h 248236 2013-03-13 12:23:14Z hselasky $ */ 21d96047eSMarkus Pfeiffer /*- 31d96047eSMarkus Pfeiffer * Copyright (c) 2008 Hans Petter Selasky. 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 _LIBUSB20_COMPAT_01_H_ 281d96047eSMarkus Pfeiffer #define _LIBUSB20_COMPAT_01_H_ 291d96047eSMarkus Pfeiffer 30*9b0c1abeSSascha Wildner #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 31*9b0c1abeSSascha Wildner #include <stdint.h> 321d96047eSMarkus Pfeiffer #include <sys/param.h> 331d96047eSMarkus Pfeiffer #include <sys/endian.h> 34*9b0c1abeSSascha Wildner #endif 351d96047eSMarkus Pfeiffer 361d96047eSMarkus Pfeiffer /* USB interface class codes */ 371d96047eSMarkus Pfeiffer 381d96047eSMarkus Pfeiffer #define USB_CLASS_PER_INTERFACE 0 391d96047eSMarkus Pfeiffer #define USB_CLASS_AUDIO 1 401d96047eSMarkus Pfeiffer #define USB_CLASS_COMM 2 411d96047eSMarkus Pfeiffer #define USB_CLASS_HID 3 421d96047eSMarkus Pfeiffer #define USB_CLASS_PRINTER 7 431d96047eSMarkus Pfeiffer #define USB_CLASS_PTP 6 441d96047eSMarkus Pfeiffer #define USB_CLASS_MASS_STORAGE 8 451d96047eSMarkus Pfeiffer #define USB_CLASS_HUB 9 461d96047eSMarkus Pfeiffer #define USB_CLASS_DATA 10 471d96047eSMarkus Pfeiffer #define USB_CLASS_VENDOR_SPEC 0xff 481d96047eSMarkus Pfeiffer 491d96047eSMarkus Pfeiffer /* USB descriptor types */ 501d96047eSMarkus Pfeiffer 511d96047eSMarkus Pfeiffer #define USB_DT_DEVICE 0x01 521d96047eSMarkus Pfeiffer #define USB_DT_CONFIG 0x02 531d96047eSMarkus Pfeiffer #define USB_DT_STRING 0x03 541d96047eSMarkus Pfeiffer #define USB_DT_INTERFACE 0x04 551d96047eSMarkus Pfeiffer #define USB_DT_ENDPOINT 0x05 561d96047eSMarkus Pfeiffer 571d96047eSMarkus Pfeiffer #define USB_DT_HID 0x21 581d96047eSMarkus Pfeiffer #define USB_DT_REPORT 0x22 591d96047eSMarkus Pfeiffer #define USB_DT_PHYSICAL 0x23 601d96047eSMarkus Pfeiffer #define USB_DT_HUB 0x29 611d96047eSMarkus Pfeiffer 621d96047eSMarkus Pfeiffer /* USB descriptor type sizes */ 631d96047eSMarkus Pfeiffer 641d96047eSMarkus Pfeiffer #define USB_DT_DEVICE_SIZE 18 651d96047eSMarkus Pfeiffer #define USB_DT_CONFIG_SIZE 9 661d96047eSMarkus Pfeiffer #define USB_DT_INTERFACE_SIZE 9 671d96047eSMarkus Pfeiffer #define USB_DT_ENDPOINT_SIZE 7 681d96047eSMarkus Pfeiffer #define USB_DT_ENDPOINT_AUDIO_SIZE 9 691d96047eSMarkus Pfeiffer #define USB_DT_HUB_NONVAR_SIZE 7 701d96047eSMarkus Pfeiffer 711d96047eSMarkus Pfeiffer /* USB descriptor header */ 721d96047eSMarkus Pfeiffer struct usb_descriptor_header { 731d96047eSMarkus Pfeiffer uint8_t bLength; 741d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 751d96047eSMarkus Pfeiffer }; 761d96047eSMarkus Pfeiffer 771d96047eSMarkus Pfeiffer /* USB string descriptor */ 781d96047eSMarkus Pfeiffer struct usb_string_descriptor { 791d96047eSMarkus Pfeiffer uint8_t bLength; 801d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 811d96047eSMarkus Pfeiffer uint16_t wData[1]; 821d96047eSMarkus Pfeiffer }; 831d96047eSMarkus Pfeiffer 841d96047eSMarkus Pfeiffer /* USB HID descriptor */ 851d96047eSMarkus Pfeiffer struct usb_hid_descriptor { 861d96047eSMarkus Pfeiffer uint8_t bLength; 871d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 881d96047eSMarkus Pfeiffer uint16_t bcdHID; 891d96047eSMarkus Pfeiffer uint8_t bCountryCode; 901d96047eSMarkus Pfeiffer uint8_t bNumDescriptors; 911d96047eSMarkus Pfeiffer /* uint8_t bReportDescriptorType; */ 921d96047eSMarkus Pfeiffer /* uint16_t wDescriptorLength; */ 931d96047eSMarkus Pfeiffer /* ... */ 941d96047eSMarkus Pfeiffer }; 951d96047eSMarkus Pfeiffer 961d96047eSMarkus Pfeiffer /* USB endpoint descriptor */ 971d96047eSMarkus Pfeiffer #define USB_MAXENDPOINTS 32 981d96047eSMarkus Pfeiffer struct usb_endpoint_descriptor { 991d96047eSMarkus Pfeiffer uint8_t bLength; 1001d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 1011d96047eSMarkus Pfeiffer uint8_t bEndpointAddress; 1021d96047eSMarkus Pfeiffer #define USB_ENDPOINT_ADDRESS_MASK 0x0f 1031d96047eSMarkus Pfeiffer #define USB_ENDPOINT_DIR_MASK 0x80 1041d96047eSMarkus Pfeiffer uint8_t bmAttributes; 1051d96047eSMarkus Pfeiffer #define USB_ENDPOINT_TYPE_MASK 0x03 1061d96047eSMarkus Pfeiffer #define USB_ENDPOINT_TYPE_CONTROL 0 1071d96047eSMarkus Pfeiffer #define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 1081d96047eSMarkus Pfeiffer #define USB_ENDPOINT_TYPE_BULK 2 1091d96047eSMarkus Pfeiffer #define USB_ENDPOINT_TYPE_INTERRUPT 3 1101d96047eSMarkus Pfeiffer uint16_t wMaxPacketSize; 1111d96047eSMarkus Pfeiffer uint8_t bInterval; 1121d96047eSMarkus Pfeiffer uint8_t bRefresh; 1131d96047eSMarkus Pfeiffer uint8_t bSynchAddress; 1141d96047eSMarkus Pfeiffer 1151d96047eSMarkus Pfeiffer uint8_t *extra; /* Extra descriptors */ 1161d96047eSMarkus Pfeiffer int extralen; 1171d96047eSMarkus Pfeiffer }; 1181d96047eSMarkus Pfeiffer 1191d96047eSMarkus Pfeiffer /* USB interface descriptor */ 1201d96047eSMarkus Pfeiffer #define USB_MAXINTERFACES 32 1211d96047eSMarkus Pfeiffer struct usb_interface_descriptor { 1221d96047eSMarkus Pfeiffer uint8_t bLength; 1231d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 1241d96047eSMarkus Pfeiffer uint8_t bInterfaceNumber; 1251d96047eSMarkus Pfeiffer uint8_t bAlternateSetting; 1261d96047eSMarkus Pfeiffer uint8_t bNumEndpoints; 1271d96047eSMarkus Pfeiffer uint8_t bInterfaceClass; 1281d96047eSMarkus Pfeiffer uint8_t bInterfaceSubClass; 1291d96047eSMarkus Pfeiffer uint8_t bInterfaceProtocol; 1301d96047eSMarkus Pfeiffer uint8_t iInterface; 1311d96047eSMarkus Pfeiffer 1321d96047eSMarkus Pfeiffer struct usb_endpoint_descriptor *endpoint; 1331d96047eSMarkus Pfeiffer 1341d96047eSMarkus Pfeiffer uint8_t *extra; /* Extra descriptors */ 1351d96047eSMarkus Pfeiffer int extralen; 1361d96047eSMarkus Pfeiffer }; 1371d96047eSMarkus Pfeiffer 1381d96047eSMarkus Pfeiffer #define USB_MAXALTSETTING 128 /* Hard limit */ 1391d96047eSMarkus Pfeiffer struct usb_interface { 1401d96047eSMarkus Pfeiffer struct usb_interface_descriptor *altsetting; 1411d96047eSMarkus Pfeiffer 1421d96047eSMarkus Pfeiffer int num_altsetting; 1431d96047eSMarkus Pfeiffer }; 1441d96047eSMarkus Pfeiffer 1451d96047eSMarkus Pfeiffer /* USB configuration descriptor */ 1461d96047eSMarkus Pfeiffer #define USB_MAXCONFIG 8 1471d96047eSMarkus Pfeiffer struct usb_config_descriptor { 1481d96047eSMarkus Pfeiffer uint8_t bLength; 1491d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 1501d96047eSMarkus Pfeiffer uint16_t wTotalLength; 1511d96047eSMarkus Pfeiffer uint8_t bNumInterfaces; 1521d96047eSMarkus Pfeiffer uint8_t bConfigurationValue; 1531d96047eSMarkus Pfeiffer uint8_t iConfiguration; 1541d96047eSMarkus Pfeiffer uint8_t bmAttributes; 1551d96047eSMarkus Pfeiffer uint8_t MaxPower; 1561d96047eSMarkus Pfeiffer 1571d96047eSMarkus Pfeiffer struct usb_interface *interface; 1581d96047eSMarkus Pfeiffer 1591d96047eSMarkus Pfeiffer uint8_t *extra; /* Extra descriptors */ 1601d96047eSMarkus Pfeiffer int extralen; 1611d96047eSMarkus Pfeiffer }; 1621d96047eSMarkus Pfeiffer 1631d96047eSMarkus Pfeiffer /* USB device descriptor */ 1641d96047eSMarkus Pfeiffer struct usb_device_descriptor { 1651d96047eSMarkus Pfeiffer uint8_t bLength; 1661d96047eSMarkus Pfeiffer uint8_t bDescriptorType; 1671d96047eSMarkus Pfeiffer uint16_t bcdUSB; 1681d96047eSMarkus Pfeiffer uint8_t bDeviceClass; 1691d96047eSMarkus Pfeiffer uint8_t bDeviceSubClass; 1701d96047eSMarkus Pfeiffer uint8_t bDeviceProtocol; 1711d96047eSMarkus Pfeiffer uint8_t bMaxPacketSize0; 1721d96047eSMarkus Pfeiffer uint16_t idVendor; 1731d96047eSMarkus Pfeiffer uint16_t idProduct; 1741d96047eSMarkus Pfeiffer uint16_t bcdDevice; 1751d96047eSMarkus Pfeiffer uint8_t iManufacturer; 1761d96047eSMarkus Pfeiffer uint8_t iProduct; 1771d96047eSMarkus Pfeiffer uint8_t iSerialNumber; 1781d96047eSMarkus Pfeiffer uint8_t bNumConfigurations; 1791d96047eSMarkus Pfeiffer }; 1801d96047eSMarkus Pfeiffer 1811d96047eSMarkus Pfeiffer /* USB setup packet */ 1821d96047eSMarkus Pfeiffer struct usb_ctrl_setup { 1831d96047eSMarkus Pfeiffer uint8_t bRequestType; 1841d96047eSMarkus Pfeiffer #define USB_RECIP_DEVICE 0x00 1851d96047eSMarkus Pfeiffer #define USB_RECIP_INTERFACE 0x01 1861d96047eSMarkus Pfeiffer #define USB_RECIP_ENDPOINT 0x02 1871d96047eSMarkus Pfeiffer #define USB_RECIP_OTHER 0x03 1881d96047eSMarkus Pfeiffer #define USB_TYPE_STANDARD (0x00 << 5) 1891d96047eSMarkus Pfeiffer #define USB_TYPE_CLASS (0x01 << 5) 1901d96047eSMarkus Pfeiffer #define USB_TYPE_VENDOR (0x02 << 5) 1911d96047eSMarkus Pfeiffer #define USB_TYPE_RESERVED (0x03 << 5) 1921d96047eSMarkus Pfeiffer #define USB_ENDPOINT_IN 0x80 1931d96047eSMarkus Pfeiffer #define USB_ENDPOINT_OUT 0x00 1941d96047eSMarkus Pfeiffer uint8_t bRequest; 1951d96047eSMarkus Pfeiffer #define USB_REQ_GET_STATUS 0x00 1961d96047eSMarkus Pfeiffer #define USB_REQ_CLEAR_FEATURE 0x01 1971d96047eSMarkus Pfeiffer #define USB_REQ_SET_FEATURE 0x03 1981d96047eSMarkus Pfeiffer #define USB_REQ_SET_ADDRESS 0x05 1991d96047eSMarkus Pfeiffer #define USB_REQ_GET_DESCRIPTOR 0x06 2001d96047eSMarkus Pfeiffer #define USB_REQ_SET_DESCRIPTOR 0x07 2011d96047eSMarkus Pfeiffer #define USB_REQ_GET_CONFIGURATION 0x08 2021d96047eSMarkus Pfeiffer #define USB_REQ_SET_CONFIGURATION 0x09 2031d96047eSMarkus Pfeiffer #define USB_REQ_GET_INTERFACE 0x0A 2041d96047eSMarkus Pfeiffer #define USB_REQ_SET_INTERFACE 0x0B 2051d96047eSMarkus Pfeiffer #define USB_REQ_SYNCH_FRAME 0x0C 2061d96047eSMarkus Pfeiffer uint16_t wValue; 2071d96047eSMarkus Pfeiffer uint16_t wIndex; 2081d96047eSMarkus Pfeiffer uint16_t wLength; 2091d96047eSMarkus Pfeiffer }; 2101d96047eSMarkus Pfeiffer 2111d96047eSMarkus Pfeiffer /* Error codes */ 2121d96047eSMarkus Pfeiffer #define USB_ERROR_BEGIN 500000 2131d96047eSMarkus Pfeiffer 2141d96047eSMarkus Pfeiffer /* Byte swapping */ 2151d96047eSMarkus Pfeiffer #define USB_LE16_TO_CPU(x) le16toh(x) 2161d96047eSMarkus Pfeiffer 2171d96047eSMarkus Pfeiffer /* Data types */ 2181d96047eSMarkus Pfeiffer struct usb_device; 2191d96047eSMarkus Pfeiffer struct usb_bus; 2201d96047eSMarkus Pfeiffer 2211d96047eSMarkus Pfeiffer /* 2221d96047eSMarkus Pfeiffer * To maintain compatibility with applications already built with libusb, 2231d96047eSMarkus Pfeiffer * we must only add entries to the end of this structure. NEVER delete or 2241d96047eSMarkus Pfeiffer * move members and only change types if you really know what you're doing. 2251d96047eSMarkus Pfeiffer */ 2261d96047eSMarkus Pfeiffer struct usb_device { 2271d96047eSMarkus Pfeiffer struct usb_device *next; 2281d96047eSMarkus Pfeiffer struct usb_device *prev; 2291d96047eSMarkus Pfeiffer 2301d96047eSMarkus Pfeiffer char filename[PATH_MAX + 1]; 2311d96047eSMarkus Pfeiffer 2321d96047eSMarkus Pfeiffer struct usb_bus *bus; 2331d96047eSMarkus Pfeiffer 2341d96047eSMarkus Pfeiffer struct usb_device_descriptor descriptor; 2351d96047eSMarkus Pfeiffer struct usb_config_descriptor *config; 2361d96047eSMarkus Pfeiffer 2371d96047eSMarkus Pfeiffer void *dev; 2381d96047eSMarkus Pfeiffer 2391d96047eSMarkus Pfeiffer uint8_t devnum; 2401d96047eSMarkus Pfeiffer 2411d96047eSMarkus Pfeiffer uint8_t num_children; 2421d96047eSMarkus Pfeiffer struct usb_device **children; 2431d96047eSMarkus Pfeiffer }; 2441d96047eSMarkus Pfeiffer 2451d96047eSMarkus Pfeiffer struct usb_bus { 2461d96047eSMarkus Pfeiffer struct usb_bus *next; 2471d96047eSMarkus Pfeiffer struct usb_bus *prev; 2481d96047eSMarkus Pfeiffer 2491d96047eSMarkus Pfeiffer char dirname[PATH_MAX + 1]; 2501d96047eSMarkus Pfeiffer 2511d96047eSMarkus Pfeiffer struct usb_device *devices; 2521d96047eSMarkus Pfeiffer uint32_t location; 2531d96047eSMarkus Pfeiffer 2541d96047eSMarkus Pfeiffer struct usb_device *root_dev; 2551d96047eSMarkus Pfeiffer }; 2561d96047eSMarkus Pfeiffer 2571d96047eSMarkus Pfeiffer struct usb_dev_handle; 2581d96047eSMarkus Pfeiffer typedef struct usb_dev_handle usb_dev_handle; 2591d96047eSMarkus Pfeiffer 2601d96047eSMarkus Pfeiffer /* Variables */ 2611d96047eSMarkus Pfeiffer extern struct usb_bus *usb_busses; 2621d96047eSMarkus Pfeiffer 2631d96047eSMarkus Pfeiffer #ifdef __cplusplus 2641d96047eSMarkus Pfeiffer extern "C" { 2651d96047eSMarkus Pfeiffer #endif 2661d96047eSMarkus Pfeiffer #if 0 2671d96047eSMarkus Pfeiffer } /* style */ 2681d96047eSMarkus Pfeiffer 2691d96047eSMarkus Pfeiffer #endif 2701d96047eSMarkus Pfeiffer 2711d96047eSMarkus Pfeiffer /* Function prototypes from "libusb20_compat01.c" */ 2721d96047eSMarkus Pfeiffer 2731d96047eSMarkus Pfeiffer usb_dev_handle *usb_open(struct usb_device *dev); 2741d96047eSMarkus Pfeiffer int usb_close(usb_dev_handle * dev); 2751d96047eSMarkus Pfeiffer int usb_get_string(usb_dev_handle * dev, int index, int langid, char *buf, size_t buflen); 2761d96047eSMarkus Pfeiffer int usb_get_string_simple(usb_dev_handle * dev, int index, char *buf, size_t buflen); 2771d96047eSMarkus Pfeiffer int usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type, uint8_t index, void *buf, int size); 2781d96047eSMarkus Pfeiffer int usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t index, void *buf, int size); 2791d96047eSMarkus Pfeiffer int usb_parse_descriptor(uint8_t *source, char *description, void *dest); 2801d96047eSMarkus Pfeiffer int usb_parse_configuration(struct usb_config_descriptor *config, uint8_t *buffer); 2811d96047eSMarkus Pfeiffer void usb_destroy_configuration(struct usb_device *dev); 2821d96047eSMarkus Pfeiffer void usb_fetch_and_parse_descriptors(usb_dev_handle * udev); 2831d96047eSMarkus Pfeiffer int usb_bulk_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout); 2841d96047eSMarkus Pfeiffer int usb_bulk_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout); 2851d96047eSMarkus Pfeiffer int usb_interrupt_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout); 2861d96047eSMarkus Pfeiffer int usb_interrupt_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout); 2871d96047eSMarkus Pfeiffer int usb_control_msg(usb_dev_handle * dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout); 2881d96047eSMarkus Pfeiffer int usb_set_configuration(usb_dev_handle * dev, int configuration); 2891d96047eSMarkus Pfeiffer int usb_claim_interface(usb_dev_handle * dev, int interface); 2901d96047eSMarkus Pfeiffer int usb_release_interface(usb_dev_handle * dev, int interface); 2911d96047eSMarkus Pfeiffer int usb_set_altinterface(usb_dev_handle * dev, int alternate); 2921d96047eSMarkus Pfeiffer int usb_resetep(usb_dev_handle * dev, unsigned int ep); 2931d96047eSMarkus Pfeiffer int usb_clear_halt(usb_dev_handle * dev, unsigned int ep); 2941d96047eSMarkus Pfeiffer int usb_reset(usb_dev_handle * dev); 2951d96047eSMarkus Pfeiffer int usb_check_connected(usb_dev_handle * dev); 2961d96047eSMarkus Pfeiffer const char *usb_strerror(void); 2971d96047eSMarkus Pfeiffer void usb_init(void); 2981d96047eSMarkus Pfeiffer void usb_set_debug(int level); 2991d96047eSMarkus Pfeiffer int usb_find_busses(void); 3001d96047eSMarkus Pfeiffer int usb_find_devices(void); 3011d96047eSMarkus Pfeiffer struct usb_device *usb_device(usb_dev_handle * dev); 3021d96047eSMarkus Pfeiffer struct usb_bus *usb_get_busses(void); 3031d96047eSMarkus Pfeiffer int usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen); 3041d96047eSMarkus Pfeiffer int usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface); 3051d96047eSMarkus Pfeiffer 3061d96047eSMarkus Pfeiffer #if 0 3071d96047eSMarkus Pfeiffer { /* style */ 3081d96047eSMarkus Pfeiffer #endif 3091d96047eSMarkus Pfeiffer #ifdef __cplusplus 3101d96047eSMarkus Pfeiffer } 3111d96047eSMarkus Pfeiffer 3121d96047eSMarkus Pfeiffer #endif 3131d96047eSMarkus Pfeiffer 3141d96047eSMarkus Pfeiffer #endif /* _LIBUSB20_COMPAT01_H_ */ 315