libusb20_desc.h revision 184610
1184610Salfred/* $FreeBSD: head/lib/libusb20/libusb20_desc.h 184610 2008-11-04 02:31:03Z alfred $ */
2184610Salfred/*-
3184610Salfred * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4184610Salfred * Copyright (c) 2007-2008 Daniel Drake.  All rights reserved.
5184610Salfred * Copyright (c) 2001 Johannes Erdfelt.  All rights reserved.
6184610Salfred *
7184610Salfred * Redistribution and use in source and binary forms, with or without
8184610Salfred * modification, are permitted provided that the following conditions
9184610Salfred * are met:
10184610Salfred * 1. Redistributions of source code must retain the above copyright
11184610Salfred *    notice, this list of conditions and the following disclaimer.
12184610Salfred * 2. Redistributions in binary form must reproduce the above copyright
13184610Salfred *    notice, this list of conditions and the following disclaimer in the
14184610Salfred *    documentation and/or other materials provided with the distribution.
15184610Salfred *
16184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19184610Salfred * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26184610Salfred * SUCH DAMAGE.
27184610Salfred */
28184610Salfred
29184610Salfred/*
30184610Salfred * NOTE: This file contains the definition of some standard USB
31184610Salfred * structures. All structures which name ends by *DECODED use host byte
32184610Salfred * order.
33184610Salfred */
34184610Salfred
35184610Salfred/*
36184610Salfred * NOTE: This file uses a lot of macros. If you want to see what the
37184610Salfred * macros become when they are expanded then run the following
38184610Salfred * commands from your shell:
39184610Salfred *
40184610Salfred * cpp libusb20_desc.h > temp.h
41184610Salfred * indent temp.h
42184610Salfred * less temp.h
43184610Salfred */
44184610Salfred
45184610Salfred#ifndef _LIBUSB20_DESC_H_
46184610Salfred#define	_LIBUSB20_DESC_H_
47184610Salfred
48184610Salfred#ifdef __cplusplus
49184610Salfredextern	"C" {
50184610Salfred#endif
51184610Salfred#if 0
52184610Salfred};					/* style */
53184610Salfred
54184610Salfred#endif
55184610Salfred/* basic macros */
56184610Salfred
57184610Salfred#define	LIBUSB20__NOT(...) __VA_ARGS__
58184610Salfred#define	LIBUSB20_NOT(arg) LIBUSB20__NOT(LIBUSB20_YES arg(() LIBUSB20_NO))
59184610Salfred#define	LIBUSB20_YES(...) __VA_ARGS__
60184610Salfred#define	LIBUSB20_NO(...)
61184610Salfred#define	LIBUSB20_END(...) __VA_ARGS__
62184610Salfred#define	LIBUSB20_MAX(a,b) (((a) > (b)) ? (a) : (b))
63184610Salfred#define	LIBUSB20_MIN(a,b) (((a) < (b)) ? (a) : (b))
64184610Salfred
65184610Salfred#define	LIBUSB20_ADD_BYTES(ptr,off) \
66184610Salfred  ((void *)(((const uint8_t *)(ptr)) + (off)))
67184610Salfred
68184610Salfred/* basic message elements */
69184610Salfredenum {
70184610Salfred	LIBUSB20_ME_INT8,
71184610Salfred	LIBUSB20_ME_INT16,
72184610Salfred	LIBUSB20_ME_INT32,
73184610Salfred	LIBUSB20_ME_INT64,
74184610Salfred	LIBUSB20_ME_STRUCT,
75184610Salfred	LIBUSB20_ME_MAX,		/* used to indicate end */
76184610Salfred};
77184610Salfred
78184610Salfred/* basic message element modifiers */
79184610Salfredenum {
80184610Salfred	LIBUSB20_ME_IS_UNSIGNED = 0x00,
81184610Salfred	LIBUSB20_ME_IS_SIGNED = 0x80,
82184610Salfred	LIBUSB20_ME_MASK = 0x7F,
83184610Salfred};
84184610Salfred
85184610Salfredenum {
86184610Salfred	LIBUSB20_ME_IS_RAW,		/* structure excludes length field
87184610Salfred					 * (hardcoded value) */
88184610Salfred	LIBUSB20_ME_IS_ENCODED,		/* structure includes length field */
89184610Salfred	LIBUSB20_ME_IS_EMPTY,		/* no structure */
90184610Salfred	LIBUSB20_ME_IS_DECODED,		/* structure is recursive */
91184610Salfred};
92184610Salfred
93184610Salfred/* basic helper structures and macros */
94184610Salfred
95184610Salfred#define	LIBUSB20_ME_STRUCT_ALIGN sizeof(void *)
96184610Salfred
97184610Salfredstruct libusb20_me_struct {
98184610Salfred	void   *ptr;			/* data pointer */
99184610Salfred	uint16_t len;			/* defaults to zero */
100184610Salfred	uint16_t type;			/* defaults to LIBUSB20_ME_IS_EMPTY */
101184610Salfred} __aligned(LIBUSB20_ME_STRUCT_ALIGN);
102184610Salfred
103184610Salfredstruct libusb20_me_format {
104184610Salfred	const uint8_t *format;		/* always set */
105184610Salfred	const char *desc;		/* optionally set */
106184610Salfred	const char *fields;		/* optionally set */
107184610Salfred};
108184610Salfred
109184610Salfred#define	LIBUSB20_ME_STRUCT(n, field, arg, ismeta)		\
110184610Salfred  ismeta ( LIBUSB20_ME_STRUCT, 1, 0, )			\
111184610Salfred  LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field; )
112184610Salfred
113184610Salfred#define	LIBUSB20_ME_STRUCT_ARRAY(n, field, arg, ismeta)	\
114184610Salfred  ismeta ( LIBUSB20_ME_STRUCT , (arg) & 0xFF,		\
115184610Salfred	   ((arg) / 0x100) & 0xFF, )			\
116184610Salfred  LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field [arg]; )
117184610Salfred
118184610Salfred#define	LIBUSB20_ME_INTEGER(n, field, ismeta, un, u, bits, a, size)	\
119184610Salfred  ismeta ( LIBUSB20_ME_INT##bits |					\
120184610Salfred	   LIBUSB20_ME_IS_##un##SIGNED ,				\
121184610Salfred	   (size) & 0xFF, ((size) / 0x100) & 0xFF, )		\
122184610Salfred  LIBUSB20_NOT(ismeta) ( u##int##bits##_t				\
123184610Salfred		    __aligned((bits) / 8) field a; )
124184610Salfred
125184610Salfred#define	LIBUSB20_ME_UINT8_T(n, field, arg, ismeta) \
126184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, , 1)
127184610Salfred
128184610Salfred#define	LIBUSB20_ME_UINT8_ARRAY_T(n, field, arg, ismeta) \
129184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, [arg], arg)
130184610Salfred
131184610Salfred#define	LIBUSB20_ME_SINT8_T(n, field, arg, ismeta) \
132184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, , 1)
133184610Salfred
134184610Salfred#define	LIBUSB20_ME_SINT8_ARRAY_T(n, field, arg, ismeta) \
135184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, [arg], arg)
136184610Salfred
137184610Salfred#define	LIBUSB20_ME_UINT16_T(n, field, arg, ismeta) \
138184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, , 1)
139184610Salfred
140184610Salfred#define	LIBUSB20_ME_UINT16_ARRAY_T(n, field, arg, ismeta) \
141184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, [arg], arg)
142184610Salfred
143184610Salfred#define	LIBUSB20_ME_SINT16_T(n, field, arg, ismeta) \
144184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, , 1)
145184610Salfred
146184610Salfred#define	LIBUSB20_ME_SINT16_ARRAY_T(n, field, arg, ismeta) \
147184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, [arg], arg)
148184610Salfred
149184610Salfred#define	LIBUSB20_ME_UINT32_T(n, field, arg, ismeta) \
150184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, , 1)
151184610Salfred
152184610Salfred#define	LIBUSB20_ME_UINT32_ARRAY_T(n, field, arg, ismeta) \
153184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, [arg], arg)
154184610Salfred
155184610Salfred#define	LIBUSB20_ME_SINT32_T(n, field, arg, ismeta) \
156184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, , 1)
157184610Salfred
158184610Salfred#define	LIBUSB20_ME_SINT32_ARRAY_T(n, field, arg, ismeta) \
159184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, [arg], arg)
160184610Salfred
161184610Salfred#define	LIBUSB20_ME_UINT64_T(n, field, arg, ismeta) \
162184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, , 1)
163184610Salfred
164184610Salfred#define	LIBUSB20_ME_UINT64_ARRAY_T(n, field, arg, ismeta) \
165184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, [arg], arg)
166184610Salfred
167184610Salfred#define	LIBUSB20_ME_SINT64_T(n, field, arg, ismeta) \
168184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, , 1)
169184610Salfred
170184610Salfred#define	LIBUSB20_ME_SINT64_ARRAY_T(n, field, arg, ismeta) \
171184610Salfred  LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, [arg], arg)
172184610Salfred
173184610Salfred#define	LIBUSB20_MAKE_DECODED_FIELD(n, type, field, arg) \
174184610Salfred  LIBUSB20_ME_##type (n, field, arg, LIBUSB20_NO)
175184610Salfred
176184610Salfred#define	LIBUSB20_MAKE_STRUCT(name)			\
177184610Salfred  extern const struct libusb20_me_format			\
178184610Salfred	 name##_FORMAT[1];				\
179184610Salfred  struct name##_DECODED {				\
180184610Salfred    const struct libusb20_me_format *name##_FORMAT;	\
181184610Salfred    name (LIBUSB20_MAKE_DECODED_FIELD,)			\
182184610Salfred  }
183184610Salfred
184184610Salfred#define	LIBUSB20_MAKE_STRUCT_FORMAT(name)		\
185184610Salfred  const struct libusb20_me_format			\
186184610Salfred    name##_FORMAT[1] = {{			\
187184610Salfred      .format = LIBUSB20_MAKE_FORMAT(name),	\
188184610Salfred      .desc = #name,				\
189184610Salfred      .fields = NULL,				\
190184610Salfred  }}
191184610Salfred
192184610Salfred#define	LIBUSB20_MAKE_FORMAT_SUB(n, type, field, arg) \
193184610Salfred  LIBUSB20_ME_##type (n, field, arg, LIBUSB20_YES)
194184610Salfred
195184610Salfred#define	LIBUSB20_MAKE_FORMAT(what) (const uint8_t []) \
196184610Salfred  { what (LIBUSB20_MAKE_FORMAT_SUB, ) LIBUSB20_ME_MAX, 0, 0 }
197184610Salfred
198184610Salfred#define	LIBUSB20_INIT(what, ptr) do {		\
199184610Salfred    memset(ptr, 0, sizeof(*(ptr)));		\
200184610Salfred    (ptr)->what##_FORMAT = what##_FORMAT;	\
201184610Salfred} while (0)
202184610Salfred
203184610Salfred#define	LIBUSB20_DEVICE_DESC(m,n) \
204184610Salfred  m(n, UINT8_T, bLength, ) \
205184610Salfred  m(n, UINT8_T, bDescriptorType, ) \
206184610Salfred  m(n, UINT16_T, bcdUSB, ) \
207184610Salfred  m(n, UINT8_T, bDeviceClass, ) \
208184610Salfred  m(n, UINT8_T, bDeviceSubClass, ) \
209184610Salfred  m(n, UINT8_T, bDeviceProtocol, ) \
210184610Salfred  m(n, UINT8_T, bMaxPacketSize0, ) \
211184610Salfred  m(n, UINT16_T, idVendor, ) \
212184610Salfred  m(n, UINT16_T, idProduct, ) \
213184610Salfred  m(n, UINT16_T, bcdDevice, ) \
214184610Salfred  m(n, UINT8_T, iManufacturer, ) \
215184610Salfred  m(n, UINT8_T, iProduct, ) \
216184610Salfred  m(n, UINT8_T, iSerialNumber, ) \
217184610Salfred  m(n, UINT8_T, bNumConfigurations, ) \
218184610Salfred
219184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_DEVICE_DESC);
220184610Salfred
221184610Salfred#define	LIBUSB20_ENDPOINT_DESC(m,n) \
222184610Salfred  m(n, UINT8_T,  bLength, ) \
223184610Salfred  m(n, UINT8_T,  bDescriptorType, ) \
224184610Salfred  m(n, UINT8_T,  bEndpointAddress, ) \
225184610Salfred  m(n, UINT8_T,  bmAttributes, ) \
226184610Salfred  m(n, UINT16_T, wMaxPacketSize, ) \
227184610Salfred  m(n, UINT8_T,  bInterval, ) \
228184610Salfred  m(n, UINT8_T,  bRefresh, ) \
229184610Salfred  m(n, UINT8_T,  bSynchAddress, ) \
230184610Salfred
231184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_ENDPOINT_DESC);
232184610Salfred
233184610Salfred#define	LIBUSB20_INTERFACE_DESC(m,n) \
234184610Salfred  m(n, UINT8_T,  bLength, ) \
235184610Salfred  m(n, UINT8_T,  bDescriptorType, ) \
236184610Salfred  m(n, UINT8_T,  bInterfaceNumber, ) \
237184610Salfred  m(n, UINT8_T,  bAlternateSetting, ) \
238184610Salfred  m(n, UINT8_T,  bNumEndpoints, ) \
239184610Salfred  m(n, UINT8_T,  bInterfaceClass, ) \
240184610Salfred  m(n, UINT8_T,  bInterfaceSubClass, ) \
241184610Salfred  m(n, UINT8_T,  bInterfaceProtocol, ) \
242184610Salfred  m(n, UINT8_T,  iInterface, ) \
243184610Salfred
244184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_INTERFACE_DESC);
245184610Salfred
246184610Salfred#define	LIBUSB20_CONFIG_DESC(m,n) \
247184610Salfred  m(n, UINT8_T,  bLength, ) \
248184610Salfred  m(n, UINT8_T,  bDescriptorType, ) \
249184610Salfred  m(n, UINT16_T, wTotalLength, ) \
250184610Salfred  m(n, UINT8_T,  bNumInterfaces, ) \
251184610Salfred  m(n, UINT8_T,  bConfigurationValue, ) \
252184610Salfred  m(n, UINT8_T,  iConfiguration, ) \
253184610Salfred  m(n, UINT8_T,  bmAttributes, ) \
254184610Salfred  m(n, UINT8_T,  bMaxPower, ) \
255184610Salfred
256184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_CONFIG_DESC);
257184610Salfred
258184610Salfred#define	LIBUSB20_CONTROL_SETUP(m,n) \
259184610Salfred  m(n, UINT8_T,  bmRequestType, ) \
260184610Salfred  m(n, UINT8_T,  bRequest, ) \
261184610Salfred  m(n, UINT16_T, wValue, ) \
262184610Salfred  m(n, UINT16_T, wIndex, ) \
263184610Salfred  m(n, UINT16_T, wLength, ) \
264184610Salfred
265184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_CONTROL_SETUP);
266184610Salfred
267184610Salfred/* standard USB stuff */
268184610Salfred
269184610Salfred/** \ingroup desc
270184610Salfred * Device and/or Interface Class codes */
271184610Salfredenum libusb20_class_code {
272184610Salfred	/** In the context of a \ref LIBUSB20_DEVICE_DESC "device
273184610Salfred	 * descriptor", this bDeviceClass value indicates that each
274184610Salfred	 * interface specifies its own class information and all
275184610Salfred	 * interfaces operate independently.
276184610Salfred	 */
277184610Salfred	LIBUSB20_CLASS_PER_INTERFACE = 0,
278184610Salfred
279184610Salfred	/** Audio class */
280184610Salfred	LIBUSB20_CLASS_AUDIO = 1,
281184610Salfred
282184610Salfred	/** Communications class */
283184610Salfred	LIBUSB20_CLASS_COMM = 2,
284184610Salfred
285184610Salfred	/** Human Interface Device class */
286184610Salfred	LIBUSB20_CLASS_HID = 3,
287184610Salfred
288184610Salfred	/** Printer dclass */
289184610Salfred	LIBUSB20_CLASS_PRINTER = 7,
290184610Salfred
291184610Salfred	/** Picture transfer protocol class */
292184610Salfred	LIBUSB20_CLASS_PTP = 6,
293184610Salfred
294184610Salfred	/** Mass storage class */
295184610Salfred	LIBUSB20_CLASS_MASS_STORAGE = 8,
296184610Salfred
297184610Salfred	/** Hub class */
298184610Salfred	LIBUSB20_CLASS_HUB = 9,
299184610Salfred
300184610Salfred	/** Data class */
301184610Salfred	LIBUSB20_CLASS_DATA = 10,
302184610Salfred
303184610Salfred	/** Class is vendor-specific */
304184610Salfred	LIBUSB20_CLASS_VENDOR_SPEC = 0xff,
305184610Salfred};
306184610Salfred
307184610Salfred/** \ingroup desc
308184610Salfred * Descriptor types as defined by the USB specification. */
309184610Salfredenum libusb20_descriptor_type {
310184610Salfred	/** Device descriptor. See LIBUSB20_DEVICE_DESC. */
311184610Salfred	LIBUSB20_DT_DEVICE = 0x01,
312184610Salfred
313184610Salfred	/** Configuration descriptor. See LIBUSB20_CONFIG_DESC. */
314184610Salfred	LIBUSB20_DT_CONFIG = 0x02,
315184610Salfred
316184610Salfred	/** String descriptor */
317184610Salfred	LIBUSB20_DT_STRING = 0x03,
318184610Salfred
319184610Salfred	/** Interface descriptor. See LIBUSB20_INTERFACE_DESC. */
320184610Salfred	LIBUSB20_DT_INTERFACE = 0x04,
321184610Salfred
322184610Salfred	/** Endpoint descriptor. See LIBUSB20_ENDPOINT_DESC. */
323184610Salfred	LIBUSB20_DT_ENDPOINT = 0x05,
324184610Salfred
325184610Salfred	/** HID descriptor */
326184610Salfred	LIBUSB20_DT_HID = 0x21,
327184610Salfred
328184610Salfred	/** HID report descriptor */
329184610Salfred	LIBUSB20_DT_REPORT = 0x22,
330184610Salfred
331184610Salfred	/** Physical descriptor */
332184610Salfred	LIBUSB20_DT_PHYSICAL = 0x23,
333184610Salfred
334184610Salfred	/** Hub descriptor */
335184610Salfred	LIBUSB20_DT_HUB = 0x29,
336184610Salfred};
337184610Salfred
338184610Salfred/* Descriptor sizes per descriptor type */
339184610Salfred#define	LIBUSB20_DT_DEVICE_SIZE			18
340184610Salfred#define	LIBUSB20_DT_CONFIG_SIZE			9
341184610Salfred#define	LIBUSB20_DT_INTERFACE_SIZE		9
342184610Salfred#define	LIBUSB20_DT_ENDPOINT_SIZE		7
343184610Salfred#define	LIBUSB20_DT_ENDPOINT_AUDIO_SIZE		9	/* Audio extension */
344184610Salfred#define	LIBUSB20_DT_HUB_NONVAR_SIZE		7
345184610Salfred
346184610Salfred#define	LIBUSB20_ENDPOINT_ADDRESS_MASK	0x0f	/* in bEndpointAddress */
347184610Salfred#define	LIBUSB20_ENDPOINT_DIR_MASK	0x80
348184610Salfred
349184610Salfred/** \ingroup desc
350184610Salfred * Endpoint direction. Values for bit 7 of the
351184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bEndpointAddress "endpoint address" scheme.
352184610Salfred */
353184610Salfredenum libusb20_endpoint_direction {
354184610Salfred	/** In: device-to-host */
355184610Salfred	LIBUSB20_ENDPOINT_IN = 0x80,
356184610Salfred
357184610Salfred	/** Out: host-to-device */
358184610Salfred	LIBUSB20_ENDPOINT_OUT = 0x00,
359184610Salfred};
360184610Salfred
361184610Salfred#define	LIBUSB20_TRANSFER_TYPE_MASK	0x03	/* in bmAttributes */
362184610Salfred
363184610Salfred/** \ingroup desc
364184610Salfred * Endpoint transfer type. Values for bits 0:1 of the
365184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "endpoint attributes" field.
366184610Salfred */
367184610Salfredenum libusb20_transfer_type {
368184610Salfred	/** Control endpoint */
369184610Salfred	LIBUSB20_TRANSFER_TYPE_CONTROL = 0,
370184610Salfred
371184610Salfred	/** Isochronous endpoint */
372184610Salfred	LIBUSB20_TRANSFER_TYPE_ISOCHRONOUS = 1,
373184610Salfred
374184610Salfred	/** Bulk endpoint */
375184610Salfred	LIBUSB20_TRANSFER_TYPE_BULK = 2,
376184610Salfred
377184610Salfred	/** Interrupt endpoint */
378184610Salfred	LIBUSB20_TRANSFER_TYPE_INTERRUPT = 3,
379184610Salfred};
380184610Salfred
381184610Salfred/** \ingroup misc
382184610Salfred * Standard requests, as defined in table 9-3 of the USB2 specifications */
383184610Salfredenum libusb20_standard_request {
384184610Salfred	/** Request status of the specific recipient */
385184610Salfred	LIBUSB20_REQUEST_GET_STATUS = 0x00,
386184610Salfred
387184610Salfred	/** Clear or disable a specific feature */
388184610Salfred	LIBUSB20_REQUEST_CLEAR_FEATURE = 0x01,
389184610Salfred
390184610Salfred	/* 0x02 is reserved */
391184610Salfred
392184610Salfred	/** Set or enable a specific feature */
393184610Salfred	LIBUSB20_REQUEST_SET_FEATURE = 0x03,
394184610Salfred
395184610Salfred	/* 0x04 is reserved */
396184610Salfred
397184610Salfred	/** Set device address for all future accesses */
398184610Salfred	LIBUSB20_REQUEST_SET_ADDRESS = 0x05,
399184610Salfred
400184610Salfred	/** Get the specified descriptor */
401184610Salfred	LIBUSB20_REQUEST_GET_DESCRIPTOR = 0x06,
402184610Salfred
403184610Salfred	/** Used to update existing descriptors or add new descriptors */
404184610Salfred	LIBUSB20_REQUEST_SET_DESCRIPTOR = 0x07,
405184610Salfred
406184610Salfred	/** Get the current device configuration value */
407184610Salfred	LIBUSB20_REQUEST_GET_CONFIGURATION = 0x08,
408184610Salfred
409184610Salfred	/** Set device configuration */
410184610Salfred	LIBUSB20_REQUEST_SET_CONFIGURATION = 0x09,
411184610Salfred
412184610Salfred	/** Return the selected alternate setting for the specified
413184610Salfred	 * interface */
414184610Salfred	LIBUSB20_REQUEST_GET_INTERFACE = 0x0A,
415184610Salfred
416184610Salfred	/** Select an alternate interface for the specified interface */
417184610Salfred	LIBUSB20_REQUEST_SET_INTERFACE = 0x0B,
418184610Salfred
419184610Salfred	/** Set then report an endpoint's synchronization frame */
420184610Salfred	LIBUSB20_REQUEST_SYNCH_FRAME = 0x0C,
421184610Salfred};
422184610Salfred
423184610Salfred/** \ingroup misc
424184610Salfred * Request type bits of the
425184610Salfred * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in
426184610Salfred * control transfers. */
427184610Salfredenum libusb20_request_type {
428184610Salfred	/** Standard */
429184610Salfred	LIBUSB20_REQUEST_TYPE_STANDARD = (0x00 << 5),
430184610Salfred
431184610Salfred	/** Class */
432184610Salfred	LIBUSB20_REQUEST_TYPE_CLASS = (0x01 << 5),
433184610Salfred
434184610Salfred	/** Vendor */
435184610Salfred	LIBUSB20_REQUEST_TYPE_VENDOR = (0x02 << 5),
436184610Salfred
437184610Salfred	/** Reserved */
438184610Salfred	LIBUSB20_REQUEST_TYPE_RESERVED = (0x03 << 5),
439184610Salfred};
440184610Salfred
441184610Salfred/** \ingroup misc
442184610Salfred * Recipient bits of the
443184610Salfred * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in
444184610Salfred * control transfers. Values 4 through 31 are reserved. */
445184610Salfredenum libusb20_request_recipient {
446184610Salfred	/** Device */
447184610Salfred	LIBUSB20_RECIPIENT_DEVICE = 0x00,
448184610Salfred
449184610Salfred	/** Interface */
450184610Salfred	LIBUSB20_RECIPIENT_INTERFACE = 0x01,
451184610Salfred
452184610Salfred	/** Endpoint */
453184610Salfred	LIBUSB20_RECIPIENT_ENDPOINT = 0x02,
454184610Salfred
455184610Salfred	/** Other */
456184610Salfred	LIBUSB20_RECIPIENT_OTHER = 0x03,
457184610Salfred};
458184610Salfred
459184610Salfred#define	LIBUSB20_ISO_SYNC_TYPE_MASK		0x0C
460184610Salfred
461184610Salfred/** \ingroup desc
462184610Salfred * Synchronization type for isochronous endpoints. Values for bits 2:3
463184610Salfred * of the \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes"
464184610Salfred * field in LIBUSB20_ENDPOINT_DESC.
465184610Salfred */
466184610Salfredenum libusb20_iso_sync_type {
467184610Salfred	/** No synchronization */
468184610Salfred	LIBUSB20_ISO_SYNC_TYPE_NONE = 0,
469184610Salfred
470184610Salfred	/** Asynchronous */
471184610Salfred	LIBUSB20_ISO_SYNC_TYPE_ASYNC = 1,
472184610Salfred
473184610Salfred	/** Adaptive */
474184610Salfred	LIBUSB20_ISO_SYNC_TYPE_ADAPTIVE = 2,
475184610Salfred
476184610Salfred	/** Synchronous */
477184610Salfred	LIBUSB20_ISO_SYNC_TYPE_SYNC = 3,
478184610Salfred};
479184610Salfred
480184610Salfred#define	LIBUSB20_ISO_USAGE_TYPE_MASK 0x30
481184610Salfred
482184610Salfred/** \ingroup desc
483184610Salfred * Usage type for isochronous endpoints. Values for bits 4:5 of the
484184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes" field in
485184610Salfred * LIBUSB20_ENDPOINT_DESC.
486184610Salfred */
487184610Salfredenum libusb20_iso_usage_type {
488184610Salfred	/** Data endpoint */
489184610Salfred	LIBUSB20_ISO_USAGE_TYPE_DATA = 0,
490184610Salfred
491184610Salfred	/** Feedback endpoint */
492184610Salfred	LIBUSB20_ISO_USAGE_TYPE_FEEDBACK = 1,
493184610Salfred
494184610Salfred	/** Implicit feedback Data endpoint */
495184610Salfred	LIBUSB20_ISO_USAGE_TYPE_IMPLICIT = 2,
496184610Salfred};
497184610Salfred
498184610Salfredstruct libusb20_endpoint {
499184610Salfred	struct LIBUSB20_ENDPOINT_DESC_DECODED desc;
500184610Salfred	struct libusb20_me_struct extra;
501184610Salfred} __aligned(sizeof(void *));
502184610Salfred
503184610Salfredstruct libusb20_interface {
504184610Salfred	struct LIBUSB20_INTERFACE_DESC_DECODED desc;
505184610Salfred	struct libusb20_me_struct extra;
506184610Salfred	struct libusb20_interface *altsetting;
507184610Salfred	struct libusb20_endpoint *endpoints;
508184610Salfred	uint8_t	num_altsetting;
509184610Salfred	uint8_t	num_endpoints;
510184610Salfred} __aligned(sizeof(void *));
511184610Salfred
512184610Salfredstruct libusb20_config {
513184610Salfred	struct LIBUSB20_CONFIG_DESC_DECODED desc;
514184610Salfred	struct libusb20_me_struct extra;
515184610Salfred	struct libusb20_interface *interface;
516184610Salfred	uint8_t	num_interface;
517184610Salfred} __aligned(sizeof(void *));
518184610Salfred
519184610Salfreduint8_t	libusb20_me_get_1(const struct libusb20_me_struct *ie, uint16_t offset);
520184610Salfreduint16_t libusb20_me_get_2(const struct libusb20_me_struct *ie, uint16_t offset);
521184610Salfreduint16_t libusb20_me_encode(void *ptr, uint16_t len, const void *pd);
522184610Salfreduint16_t libusb20_me_decode(const void *ptr, uint16_t len, void *pd);
523184610Salfredconst uint8_t *libusb20_desc_foreach(const struct libusb20_me_struct *pdesc, const uint8_t *psubdesc);
524184610Salfredstruct libusb20_config *libusb20_parse_config_desc(const void *config_desc);
525184610Salfred
526184610Salfred#if 0
527184610Salfred{					/* style */
528184610Salfred#endif
529184610Salfred#ifdef __cplusplus
530184610Salfred}
531184610Salfred
532184610Salfred#endif
533184610Salfred
534184610Salfred#endif					/* _LIBUSB20_DESC_H_ */
535