xref: /dragonfly/lib/libusb/libusb20_desc.h (revision c5739aa6)
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