1*c5739aa6SSascha Wildner /* $FreeBSD: head/lib/libusb/libusb20_desc.h 277245 2015-01-16 12:11:01Z hselasky $ */ 21d96047eSMarkus Pfeiffer /*- 31d96047eSMarkus Pfeiffer * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 41d96047eSMarkus Pfeiffer * Copyright (c) 2007-2008 Daniel Drake. All rights reserved. 51d96047eSMarkus Pfeiffer * Copyright (c) 2001 Johannes Erdfelt. All rights reserved. 61d96047eSMarkus Pfeiffer * 71d96047eSMarkus Pfeiffer * Redistribution and use in source and binary forms, with or without 81d96047eSMarkus Pfeiffer * modification, are permitted provided that the following conditions 91d96047eSMarkus Pfeiffer * are met: 101d96047eSMarkus Pfeiffer * 1. Redistributions of source code must retain the above copyright 111d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer. 121d96047eSMarkus Pfeiffer * 2. Redistributions in binary form must reproduce the above copyright 131d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer in the 141d96047eSMarkus Pfeiffer * documentation and/or other materials provided with the distribution. 151d96047eSMarkus Pfeiffer * 161d96047eSMarkus Pfeiffer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 171d96047eSMarkus Pfeiffer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 181d96047eSMarkus Pfeiffer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 191d96047eSMarkus Pfeiffer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 201d96047eSMarkus Pfeiffer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 211d96047eSMarkus Pfeiffer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 221d96047eSMarkus Pfeiffer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 231d96047eSMarkus Pfeiffer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 241d96047eSMarkus Pfeiffer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 251d96047eSMarkus Pfeiffer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261d96047eSMarkus Pfeiffer * SUCH DAMAGE. 271d96047eSMarkus Pfeiffer */ 281d96047eSMarkus Pfeiffer 291d96047eSMarkus Pfeiffer /* 301d96047eSMarkus Pfeiffer * NOTE: This file contains the definition of some standard USB 311d96047eSMarkus Pfeiffer * structures. All structures which name ends by *DECODED use host byte 321d96047eSMarkus Pfeiffer * order. 331d96047eSMarkus Pfeiffer */ 341d96047eSMarkus Pfeiffer 351d96047eSMarkus Pfeiffer /* 361d96047eSMarkus Pfeiffer * NOTE: This file uses a lot of macros. If you want to see what the 371d96047eSMarkus Pfeiffer * macros become when they are expanded then run the following 381d96047eSMarkus Pfeiffer * commands from your shell: 391d96047eSMarkus Pfeiffer * 401d96047eSMarkus Pfeiffer * cpp libusb20_desc.h > temp.h 411d96047eSMarkus Pfeiffer * indent temp.h 421d96047eSMarkus Pfeiffer * less temp.h 431d96047eSMarkus Pfeiffer */ 441d96047eSMarkus Pfeiffer 451d96047eSMarkus Pfeiffer #ifndef _LIBUSB20_DESC_H_ 461d96047eSMarkus Pfeiffer #define _LIBUSB20_DESC_H_ 471d96047eSMarkus Pfeiffer 489b0c1abeSSascha Wildner #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 499b0c1abeSSascha Wildner #include <stdint.h> 509b0c1abeSSascha Wildner #endif 519b0c1abeSSascha Wildner 521d96047eSMarkus Pfeiffer #ifdef __cplusplus 531d96047eSMarkus Pfeiffer extern "C" { 541d96047eSMarkus Pfeiffer #endif 551d96047eSMarkus Pfeiffer #if 0 561d96047eSMarkus Pfeiffer }; /* style */ 571d96047eSMarkus Pfeiffer 581d96047eSMarkus Pfeiffer #endif 591d96047eSMarkus Pfeiffer /* basic macros */ 601d96047eSMarkus Pfeiffer 611d96047eSMarkus Pfeiffer #define LIBUSB20__NOT(...) __VA_ARGS__ 621d96047eSMarkus Pfeiffer #define LIBUSB20_NOT(arg) LIBUSB20__NOT(LIBUSB20_YES arg(() LIBUSB20_NO)) 631d96047eSMarkus Pfeiffer #define LIBUSB20_YES(...) __VA_ARGS__ 641d96047eSMarkus Pfeiffer #define LIBUSB20_NO(...) 651d96047eSMarkus Pfeiffer #define LIBUSB20_END(...) __VA_ARGS__ 661d96047eSMarkus Pfeiffer #define LIBUSB20_MAX(a,b) (((a) > (b)) ? (a) : (b)) 671d96047eSMarkus Pfeiffer #define LIBUSB20_MIN(a,b) (((a) < (b)) ? (a) : (b)) 681d96047eSMarkus Pfeiffer 691d96047eSMarkus Pfeiffer #define LIBUSB20_ADD_BYTES(ptr,off) \ 701d96047eSMarkus Pfeiffer ((void *)(((const uint8_t *)(ptr)) + (off) - ((const uint8_t *)0))) 711d96047eSMarkus Pfeiffer 721d96047eSMarkus Pfeiffer /* basic message elements */ 731d96047eSMarkus Pfeiffer enum { 741d96047eSMarkus Pfeiffer LIBUSB20_ME_INT8, 751d96047eSMarkus Pfeiffer LIBUSB20_ME_INT16, 761d96047eSMarkus Pfeiffer LIBUSB20_ME_INT32, 771d96047eSMarkus Pfeiffer LIBUSB20_ME_INT64, 781d96047eSMarkus Pfeiffer LIBUSB20_ME_STRUCT, 791d96047eSMarkus Pfeiffer LIBUSB20_ME_MAX, /* used to indicate end */ 801d96047eSMarkus Pfeiffer }; 811d96047eSMarkus Pfeiffer 821d96047eSMarkus Pfeiffer /* basic message element modifiers */ 831d96047eSMarkus Pfeiffer enum { 841d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_UNSIGNED = 0x00, 851d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_SIGNED = 0x80, 861d96047eSMarkus Pfeiffer LIBUSB20_ME_MASK = 0x7F, 871d96047eSMarkus Pfeiffer }; 881d96047eSMarkus Pfeiffer 891d96047eSMarkus Pfeiffer enum { 901d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_RAW, /* structure excludes length field 911d96047eSMarkus Pfeiffer * (hardcoded value) */ 921d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_ENCODED, /* structure includes length field */ 931d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_EMPTY, /* no structure */ 941d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_DECODED, /* structure is recursive */ 951d96047eSMarkus Pfeiffer }; 961d96047eSMarkus Pfeiffer 971d96047eSMarkus Pfeiffer /* basic helper structures and macros */ 981d96047eSMarkus Pfeiffer 991d96047eSMarkus Pfeiffer #define LIBUSB20_ME_STRUCT_ALIGN sizeof(void *) 1001d96047eSMarkus Pfeiffer 1011d96047eSMarkus Pfeiffer struct libusb20_me_struct { 1021d96047eSMarkus Pfeiffer void *ptr; /* data pointer */ 1031d96047eSMarkus Pfeiffer uint16_t len; /* defaults to zero */ 1041d96047eSMarkus Pfeiffer uint16_t type; /* defaults to LIBUSB20_ME_IS_EMPTY */ 1051d96047eSMarkus Pfeiffer } __aligned(LIBUSB20_ME_STRUCT_ALIGN); 1061d96047eSMarkus Pfeiffer 1071d96047eSMarkus Pfeiffer struct libusb20_me_format { 1081d96047eSMarkus Pfeiffer const uint8_t *format; /* always set */ 1091d96047eSMarkus Pfeiffer const char *desc; /* optionally set */ 1101d96047eSMarkus Pfeiffer const char *fields; /* optionally set */ 1111d96047eSMarkus Pfeiffer }; 1121d96047eSMarkus Pfeiffer 1131d96047eSMarkus Pfeiffer #define LIBUSB20_ME_STRUCT(n, field, arg, ismeta) \ 1141d96047eSMarkus Pfeiffer ismeta ( LIBUSB20_ME_STRUCT, 1, 0, ) \ 1151d96047eSMarkus Pfeiffer LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field; ) 1161d96047eSMarkus Pfeiffer 1171d96047eSMarkus Pfeiffer #define LIBUSB20_ME_STRUCT_ARRAY(n, field, arg, ismeta) \ 1181d96047eSMarkus Pfeiffer ismeta ( LIBUSB20_ME_STRUCT , (arg) & 0xFF, \ 1191d96047eSMarkus Pfeiffer ((arg) / 0x100) & 0xFF, ) \ 1201d96047eSMarkus Pfeiffer LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field [arg]; ) 1211d96047eSMarkus Pfeiffer 1221d96047eSMarkus Pfeiffer #define LIBUSB20_ME_INTEGER(n, field, ismeta, un, u, bits, a, size) \ 1231d96047eSMarkus Pfeiffer ismeta ( LIBUSB20_ME_INT##bits | \ 1241d96047eSMarkus Pfeiffer LIBUSB20_ME_IS_##un##SIGNED , \ 1251d96047eSMarkus Pfeiffer (size) & 0xFF, ((size) / 0x100) & 0xFF, ) \ 1261d96047eSMarkus Pfeiffer LIBUSB20_NOT(ismeta) ( u##int##bits##_t \ 1271d96047eSMarkus Pfeiffer __aligned((bits) / 8) field a; ) 1281d96047eSMarkus Pfeiffer 1291d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT8_T(n, field, arg, ismeta) \ 1301d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, , 1) 1311d96047eSMarkus Pfeiffer 1321d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT8_ARRAY_T(n, field, arg, ismeta) \ 1331d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, [arg], arg) 1341d96047eSMarkus Pfeiffer 1351d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT8_T(n, field, arg, ismeta) \ 1361d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, , 1) 1371d96047eSMarkus Pfeiffer 1381d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT8_ARRAY_T(n, field, arg, ismeta) \ 1391d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, [arg], arg) 1401d96047eSMarkus Pfeiffer 1411d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT16_T(n, field, arg, ismeta) \ 1421d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, , 1) 1431d96047eSMarkus Pfeiffer 1441d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT16_ARRAY_T(n, field, arg, ismeta) \ 1451d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, [arg], arg) 1461d96047eSMarkus Pfeiffer 1471d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT16_T(n, field, arg, ismeta) \ 1481d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, , 1) 1491d96047eSMarkus Pfeiffer 1501d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT16_ARRAY_T(n, field, arg, ismeta) \ 1511d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, [arg], arg) 1521d96047eSMarkus Pfeiffer 1531d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT32_T(n, field, arg, ismeta) \ 1541d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, , 1) 1551d96047eSMarkus Pfeiffer 1561d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT32_ARRAY_T(n, field, arg, ismeta) \ 1571d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, [arg], arg) 1581d96047eSMarkus Pfeiffer 1591d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT32_T(n, field, arg, ismeta) \ 1601d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, , 1) 1611d96047eSMarkus Pfeiffer 1621d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT32_ARRAY_T(n, field, arg, ismeta) \ 1631d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, [arg], arg) 1641d96047eSMarkus Pfeiffer 1651d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT64_T(n, field, arg, ismeta) \ 1661d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, , 1) 1671d96047eSMarkus Pfeiffer 1681d96047eSMarkus Pfeiffer #define LIBUSB20_ME_UINT64_ARRAY_T(n, field, arg, ismeta) \ 1691d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, [arg], arg) 1701d96047eSMarkus Pfeiffer 1711d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT64_T(n, field, arg, ismeta) \ 1721d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, , 1) 1731d96047eSMarkus Pfeiffer 1741d96047eSMarkus Pfeiffer #define LIBUSB20_ME_SINT64_ARRAY_T(n, field, arg, ismeta) \ 1751d96047eSMarkus Pfeiffer LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, [arg], arg) 1761d96047eSMarkus Pfeiffer 1771d96047eSMarkus Pfeiffer #define LIBUSB20_MAKE_DECODED_FIELD(n, type, field, arg) \ 1781d96047eSMarkus Pfeiffer LIBUSB20_ME_##type (n, field, arg, LIBUSB20_NO) 1791d96047eSMarkus Pfeiffer 1801d96047eSMarkus Pfeiffer #define LIBUSB20_MAKE_STRUCT(name) \ 1811d96047eSMarkus Pfeiffer extern const struct libusb20_me_format \ 1821d96047eSMarkus Pfeiffer name##_FORMAT[1]; \ 1831d96047eSMarkus Pfeiffer struct name##_DECODED { \ 1841d96047eSMarkus Pfeiffer const struct libusb20_me_format *name##_FORMAT; \ 1851d96047eSMarkus Pfeiffer name (LIBUSB20_MAKE_DECODED_FIELD,) \ 1861d96047eSMarkus Pfeiffer } 1871d96047eSMarkus Pfeiffer 1881d96047eSMarkus Pfeiffer #define LIBUSB20_MAKE_STRUCT_FORMAT(name) \ 1891d96047eSMarkus Pfeiffer const struct libusb20_me_format \ 1901d96047eSMarkus Pfeiffer name##_FORMAT[1] = {{ \ 1911d96047eSMarkus Pfeiffer .format = LIBUSB20_MAKE_FORMAT(name), \ 1921d96047eSMarkus Pfeiffer .desc = #name, \ 1931d96047eSMarkus Pfeiffer .fields = NULL, \ 1941d96047eSMarkus Pfeiffer }} 1951d96047eSMarkus Pfeiffer 1961d96047eSMarkus Pfeiffer #define LIBUSB20_MAKE_FORMAT_SUB(n, type, field, arg) \ 1971d96047eSMarkus Pfeiffer LIBUSB20_ME_##type (n, field, arg, LIBUSB20_YES) 1981d96047eSMarkus Pfeiffer 1991d96047eSMarkus Pfeiffer #define LIBUSB20_MAKE_FORMAT(what) (const uint8_t []) \ 2001d96047eSMarkus Pfeiffer { what (LIBUSB20_MAKE_FORMAT_SUB, ) LIBUSB20_ME_MAX, 0, 0 } 2011d96047eSMarkus Pfeiffer 2021d96047eSMarkus Pfeiffer #define LIBUSB20_INIT(what, ptr) do { \ 2031d96047eSMarkus Pfeiffer memset(ptr, 0, sizeof(*(ptr))); \ 2041d96047eSMarkus Pfeiffer (ptr)->what##_FORMAT = what##_FORMAT; \ 2051d96047eSMarkus Pfeiffer } while (0) 2061d96047eSMarkus Pfeiffer 2071d96047eSMarkus Pfeiffer #define LIBUSB20_DEVICE_DESC(m,n) \ 2081d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2091d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2101d96047eSMarkus Pfeiffer m(n, UINT16_T, bcdUSB, ) \ 2111d96047eSMarkus Pfeiffer m(n, UINT8_T, bDeviceClass, ) \ 2121d96047eSMarkus Pfeiffer m(n, UINT8_T, bDeviceSubClass, ) \ 2131d96047eSMarkus Pfeiffer m(n, UINT8_T, bDeviceProtocol, ) \ 2141d96047eSMarkus Pfeiffer m(n, UINT8_T, bMaxPacketSize0, ) \ 2151d96047eSMarkus Pfeiffer m(n, UINT16_T, idVendor, ) \ 2161d96047eSMarkus Pfeiffer m(n, UINT16_T, idProduct, ) \ 2171d96047eSMarkus Pfeiffer m(n, UINT16_T, bcdDevice, ) \ 2181d96047eSMarkus Pfeiffer m(n, UINT8_T, iManufacturer, ) \ 2191d96047eSMarkus Pfeiffer m(n, UINT8_T, iProduct, ) \ 2201d96047eSMarkus Pfeiffer m(n, UINT8_T, iSerialNumber, ) \ 2211d96047eSMarkus Pfeiffer m(n, UINT8_T, bNumConfigurations, ) \ 2221d96047eSMarkus Pfeiffer 2231d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_DEVICE_DESC); 2241d96047eSMarkus Pfeiffer 2251d96047eSMarkus Pfeiffer #define LIBUSB20_ENDPOINT_DESC(m,n) \ 2261d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2271d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2281d96047eSMarkus Pfeiffer m(n, UINT8_T, bEndpointAddress, ) \ 2291d96047eSMarkus Pfeiffer m(n, UINT8_T, bmAttributes, ) \ 2301d96047eSMarkus Pfeiffer m(n, UINT16_T, wMaxPacketSize, ) \ 2311d96047eSMarkus Pfeiffer m(n, UINT8_T, bInterval, ) \ 2321d96047eSMarkus Pfeiffer m(n, UINT8_T, bRefresh, ) \ 2331d96047eSMarkus Pfeiffer m(n, UINT8_T, bSynchAddress, ) \ 2341d96047eSMarkus Pfeiffer 2351d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_ENDPOINT_DESC); 2361d96047eSMarkus Pfeiffer 2371d96047eSMarkus Pfeiffer #define LIBUSB20_INTERFACE_DESC(m,n) \ 2381d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2391d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2401d96047eSMarkus Pfeiffer m(n, UINT8_T, bInterfaceNumber, ) \ 2411d96047eSMarkus Pfeiffer m(n, UINT8_T, bAlternateSetting, ) \ 2421d96047eSMarkus Pfeiffer m(n, UINT8_T, bNumEndpoints, ) \ 2431d96047eSMarkus Pfeiffer m(n, UINT8_T, bInterfaceClass, ) \ 2441d96047eSMarkus Pfeiffer m(n, UINT8_T, bInterfaceSubClass, ) \ 2451d96047eSMarkus Pfeiffer m(n, UINT8_T, bInterfaceProtocol, ) \ 2461d96047eSMarkus Pfeiffer m(n, UINT8_T, iInterface, ) \ 2471d96047eSMarkus Pfeiffer 2481d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_INTERFACE_DESC); 2491d96047eSMarkus Pfeiffer 2501d96047eSMarkus Pfeiffer #define LIBUSB20_CONFIG_DESC(m,n) \ 2511d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2521d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2531d96047eSMarkus Pfeiffer m(n, UINT16_T, wTotalLength, ) \ 2541d96047eSMarkus Pfeiffer m(n, UINT8_T, bNumInterfaces, ) \ 2551d96047eSMarkus Pfeiffer m(n, UINT8_T, bConfigurationValue, ) \ 2561d96047eSMarkus Pfeiffer m(n, UINT8_T, iConfiguration, ) \ 2571d96047eSMarkus Pfeiffer m(n, UINT8_T, bmAttributes, ) \ 2581d96047eSMarkus Pfeiffer m(n, UINT8_T, bMaxPower, ) \ 2591d96047eSMarkus Pfeiffer 2601d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_CONFIG_DESC); 2611d96047eSMarkus Pfeiffer 2621d96047eSMarkus Pfeiffer #define LIBUSB20_CONTROL_SETUP(m,n) \ 2631d96047eSMarkus Pfeiffer m(n, UINT8_T, bmRequestType, ) \ 2641d96047eSMarkus Pfeiffer m(n, UINT8_T, bRequest, ) \ 2651d96047eSMarkus Pfeiffer m(n, UINT16_T, wValue, ) \ 2661d96047eSMarkus Pfeiffer m(n, UINT16_T, wIndex, ) \ 2671d96047eSMarkus Pfeiffer m(n, UINT16_T, wLength, ) \ 2681d96047eSMarkus Pfeiffer 2691d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_CONTROL_SETUP); 2701d96047eSMarkus Pfeiffer 2711d96047eSMarkus Pfeiffer #define LIBUSB20_SS_ENDPT_COMP_DESC(m,n) \ 2721d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2731d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2741d96047eSMarkus Pfeiffer m(n, UINT8_T, bMaxBurst, ) \ 2751d96047eSMarkus Pfeiffer m(n, UINT8_T, bmAttributes, ) \ 2761d96047eSMarkus Pfeiffer m(n, UINT16_T, wBytesPerInterval, ) \ 2771d96047eSMarkus Pfeiffer 2781d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_SS_ENDPT_COMP_DESC); 2791d96047eSMarkus Pfeiffer 2801d96047eSMarkus Pfeiffer #define LIBUSB20_USB_20_DEVCAP_DESC(m,n) \ 2811d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2821d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2831d96047eSMarkus Pfeiffer m(n, UINT8_T, bDevCapabilityType, ) \ 2841d96047eSMarkus Pfeiffer m(n, UINT32_T, bmAttributes, ) \ 2851d96047eSMarkus Pfeiffer 2861d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_USB_20_DEVCAP_DESC); 2871d96047eSMarkus Pfeiffer 2881d96047eSMarkus Pfeiffer #define LIBUSB20_SS_USB_DEVCAP_DESC(m,n) \ 2891d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 2901d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 2911d96047eSMarkus Pfeiffer m(n, UINT8_T, bDevCapabilityType, ) \ 2921d96047eSMarkus Pfeiffer m(n, UINT8_T, bmAttributes, ) \ 2931d96047eSMarkus Pfeiffer m(n, UINT16_T, wSpeedSupported, ) \ 2941d96047eSMarkus Pfeiffer m(n, UINT8_T, bFunctionalitySupport, ) \ 2951d96047eSMarkus Pfeiffer m(n, UINT8_T, bU1DevExitLat, ) \ 2961d96047eSMarkus Pfeiffer m(n, UINT16_T, wU2DevExitLat, ) \ 2971d96047eSMarkus Pfeiffer 2981d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_SS_USB_DEVCAP_DESC); 2991d96047eSMarkus Pfeiffer 3001d96047eSMarkus Pfeiffer #define LIBUSB20_BOS_DESCRIPTOR(m,n) \ 3011d96047eSMarkus Pfeiffer m(n, UINT8_T, bLength, ) \ 3021d96047eSMarkus Pfeiffer m(n, UINT8_T, bDescriptorType, ) \ 3031d96047eSMarkus Pfeiffer m(n, UINT16_T, wTotalLength, ) \ 3041d96047eSMarkus Pfeiffer m(n, UINT8_T, bNumDeviceCapabilities, ) \ 3051d96047eSMarkus Pfeiffer 3061d96047eSMarkus Pfeiffer LIBUSB20_MAKE_STRUCT(LIBUSB20_BOS_DESCRIPTOR); 3071d96047eSMarkus Pfeiffer 3081d96047eSMarkus Pfeiffer /* standard USB stuff */ 3091d96047eSMarkus Pfeiffer 3101d96047eSMarkus Pfeiffer /** \ingroup desc 3111d96047eSMarkus Pfeiffer * Device and/or Interface Class codes */ 3121d96047eSMarkus Pfeiffer enum libusb20_class_code { 3131d96047eSMarkus Pfeiffer /** In the context of a \ref LIBUSB20_DEVICE_DESC "device 3141d96047eSMarkus Pfeiffer * descriptor", this bDeviceClass value indicates that each 3151d96047eSMarkus Pfeiffer * interface specifies its own class information and all 3161d96047eSMarkus Pfeiffer * interfaces operate independently. 3171d96047eSMarkus Pfeiffer */ 3181d96047eSMarkus Pfeiffer LIBUSB20_CLASS_PER_INTERFACE = 0, 3191d96047eSMarkus Pfeiffer 3201d96047eSMarkus Pfeiffer /** Audio class */ 3211d96047eSMarkus Pfeiffer LIBUSB20_CLASS_AUDIO = 1, 3221d96047eSMarkus Pfeiffer 3231d96047eSMarkus Pfeiffer /** Communications class */ 3241d96047eSMarkus Pfeiffer LIBUSB20_CLASS_COMM = 2, 3251d96047eSMarkus Pfeiffer 3261d96047eSMarkus Pfeiffer /** Human Interface Device class */ 3271d96047eSMarkus Pfeiffer LIBUSB20_CLASS_HID = 3, 3281d96047eSMarkus Pfeiffer 3291d96047eSMarkus Pfeiffer /** Printer dclass */ 3301d96047eSMarkus Pfeiffer LIBUSB20_CLASS_PRINTER = 7, 3311d96047eSMarkus Pfeiffer 3321d96047eSMarkus Pfeiffer /** Picture transfer protocol class */ 3331d96047eSMarkus Pfeiffer LIBUSB20_CLASS_PTP = 6, 3341d96047eSMarkus Pfeiffer 3351d96047eSMarkus Pfeiffer /** Mass storage class */ 3361d96047eSMarkus Pfeiffer LIBUSB20_CLASS_MASS_STORAGE = 8, 3371d96047eSMarkus Pfeiffer 3381d96047eSMarkus Pfeiffer /** Hub class */ 3391d96047eSMarkus Pfeiffer LIBUSB20_CLASS_HUB = 9, 3401d96047eSMarkus Pfeiffer 3411d96047eSMarkus Pfeiffer /** Data class */ 3421d96047eSMarkus Pfeiffer LIBUSB20_CLASS_DATA = 10, 3431d96047eSMarkus Pfeiffer 3441d96047eSMarkus Pfeiffer /** Class is vendor-specific */ 3451d96047eSMarkus Pfeiffer LIBUSB20_CLASS_VENDOR_SPEC = 0xff, 3461d96047eSMarkus Pfeiffer }; 3471d96047eSMarkus Pfeiffer 3481d96047eSMarkus Pfeiffer /** \ingroup desc 3491d96047eSMarkus Pfeiffer * Descriptor types as defined by the USB specification. */ 3501d96047eSMarkus Pfeiffer enum libusb20_descriptor_type { 3511d96047eSMarkus Pfeiffer /** Device descriptor. See LIBUSB20_DEVICE_DESC. */ 3521d96047eSMarkus Pfeiffer LIBUSB20_DT_DEVICE = 0x01, 3531d96047eSMarkus Pfeiffer 3541d96047eSMarkus Pfeiffer /** Configuration descriptor. See LIBUSB20_CONFIG_DESC. */ 3551d96047eSMarkus Pfeiffer LIBUSB20_DT_CONFIG = 0x02, 3561d96047eSMarkus Pfeiffer 3571d96047eSMarkus Pfeiffer /** String descriptor */ 3581d96047eSMarkus Pfeiffer LIBUSB20_DT_STRING = 0x03, 3591d96047eSMarkus Pfeiffer 3601d96047eSMarkus Pfeiffer /** Interface descriptor. See LIBUSB20_INTERFACE_DESC. */ 3611d96047eSMarkus Pfeiffer LIBUSB20_DT_INTERFACE = 0x04, 3621d96047eSMarkus Pfeiffer 3631d96047eSMarkus Pfeiffer /** Endpoint descriptor. See LIBUSB20_ENDPOINT_DESC. */ 3641d96047eSMarkus Pfeiffer LIBUSB20_DT_ENDPOINT = 0x05, 3651d96047eSMarkus Pfeiffer 3661d96047eSMarkus Pfeiffer /** HID descriptor */ 3671d96047eSMarkus Pfeiffer LIBUSB20_DT_HID = 0x21, 3681d96047eSMarkus Pfeiffer 3691d96047eSMarkus Pfeiffer /** HID report descriptor */ 3701d96047eSMarkus Pfeiffer LIBUSB20_DT_REPORT = 0x22, 3711d96047eSMarkus Pfeiffer 3721d96047eSMarkus Pfeiffer /** Physical descriptor */ 3731d96047eSMarkus Pfeiffer LIBUSB20_DT_PHYSICAL = 0x23, 3741d96047eSMarkus Pfeiffer 3751d96047eSMarkus Pfeiffer /** Hub descriptor */ 3761d96047eSMarkus Pfeiffer LIBUSB20_DT_HUB = 0x29, 3771d96047eSMarkus Pfeiffer 3781d96047eSMarkus Pfeiffer /** Binary Object Store, BOS */ 3791d96047eSMarkus Pfeiffer LIBUSB20_DT_BOS = 0x0f, 3801d96047eSMarkus Pfeiffer 3811d96047eSMarkus Pfeiffer /** Device Capability */ 3821d96047eSMarkus Pfeiffer LIBUSB20_DT_DEVICE_CAPABILITY = 0x10, 3831d96047eSMarkus Pfeiffer 3841d96047eSMarkus Pfeiffer /** SuperSpeed endpoint companion */ 3851d96047eSMarkus Pfeiffer LIBUSB20_DT_SS_ENDPOINT_COMPANION = 0x30, 3861d96047eSMarkus Pfeiffer }; 3871d96047eSMarkus Pfeiffer 3881d96047eSMarkus Pfeiffer /** \ingroup desc 3891d96047eSMarkus Pfeiffer * Device capability types as defined by the USB specification. */ 3901d96047eSMarkus Pfeiffer enum libusb20_device_capability_type { 3911d96047eSMarkus Pfeiffer LIBUSB20_WIRELESS_USB_DEVICE_CAPABILITY = 0x1, 3921d96047eSMarkus Pfeiffer LIBUSB20_USB_2_0_EXTENSION_DEVICE_CAPABILITY = 0x2, 3931d96047eSMarkus Pfeiffer LIBUSB20_SS_USB_DEVICE_CAPABILITY = 0x3, 3941d96047eSMarkus Pfeiffer LIBUSB20_CONTAINER_ID_DEVICE_CAPABILITY = 0x4, 3951d96047eSMarkus Pfeiffer }; 3961d96047eSMarkus Pfeiffer 3971d96047eSMarkus Pfeiffer /* Descriptor sizes per descriptor type */ 3981d96047eSMarkus Pfeiffer #define LIBUSB20_DT_DEVICE_SIZE 18 3991d96047eSMarkus Pfeiffer #define LIBUSB20_DT_CONFIG_SIZE 9 4001d96047eSMarkus Pfeiffer #define LIBUSB20_DT_INTERFACE_SIZE 9 4011d96047eSMarkus Pfeiffer #define LIBUSB20_DT_ENDPOINT_SIZE 7 4021d96047eSMarkus Pfeiffer #define LIBUSB20_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 4031d96047eSMarkus Pfeiffer #define LIBUSB20_DT_HUB_NONVAR_SIZE 7 4041d96047eSMarkus Pfeiffer #define LIBUSB20_DT_SS_ENDPOINT_COMPANION_SIZE 6 4051d96047eSMarkus Pfeiffer #define LIBUSB20_DT_BOS_SIZE 5 4061d96047eSMarkus Pfeiffer #define LIBUSB20_USB_2_0_EXTENSION_DEVICE_CAPABILITY_SIZE 7 4071d96047eSMarkus Pfeiffer #define LIBUSB20_SS_USB_DEVICE_CAPABILITY_SIZE 10 4081d96047eSMarkus Pfeiffer 4091d96047eSMarkus Pfeiffer #define LIBUSB20_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ 4101d96047eSMarkus Pfeiffer #define LIBUSB20_ENDPOINT_DIR_MASK 0x80 4111d96047eSMarkus Pfeiffer 4121d96047eSMarkus Pfeiffer /** \ingroup desc 4131d96047eSMarkus Pfeiffer * Endpoint direction. Values for bit 7 of the 4141d96047eSMarkus Pfeiffer * \ref LIBUSB20_ENDPOINT_DESC::bEndpointAddress "endpoint address" scheme. 4151d96047eSMarkus Pfeiffer */ 4161d96047eSMarkus Pfeiffer enum libusb20_endpoint_direction { 4171d96047eSMarkus Pfeiffer /** In: device-to-host */ 4181d96047eSMarkus Pfeiffer LIBUSB20_ENDPOINT_IN = 0x80, 4191d96047eSMarkus Pfeiffer 4201d96047eSMarkus Pfeiffer /** Out: host-to-device */ 4211d96047eSMarkus Pfeiffer LIBUSB20_ENDPOINT_OUT = 0x00, 4221d96047eSMarkus Pfeiffer }; 4231d96047eSMarkus Pfeiffer 4241d96047eSMarkus Pfeiffer #define LIBUSB20_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ 4251d96047eSMarkus Pfeiffer 4261d96047eSMarkus Pfeiffer /** \ingroup desc 4271d96047eSMarkus Pfeiffer * Endpoint transfer type. Values for bits 0:1 of the 4281d96047eSMarkus Pfeiffer * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "endpoint attributes" field. 4291d96047eSMarkus Pfeiffer */ 4301d96047eSMarkus Pfeiffer enum libusb20_transfer_type { 4311d96047eSMarkus Pfeiffer /** Control endpoint */ 4321d96047eSMarkus Pfeiffer LIBUSB20_TRANSFER_TYPE_CONTROL = 0, 4331d96047eSMarkus Pfeiffer 4341d96047eSMarkus Pfeiffer /** Isochronous endpoint */ 4351d96047eSMarkus Pfeiffer LIBUSB20_TRANSFER_TYPE_ISOCHRONOUS = 1, 4361d96047eSMarkus Pfeiffer 4371d96047eSMarkus Pfeiffer /** Bulk endpoint */ 4381d96047eSMarkus Pfeiffer LIBUSB20_TRANSFER_TYPE_BULK = 2, 4391d96047eSMarkus Pfeiffer 4401d96047eSMarkus Pfeiffer /** Interrupt endpoint */ 4411d96047eSMarkus Pfeiffer LIBUSB20_TRANSFER_TYPE_INTERRUPT = 3, 4421d96047eSMarkus Pfeiffer }; 4431d96047eSMarkus Pfeiffer 4441d96047eSMarkus Pfeiffer /** \ingroup misc 4451d96047eSMarkus Pfeiffer * Standard requests, as defined in table 9-3 of the USB2 specifications */ 4461d96047eSMarkus Pfeiffer enum libusb20_standard_request { 4471d96047eSMarkus Pfeiffer /** Request status of the specific recipient */ 4481d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_GET_STATUS = 0x00, 4491d96047eSMarkus Pfeiffer 4501d96047eSMarkus Pfeiffer /** Clear or disable a specific feature */ 4511d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_CLEAR_FEATURE = 0x01, 4521d96047eSMarkus Pfeiffer 4531d96047eSMarkus Pfeiffer /* 0x02 is reserved */ 4541d96047eSMarkus Pfeiffer 4551d96047eSMarkus Pfeiffer /** Set or enable a specific feature */ 4561d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SET_FEATURE = 0x03, 4571d96047eSMarkus Pfeiffer 4581d96047eSMarkus Pfeiffer /* 0x04 is reserved */ 4591d96047eSMarkus Pfeiffer 4601d96047eSMarkus Pfeiffer /** Set device address for all future accesses */ 4611d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SET_ADDRESS = 0x05, 4621d96047eSMarkus Pfeiffer 4631d96047eSMarkus Pfeiffer /** Get the specified descriptor */ 4641d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_GET_DESCRIPTOR = 0x06, 4651d96047eSMarkus Pfeiffer 4661d96047eSMarkus Pfeiffer /** Used to update existing descriptors or add new descriptors */ 4671d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SET_DESCRIPTOR = 0x07, 4681d96047eSMarkus Pfeiffer 4691d96047eSMarkus Pfeiffer /** Get the current device configuration value */ 4701d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_GET_CONFIGURATION = 0x08, 4711d96047eSMarkus Pfeiffer 4721d96047eSMarkus Pfeiffer /** Set device configuration */ 4731d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SET_CONFIGURATION = 0x09, 4741d96047eSMarkus Pfeiffer 4751d96047eSMarkus Pfeiffer /** Return the selected alternate setting for the specified 4761d96047eSMarkus Pfeiffer * interface */ 4771d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_GET_INTERFACE = 0x0A, 4781d96047eSMarkus Pfeiffer 4791d96047eSMarkus Pfeiffer /** Select an alternate interface for the specified interface */ 4801d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SET_INTERFACE = 0x0B, 4811d96047eSMarkus Pfeiffer 4821d96047eSMarkus Pfeiffer /** Set then report an endpoint's synchronization frame */ 4831d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_SYNCH_FRAME = 0x0C, 484*c5739aa6SSascha Wildner 485*c5739aa6SSascha Wildner /** Set U1 and U2 system exit latency */ 486*c5739aa6SSascha Wildner LIBUSB20_REQUEST_SET_SEL = 0x30, 487*c5739aa6SSascha Wildner 488*c5739aa6SSascha Wildner /** Set isochronous delay */ 489*c5739aa6SSascha Wildner LIBUSB20_REQUEST_SET_ISOCH_DELAY = 0x31, 4901d96047eSMarkus Pfeiffer }; 4911d96047eSMarkus Pfeiffer 4921d96047eSMarkus Pfeiffer /** \ingroup misc 4931d96047eSMarkus Pfeiffer * Request type bits of the 4941d96047eSMarkus Pfeiffer * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in 4951d96047eSMarkus Pfeiffer * control transfers. */ 4961d96047eSMarkus Pfeiffer enum libusb20_request_type { 4971d96047eSMarkus Pfeiffer /** Standard */ 4981d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_TYPE_STANDARD = (0x00 << 5), 4991d96047eSMarkus Pfeiffer 5001d96047eSMarkus Pfeiffer /** Class */ 5011d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_TYPE_CLASS = (0x01 << 5), 5021d96047eSMarkus Pfeiffer 5031d96047eSMarkus Pfeiffer /** Vendor */ 5041d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_TYPE_VENDOR = (0x02 << 5), 5051d96047eSMarkus Pfeiffer 5061d96047eSMarkus Pfeiffer /** Reserved */ 5071d96047eSMarkus Pfeiffer LIBUSB20_REQUEST_TYPE_RESERVED = (0x03 << 5), 5081d96047eSMarkus Pfeiffer }; 5091d96047eSMarkus Pfeiffer 5101d96047eSMarkus Pfeiffer /** \ingroup misc 5111d96047eSMarkus Pfeiffer * Recipient bits of the 5121d96047eSMarkus Pfeiffer * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in 5131d96047eSMarkus Pfeiffer * control transfers. Values 4 through 31 are reserved. */ 5141d96047eSMarkus Pfeiffer enum libusb20_request_recipient { 5151d96047eSMarkus Pfeiffer /** Device */ 5161d96047eSMarkus Pfeiffer LIBUSB20_RECIPIENT_DEVICE = 0x00, 5171d96047eSMarkus Pfeiffer 5181d96047eSMarkus Pfeiffer /** Interface */ 5191d96047eSMarkus Pfeiffer LIBUSB20_RECIPIENT_INTERFACE = 0x01, 5201d96047eSMarkus Pfeiffer 5211d96047eSMarkus Pfeiffer /** Endpoint */ 5221d96047eSMarkus Pfeiffer LIBUSB20_RECIPIENT_ENDPOINT = 0x02, 5231d96047eSMarkus Pfeiffer 5241d96047eSMarkus Pfeiffer /** Other */ 5251d96047eSMarkus Pfeiffer LIBUSB20_RECIPIENT_OTHER = 0x03, 5261d96047eSMarkus Pfeiffer }; 5271d96047eSMarkus Pfeiffer 5281d96047eSMarkus Pfeiffer #define LIBUSB20_ISO_SYNC_TYPE_MASK 0x0C 5291d96047eSMarkus Pfeiffer 5301d96047eSMarkus Pfeiffer /** \ingroup desc 5311d96047eSMarkus Pfeiffer * Synchronization type for isochronous endpoints. Values for bits 2:3 5321d96047eSMarkus Pfeiffer * of the \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes" 5331d96047eSMarkus Pfeiffer * field in LIBUSB20_ENDPOINT_DESC. 5341d96047eSMarkus Pfeiffer */ 5351d96047eSMarkus Pfeiffer enum libusb20_iso_sync_type { 5361d96047eSMarkus Pfeiffer /** No synchronization */ 5371d96047eSMarkus Pfeiffer LIBUSB20_ISO_SYNC_TYPE_NONE = 0, 5381d96047eSMarkus Pfeiffer 5391d96047eSMarkus Pfeiffer /** Asynchronous */ 5401d96047eSMarkus Pfeiffer LIBUSB20_ISO_SYNC_TYPE_ASYNC = 1, 5411d96047eSMarkus Pfeiffer 5421d96047eSMarkus Pfeiffer /** Adaptive */ 5431d96047eSMarkus Pfeiffer LIBUSB20_ISO_SYNC_TYPE_ADAPTIVE = 2, 5441d96047eSMarkus Pfeiffer 5451d96047eSMarkus Pfeiffer /** Synchronous */ 5461d96047eSMarkus Pfeiffer LIBUSB20_ISO_SYNC_TYPE_SYNC = 3, 5471d96047eSMarkus Pfeiffer }; 5481d96047eSMarkus Pfeiffer 5491d96047eSMarkus Pfeiffer #define LIBUSB20_ISO_USAGE_TYPE_MASK 0x30 5501d96047eSMarkus Pfeiffer 5511d96047eSMarkus Pfeiffer /** \ingroup desc 5521d96047eSMarkus Pfeiffer * Usage type for isochronous endpoints. Values for bits 4:5 of the 5531d96047eSMarkus Pfeiffer * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes" field in 5541d96047eSMarkus Pfeiffer * LIBUSB20_ENDPOINT_DESC. 5551d96047eSMarkus Pfeiffer */ 5561d96047eSMarkus Pfeiffer enum libusb20_iso_usage_type { 5571d96047eSMarkus Pfeiffer /** Data endpoint */ 5581d96047eSMarkus Pfeiffer LIBUSB20_ISO_USAGE_TYPE_DATA = 0, 5591d96047eSMarkus Pfeiffer 5601d96047eSMarkus Pfeiffer /** Feedback endpoint */ 5611d96047eSMarkus Pfeiffer LIBUSB20_ISO_USAGE_TYPE_FEEDBACK = 1, 5621d96047eSMarkus Pfeiffer 5631d96047eSMarkus Pfeiffer /** Implicit feedback Data endpoint */ 5641d96047eSMarkus Pfeiffer LIBUSB20_ISO_USAGE_TYPE_IMPLICIT = 2, 5651d96047eSMarkus Pfeiffer }; 5661d96047eSMarkus Pfeiffer 5671d96047eSMarkus Pfeiffer struct libusb20_endpoint { 5681d96047eSMarkus Pfeiffer struct LIBUSB20_ENDPOINT_DESC_DECODED desc; 5691d96047eSMarkus Pfeiffer struct libusb20_me_struct extra; 5701d96047eSMarkus Pfeiffer } __aligned(sizeof(void *)); 5711d96047eSMarkus Pfeiffer 5721d96047eSMarkus Pfeiffer struct libusb20_interface { 5731d96047eSMarkus Pfeiffer struct LIBUSB20_INTERFACE_DESC_DECODED desc; 5741d96047eSMarkus Pfeiffer struct libusb20_me_struct extra; 5751d96047eSMarkus Pfeiffer struct libusb20_interface *altsetting; 5761d96047eSMarkus Pfeiffer struct libusb20_endpoint *endpoints; 5771d96047eSMarkus Pfeiffer uint8_t num_altsetting; 5781d96047eSMarkus Pfeiffer uint8_t num_endpoints; 5791d96047eSMarkus Pfeiffer } __aligned(sizeof(void *)); 5801d96047eSMarkus Pfeiffer 5811d96047eSMarkus Pfeiffer struct libusb20_config { 5821d96047eSMarkus Pfeiffer struct LIBUSB20_CONFIG_DESC_DECODED desc; 5831d96047eSMarkus Pfeiffer struct libusb20_me_struct extra; 5841d96047eSMarkus Pfeiffer struct libusb20_interface *interface; 5851d96047eSMarkus Pfeiffer uint8_t num_interface; 5861d96047eSMarkus Pfeiffer } __aligned(sizeof(void *)); 5871d96047eSMarkus Pfeiffer 5881d96047eSMarkus Pfeiffer uint8_t libusb20_me_get_1(const struct libusb20_me_struct *ie, uint16_t offset); 5891d96047eSMarkus Pfeiffer uint16_t libusb20_me_get_2(const struct libusb20_me_struct *ie, uint16_t offset); 5901d96047eSMarkus Pfeiffer uint16_t libusb20_me_encode(void *ptr, uint16_t len, const void *pd); 5911d96047eSMarkus Pfeiffer uint16_t libusb20_me_decode(const void *ptr, uint16_t len, void *pd); 5921d96047eSMarkus Pfeiffer const uint8_t *libusb20_desc_foreach(const struct libusb20_me_struct *pdesc, const uint8_t *psubdesc); 5931d96047eSMarkus Pfeiffer struct libusb20_config *libusb20_parse_config_desc(const void *config_desc); 5941d96047eSMarkus Pfeiffer 5951d96047eSMarkus Pfeiffer #if 0 5961d96047eSMarkus Pfeiffer { /* style */ 5971d96047eSMarkus Pfeiffer #endif 5981d96047eSMarkus Pfeiffer #ifdef __cplusplus 5991d96047eSMarkus Pfeiffer } 6001d96047eSMarkus Pfeiffer 6011d96047eSMarkus Pfeiffer #endif 6021d96047eSMarkus Pfeiffer 6031d96047eSMarkus Pfeiffer #endif /* _LIBUSB20_DESC_H_ */ 604