xref: /rk3399_rockchip-uboot/include/usbdescriptors.h (revision 326ea986ac150acdc7656d57fca647db80b50158)
1232c150aSwdenk /*
2232c150aSwdenk  * (C) Copyright 2003
3232c150aSwdenk  * Gerry Hamel, geh@ti.com, Texas Instruments
4232c150aSwdenk  *
5232c150aSwdenk  * Based on
6232c150aSwdenk  * linux/drivers/usbd/usb-function.h - USB Function
7232c150aSwdenk  *
8232c150aSwdenk  * Copyright (c) 2000, 2001, 2002 Lineo
9232c150aSwdenk  * Copyright (c) 2001 Hewlett Packard
10232c150aSwdenk  *
11232c150aSwdenk  * By:
12232c150aSwdenk  *	Stuart Lynne <sl@lineo.com>,
13232c150aSwdenk  *	Tom Rushworth <tbr@lineo.com>,
14232c150aSwdenk  *	Bruce Balden <balden@lineo.com>
15232c150aSwdenk  *
16*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
17232c150aSwdenk  */
18232c150aSwdenk 
19232c150aSwdenk /* USB Descriptors - Create a complete description of all of the
20232c150aSwdenk  * function driver capabilities. These map directly to the USB descriptors.
21232c150aSwdenk  *
22232c150aSwdenk  * This heirarchy is created by the functions drivers and is passed to the
23232c150aSwdenk  * usb-device driver when the function driver is registered.
24232c150aSwdenk  *
25232c150aSwdenk  *  device
26232c150aSwdenk  *	configuration
27232c150aSwdenk  *	     interface
28232c150aSwdenk  *		alternate
29232c150aSwdenk  *		     class
30232c150aSwdenk  *		     class
31232c150aSwdenk  *		alternate
32232c150aSwdenk  *		     endpoint
33232c150aSwdenk  *		     endpoint
34232c150aSwdenk  *	     interface
35232c150aSwdenk  *		alternate
36232c150aSwdenk  *		     endpoint
37232c150aSwdenk  *		     endpoint
38232c150aSwdenk  *	configuration
39232c150aSwdenk  *	     interface
40232c150aSwdenk  *		alternate
41232c150aSwdenk  *		     endpoint
42232c150aSwdenk  *		     endpoint
43232c150aSwdenk  *
44232c150aSwdenk  *
45232c150aSwdenk  * The configuration structures refer to the USB Configurations that will be
46232c150aSwdenk  * made available to a USB HOST during the enumeration process.
47232c150aSwdenk  *
48232c150aSwdenk  * The USB HOST will select a configuration and optionally an interface with
49232c150aSwdenk  * the usb set configuration and set interface commands.
50232c150aSwdenk  *
51232c150aSwdenk  * The selected interface (or the default interface if not specifically
52232c150aSwdenk  * selected) will define the list of endpoints that will be used.
53232c150aSwdenk  *
54232c150aSwdenk  * The configuration and interfaces are stored in an array that is indexed
55232c150aSwdenk  * by the specified configuratin or interface number minus one.
56232c150aSwdenk  *
57232c150aSwdenk  * A configuration number of zero is used to specify a return to the unconfigured
58232c150aSwdenk  * state.
59232c150aSwdenk  *
60232c150aSwdenk  */
61232c150aSwdenk 
62232c150aSwdenk 
63232c150aSwdenk #ifndef __USBDESCRIPTORS_H__
64232c150aSwdenk #define __USBDESCRIPTORS_H__
65232c150aSwdenk 
66232c150aSwdenk #include <asm/types.h>
67232c150aSwdenk 
68232c150aSwdenk /*
69232c150aSwdenk  * communications class types
70232c150aSwdenk  *
71232c150aSwdenk  * c.f. CDC  USB Class Definitions for Communications Devices
72232c150aSwdenk  * c.f. WMCD USB CDC Subclass Specification for Wireless Mobile Communications Devices
73232c150aSwdenk  *
74232c150aSwdenk  */
75232c150aSwdenk 
76232c150aSwdenk #define CLASS_BCD_VERSION		0x0110
77232c150aSwdenk 
78232c150aSwdenk /* c.f. CDC 4.1 Table 14 */
79232c150aSwdenk #define COMMUNICATIONS_DEVICE_CLASS	0x02
80232c150aSwdenk 
81232c150aSwdenk /* c.f. CDC 4.2 Table 15 */
8216c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_CONTROL	0x02
8316c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_DATA		0x0A
8416c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_VENDOR	0x0FF
85232c150aSwdenk 
86232c150aSwdenk /* c.f. CDC 4.3 Table 16 */
87232c150aSwdenk #define COMMUNICATIONS_NO_SUBCLASS		0x00
88232c150aSwdenk #define COMMUNICATIONS_DLCM_SUBCLASS	0x01
89232c150aSwdenk #define COMMUNICATIONS_ACM_SUBCLASS		0x02
90232c150aSwdenk #define COMMUNICATIONS_TCM_SUBCLASS		0x03
91232c150aSwdenk #define COMMUNICATIONS_MCCM_SUBCLASS	0x04
92232c150aSwdenk #define COMMUNICATIONS_CCM_SUBCLASS		0x05
93232c150aSwdenk #define COMMUNICATIONS_ENCM_SUBCLASS	0x06
94232c150aSwdenk #define COMMUNICATIONS_ANCM_SUBCLASS	0x07
95232c150aSwdenk 
96232c150aSwdenk /* c.f. WMCD 5.1 */
97232c150aSwdenk #define COMMUNICATIONS_WHCM_SUBCLASS	0x08
98232c150aSwdenk #define COMMUNICATIONS_DMM_SUBCLASS		0x09
99232c150aSwdenk #define COMMUNICATIONS_MDLM_SUBCLASS	0x0a
100232c150aSwdenk #define COMMUNICATIONS_OBEX_SUBCLASS	0x0b
101232c150aSwdenk 
10216c8d5e7SWolfgang Denk /* c.f. CDC 4.4 Table 17 */
10316c8d5e7SWolfgang Denk #define COMMUNICATIONS_NO_PROTOCOL		0x00
10416c8d5e7SWolfgang Denk #define COMMUNICATIONS_V25TER_PROTOCOL	0x01	/*Common AT Hayes compatible*/
10516c8d5e7SWolfgang Denk 
10616c8d5e7SWolfgang Denk /* c.f. CDC 4.5 Table 18 */
107232c150aSwdenk #define DATA_INTERFACE_CLASS		0x0a
108232c150aSwdenk 
10916c8d5e7SWolfgang Denk /* c.f. CDC 4.6 No Table */
11016c8d5e7SWolfgang Denk #define DATA_INTERFACE_SUBCLASS_NONE	0x00	/* No subclass pertinent */
11116c8d5e7SWolfgang Denk 
112232c150aSwdenk /* c.f. CDC 4.7 Table 19 */
11316c8d5e7SWolfgang Denk #define DATA_INTERFACE_PROTOCOL_NONE	0x00	/* No class protcol required */
114232c150aSwdenk 
115232c150aSwdenk 
116232c150aSwdenk /* c.f. CDC 5.2.3 Table 24 */
117232c150aSwdenk #define CS_INTERFACE		0x24
118232c150aSwdenk #define CS_ENDPOINT			0x25
119232c150aSwdenk 
120232c150aSwdenk /*
121232c150aSwdenk  * bDescriptorSubtypes
122232c150aSwdenk  *
123232c150aSwdenk  * c.f. CDC 5.2.3 Table 25
124232c150aSwdenk  * c.f. WMCD 5.3 Table 5.3
125232c150aSwdenk  */
126232c150aSwdenk 
127232c150aSwdenk #define USB_ST_HEADER		0x00
128232c150aSwdenk #define USB_ST_CMF			0x01
129232c150aSwdenk #define USB_ST_ACMF			0x02
130232c150aSwdenk #define USB_ST_DLMF			0x03
131232c150aSwdenk #define USB_ST_TRF			0x04
132232c150aSwdenk #define USB_ST_TCLF			0x05
133232c150aSwdenk #define USB_ST_UF			0x06
134232c150aSwdenk #define USB_ST_CSF			0x07
135232c150aSwdenk #define USB_ST_TOMF			0x08
136232c150aSwdenk #define USB_ST_USBTF		0x09
137232c150aSwdenk #define USB_ST_NCT			0x0a
138232c150aSwdenk #define USB_ST_PUF			0x0b
139232c150aSwdenk #define USB_ST_EUF			0x0c
140232c150aSwdenk #define USB_ST_MCMF			0x0d
141232c150aSwdenk #define USB_ST_CCMF			0x0e
142232c150aSwdenk #define USB_ST_ENF			0x0f
143232c150aSwdenk #define USB_ST_ATMNF		0x10
144232c150aSwdenk 
145232c150aSwdenk #define USB_ST_WHCM			0x11
146232c150aSwdenk #define USB_ST_MDLM			0x12
147232c150aSwdenk #define USB_ST_MDLMD		0x13
148232c150aSwdenk #define USB_ST_DMM			0x14
149232c150aSwdenk #define USB_ST_OBEX			0x15
150232c150aSwdenk #define USB_ST_CS			0x16
151232c150aSwdenk #define USB_ST_CSD			0x17
152232c150aSwdenk #define USB_ST_TCM			0x18
153232c150aSwdenk 
154232c150aSwdenk /* endpoint modifiers
155232c150aSwdenk  * static struct usb_endpoint_description function_default_A_1[] = {
156232c150aSwdenk  *
157232c150aSwdenk  *     {this_endpoint: 0, attributes: CONTROL,	 max_size: 8,  polling_interval: 0 },
158232c150aSwdenk  *     {this_endpoint: 1, attributes: BULK,	 max_size: 64, polling_interval: 0, direction: IN},
159232c150aSwdenk  *     {this_endpoint: 2, attributes: BULK,	 max_size: 64, polling_interval: 0, direction: OUT},
160232c150aSwdenk  *     {this_endpoint: 3, attributes: INTERRUPT, max_size: 8,  polling_interval: 0},
161232c150aSwdenk  *
162232c150aSwdenk  *
163232c150aSwdenk  */
164232c150aSwdenk #define OUT		0x00
165232c150aSwdenk #define IN		0x80
166232c150aSwdenk 
167232c150aSwdenk #define CONTROL		0x00
168232c150aSwdenk #define ISOCHRONOUS	0x01
169232c150aSwdenk #define BULK		0x02
170232c150aSwdenk #define INTERRUPT	0x03
171232c150aSwdenk 
172232c150aSwdenk 
173232c150aSwdenk /* configuration modifiers
174232c150aSwdenk  */
175232c150aSwdenk #define BMATTRIBUTE_RESERVED		0x80
176232c150aSwdenk #define BMATTRIBUTE_SELF_POWERED	0x40
177232c150aSwdenk 
178232c150aSwdenk /*
179232c150aSwdenk  * standard usb descriptor structures
180232c150aSwdenk  */
181232c150aSwdenk 
182232c150aSwdenk struct usb_endpoint_descriptor {
183232c150aSwdenk 	u8 bLength;
184232c150aSwdenk 	u8 bDescriptorType;	/* 0x5 */
185232c150aSwdenk 	u8 bEndpointAddress;
186232c150aSwdenk 	u8 bmAttributes;
187232c150aSwdenk 	u16 wMaxPacketSize;
188232c150aSwdenk 	u8 bInterval;
189b2fb47f1STom Rini } __attribute__ ((packed));
190232c150aSwdenk 
191232c150aSwdenk struct usb_interface_descriptor {
192232c150aSwdenk 	u8 bLength;
193232c150aSwdenk 	u8 bDescriptorType;	/* 0x04 */
194232c150aSwdenk 	u8 bInterfaceNumber;
195232c150aSwdenk 	u8 bAlternateSetting;
196232c150aSwdenk 	u8 bNumEndpoints;
197232c150aSwdenk 	u8 bInterfaceClass;
198232c150aSwdenk 	u8 bInterfaceSubClass;
199232c150aSwdenk 	u8 bInterfaceProtocol;
200232c150aSwdenk 	u8 iInterface;
201232c150aSwdenk } __attribute__ ((packed));
202232c150aSwdenk 
203232c150aSwdenk struct usb_configuration_descriptor {
204232c150aSwdenk 	u8 bLength;
205232c150aSwdenk 	u8 bDescriptorType;	/* 0x2 */
206232c150aSwdenk 	u16 wTotalLength;
207232c150aSwdenk 	u8 bNumInterfaces;
208232c150aSwdenk 	u8 bConfigurationValue;
209232c150aSwdenk 	u8 iConfiguration;
210232c150aSwdenk 	u8 bmAttributes;
211232c150aSwdenk 	u8 bMaxPower;
212232c150aSwdenk } __attribute__ ((packed));
213232c150aSwdenk 
214232c150aSwdenk struct usb_device_descriptor {
215232c150aSwdenk 	u8 bLength;
216232c150aSwdenk 	u8 bDescriptorType;	/* 0x01 */
217232c150aSwdenk 	u16 bcdUSB;
218232c150aSwdenk 	u8 bDeviceClass;
219232c150aSwdenk 	u8 bDeviceSubClass;
220232c150aSwdenk 	u8 bDeviceProtocol;
221232c150aSwdenk 	u8 bMaxPacketSize0;
222232c150aSwdenk 	u16 idVendor;
223232c150aSwdenk 	u16 idProduct;
224232c150aSwdenk 	u16 bcdDevice;
225232c150aSwdenk 	u8 iManufacturer;
226232c150aSwdenk 	u8 iProduct;
227232c150aSwdenk 	u8 iSerialNumber;
228232c150aSwdenk 	u8 bNumConfigurations;
229232c150aSwdenk } __attribute__ ((packed));
230232c150aSwdenk 
231f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS)
232f9da0f89SVipin KUMAR struct usb_qualifier_descriptor {
233f9da0f89SVipin KUMAR 	u8 bLength;
234f9da0f89SVipin KUMAR 	u8 bDescriptorType;
235f9da0f89SVipin KUMAR 
236f9da0f89SVipin KUMAR 	u16 bcdUSB;
237f9da0f89SVipin KUMAR 	u8 bDeviceClass;
238f9da0f89SVipin KUMAR 	u8 bDeviceSubClass;
239f9da0f89SVipin KUMAR 	u8 bDeviceProtocol;
240f9da0f89SVipin KUMAR 	u8 bMaxPacketSize0;
241f9da0f89SVipin KUMAR 	u8 bNumConfigurations;
242f9da0f89SVipin KUMAR 	u8 breserved;
243f9da0f89SVipin KUMAR } __attribute__ ((packed));
244f9da0f89SVipin KUMAR #endif
245f9da0f89SVipin KUMAR 
246232c150aSwdenk struct usb_string_descriptor {
247232c150aSwdenk 	u8 bLength;
248232c150aSwdenk 	u8 bDescriptorType;	/* 0x03 */
249232c150aSwdenk 	u16 wData[0];
250232c150aSwdenk } __attribute__ ((packed));
251232c150aSwdenk 
252232c150aSwdenk struct usb_generic_descriptor {
253232c150aSwdenk 	u8 bLength;
254232c150aSwdenk 	u8 bDescriptorType;
255232c150aSwdenk 	u8 bDescriptorSubtype;
256232c150aSwdenk } __attribute__ ((packed));
257232c150aSwdenk 
258232c150aSwdenk 
259232c150aSwdenk /*
260232c150aSwdenk  * communications class descriptor structures
261232c150aSwdenk  *
262232c150aSwdenk  * c.f. CDC 5.2 Table 25c
263232c150aSwdenk  */
264232c150aSwdenk 
265232c150aSwdenk struct usb_class_function_descriptor {
266232c150aSwdenk 	u8 bFunctionLength;
267232c150aSwdenk 	u8 bDescriptorType;
268232c150aSwdenk 	u8 bDescriptorSubtype;
269232c150aSwdenk } __attribute__ ((packed));
270232c150aSwdenk 
271232c150aSwdenk struct usb_class_function_descriptor_generic {
272232c150aSwdenk 	u8 bFunctionLength;
273232c150aSwdenk 	u8 bDescriptorType;
274232c150aSwdenk 	u8 bDescriptorSubtype;
275232c150aSwdenk 	u8 bmCapabilities;
276232c150aSwdenk } __attribute__ ((packed));
277232c150aSwdenk 
278232c150aSwdenk struct usb_class_header_function_descriptor {
279232c150aSwdenk 	u8 bFunctionLength;
280232c150aSwdenk 	u8 bDescriptorType;
281232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x00 */
282232c150aSwdenk 	u16 bcdCDC;
283232c150aSwdenk } __attribute__ ((packed));
284232c150aSwdenk 
285232c150aSwdenk struct usb_class_call_management_descriptor {
286232c150aSwdenk 	u8 bFunctionLength;
287232c150aSwdenk 	u8 bDescriptorType;
288232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x01 */
289232c150aSwdenk 	u8 bmCapabilities;
290232c150aSwdenk 	u8 bDataInterface;
291232c150aSwdenk } __attribute__ ((packed));
292232c150aSwdenk 
293232c150aSwdenk struct usb_class_abstract_control_descriptor {
294232c150aSwdenk 	u8 bFunctionLength;
295232c150aSwdenk 	u8 bDescriptorType;
296232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x02 */
297232c150aSwdenk 	u8 bmCapabilities;
298232c150aSwdenk } __attribute__ ((packed));
299232c150aSwdenk 
300232c150aSwdenk struct usb_class_direct_line_descriptor {
301232c150aSwdenk 	u8 bFunctionLength;
302232c150aSwdenk 	u8 bDescriptorType;
303232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x03 */
304232c150aSwdenk } __attribute__ ((packed));
305232c150aSwdenk 
306232c150aSwdenk struct usb_class_telephone_ringer_descriptor {
307232c150aSwdenk 	u8 bFunctionLength;
308232c150aSwdenk 	u8 bDescriptorType;
309232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x04 */
310232c150aSwdenk 	u8 bRingerVolSeps;
311232c150aSwdenk 	u8 bNumRingerPatterns;
312232c150aSwdenk } __attribute__ ((packed));
313232c150aSwdenk 
314232c150aSwdenk struct usb_class_telephone_call_descriptor {
315232c150aSwdenk 	u8 bFunctionLength;
316232c150aSwdenk 	u8 bDescriptorType;
317232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x05 */
318232c150aSwdenk 	u8 bmCapabilities;
319232c150aSwdenk } __attribute__ ((packed));
320232c150aSwdenk 
321232c150aSwdenk struct usb_class_union_function_descriptor {
322232c150aSwdenk 	u8 bFunctionLength;
323232c150aSwdenk 	u8 bDescriptorType;
324232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x06 */
325232c150aSwdenk 	u8 bMasterInterface;
326386eda02SWolfgang Denk 	/* u8 bSlaveInterface0[0]; */
32716c8d5e7SWolfgang Denk 	u8 bSlaveInterface0;
328232c150aSwdenk } __attribute__ ((packed));
329232c150aSwdenk 
330232c150aSwdenk struct usb_class_country_selection_descriptor {
331232c150aSwdenk 	u8 bFunctionLength;
332232c150aSwdenk 	u8 bDescriptorType;
333232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x07 */
334232c150aSwdenk 	u8 iCountryCodeRelDate;
335232c150aSwdenk 	u16 wCountryCode0[0];
336232c150aSwdenk } __attribute__ ((packed));
337232c150aSwdenk 
338232c150aSwdenk 
339232c150aSwdenk struct usb_class_telephone_operational_descriptor {
340232c150aSwdenk 	u8 bFunctionLength;
341232c150aSwdenk 	u8 bDescriptorType;
342232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x08 */
343232c150aSwdenk 	u8 bmCapabilities;
344232c150aSwdenk } __attribute__ ((packed));
345232c150aSwdenk 
346232c150aSwdenk 
347232c150aSwdenk struct usb_class_usb_terminal_descriptor {
348232c150aSwdenk 	u8 bFunctionLength;
349232c150aSwdenk 	u8 bDescriptorType;
350232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x09 */
351232c150aSwdenk 	u8 bEntityId;
352232c150aSwdenk 	u8 bInterfaceNo;
353232c150aSwdenk 	u8 bOutInterfaceNo;
354232c150aSwdenk 	u8 bmOptions;
355232c150aSwdenk 	u8 bChild0[0];
356232c150aSwdenk } __attribute__ ((packed));
357232c150aSwdenk 
358232c150aSwdenk struct usb_class_network_channel_descriptor {
359232c150aSwdenk 	u8 bFunctionLength;
360232c150aSwdenk 	u8 bDescriptorType;
361232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0a */
362232c150aSwdenk 	u8 bEntityId;
363232c150aSwdenk 	u8 iName;
364232c150aSwdenk 	u8 bChannelIndex;
365232c150aSwdenk 	u8 bPhysicalInterface;
366232c150aSwdenk } __attribute__ ((packed));
367232c150aSwdenk 
368232c150aSwdenk struct usb_class_protocol_unit_function_descriptor {
369232c150aSwdenk 	u8 bFunctionLength;
370232c150aSwdenk 	u8 bDescriptorType;
371232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0b */
372232c150aSwdenk 	u8 bEntityId;
373232c150aSwdenk 	u8 bProtocol;
374232c150aSwdenk 	u8 bChild0[0];
375232c150aSwdenk } __attribute__ ((packed));
376232c150aSwdenk 
377232c150aSwdenk struct usb_class_extension_unit_descriptor {
378232c150aSwdenk 	u8 bFunctionLength;
379232c150aSwdenk 	u8 bDescriptorType;
380232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0c */
381232c150aSwdenk 	u8 bEntityId;
382232c150aSwdenk 	u8 bExtensionCode;
383232c150aSwdenk 	u8 iName;
384232c150aSwdenk 	u8 bChild0[0];
385232c150aSwdenk } __attribute__ ((packed));
386232c150aSwdenk 
387232c150aSwdenk struct usb_class_multi_channel_descriptor {
388232c150aSwdenk 	u8 bFunctionLength;
389232c150aSwdenk 	u8 bDescriptorType;
390232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0d */
391232c150aSwdenk 	u8 bmCapabilities;
392232c150aSwdenk } __attribute__ ((packed));
393232c150aSwdenk 
394232c150aSwdenk struct usb_class_capi_control_descriptor {
395232c150aSwdenk 	u8 bFunctionLength;
396232c150aSwdenk 	u8 bDescriptorType;
397232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0e */
398232c150aSwdenk 	u8 bmCapabilities;
399232c150aSwdenk } __attribute__ ((packed));
400232c150aSwdenk 
401232c150aSwdenk struct usb_class_ethernet_networking_descriptor {
402232c150aSwdenk 	u8 bFunctionLength;
403232c150aSwdenk 	u8 bDescriptorType;
404232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0f */
405232c150aSwdenk 	u8 iMACAddress;
406232c150aSwdenk 	u32 bmEthernetStatistics;
407232c150aSwdenk 	u16 wMaxSegmentSize;
408232c150aSwdenk 	u16 wNumberMCFilters;
409232c150aSwdenk 	u8 bNumberPowerFilters;
410232c150aSwdenk } __attribute__ ((packed));
411232c150aSwdenk 
412232c150aSwdenk struct usb_class_atm_networking_descriptor {
413232c150aSwdenk 	u8 bFunctionLength;
414232c150aSwdenk 	u8 bDescriptorType;
415232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x10 */
416232c150aSwdenk 	u8 iEndSystermIdentifier;
417232c150aSwdenk 	u8 bmDataCapabilities;
418232c150aSwdenk 	u8 bmATMDeviceStatistics;
419232c150aSwdenk 	u16 wType2MaxSegmentSize;
420232c150aSwdenk 	u16 wType3MaxSegmentSize;
421232c150aSwdenk 	u16 wMaxVC;
422232c150aSwdenk } __attribute__ ((packed));
423232c150aSwdenk 
424232c150aSwdenk 
425232c150aSwdenk struct usb_class_mdlm_descriptor {
426232c150aSwdenk 	u8 bFunctionLength;
427232c150aSwdenk 	u8 bDescriptorType;
428232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x12 */
429232c150aSwdenk 	u16 bcdVersion;
430232c150aSwdenk 	u8 bGUID[16];
431232c150aSwdenk } __attribute__ ((packed));
432232c150aSwdenk 
433232c150aSwdenk struct usb_class_mdlmd_descriptor {
434232c150aSwdenk 	u8 bFunctionLength;
435232c150aSwdenk 	u8 bDescriptorType;
436232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x13 */
437232c150aSwdenk 	u8 bGuidDescriptorType;
438232c150aSwdenk 	u8 bDetailData[0];
439232c150aSwdenk 
440232c150aSwdenk } __attribute__ ((packed));
441232c150aSwdenk 
442232c150aSwdenk /*
443232c150aSwdenk  * HID class descriptor structures
444232c150aSwdenk  *
445232c150aSwdenk  * c.f. HID 6.2.1
446232c150aSwdenk  */
447232c150aSwdenk 
448232c150aSwdenk struct usb_class_hid_descriptor {
449232c150aSwdenk     u8	      bLength;
450232c150aSwdenk     u8	      bDescriptorType;
451232c150aSwdenk     u16	      bcdCDC;
452232c150aSwdenk     u8	      bCountryCode;
453232c150aSwdenk     u8	      bNumDescriptors;	/* 0x01 */
454232c150aSwdenk     u8	      bDescriptorType0;
455232c150aSwdenk     u16	      wDescriptorLength0;
456232c150aSwdenk     /* optional descriptors are not supported. */
457232c150aSwdenk } __attribute__((packed));
458232c150aSwdenk 
459232c150aSwdenk struct usb_class_report_descriptor {
460232c150aSwdenk     u8	      bLength;	/* dummy */
461232c150aSwdenk     u8	      bDescriptorType;
462232c150aSwdenk     u16	      wLength;
463232c150aSwdenk     u8		bData[0];
464232c150aSwdenk } __attribute__((packed));
465232c150aSwdenk 
466232c150aSwdenk /*
467232c150aSwdenk  * descriptor union structures
468232c150aSwdenk  */
469232c150aSwdenk 
470232c150aSwdenk struct usb_descriptor {
471232c150aSwdenk 	union {
472232c150aSwdenk 		struct usb_generic_descriptor generic;
473232c150aSwdenk 		struct usb_endpoint_descriptor endpoint;
474232c150aSwdenk 		struct usb_interface_descriptor interface;
475232c150aSwdenk 		struct usb_configuration_descriptor configuration;
476232c150aSwdenk 		struct usb_device_descriptor device;
477232c150aSwdenk 		struct usb_string_descriptor string;
478232c150aSwdenk 	} descriptor;
479232c150aSwdenk 
480232c150aSwdenk } __attribute__ ((packed));
481232c150aSwdenk 
482232c150aSwdenk struct usb_class_descriptor {
483232c150aSwdenk 	union {
484232c150aSwdenk 		struct usb_class_function_descriptor function;
485232c150aSwdenk 		struct usb_class_function_descriptor_generic generic;
486232c150aSwdenk 		struct usb_class_header_function_descriptor header_function;
487232c150aSwdenk 		struct usb_class_call_management_descriptor call_management;
488232c150aSwdenk 		struct usb_class_abstract_control_descriptor abstract_control;
489232c150aSwdenk 		struct usb_class_direct_line_descriptor direct_line;
490232c150aSwdenk 		struct usb_class_telephone_ringer_descriptor telephone_ringer;
491232c150aSwdenk 		struct usb_class_telephone_operational_descriptor telephone_operational;
492232c150aSwdenk 		struct usb_class_telephone_call_descriptor telephone_call;
493232c150aSwdenk 		struct usb_class_union_function_descriptor union_function;
494232c150aSwdenk 		struct usb_class_country_selection_descriptor country_selection;
495232c150aSwdenk 		struct usb_class_usb_terminal_descriptor usb_terminal;
496232c150aSwdenk 		struct usb_class_network_channel_descriptor network_channel;
497232c150aSwdenk 		struct usb_class_extension_unit_descriptor extension_unit;
498232c150aSwdenk 		struct usb_class_multi_channel_descriptor multi_channel;
499232c150aSwdenk 		struct usb_class_capi_control_descriptor capi_control;
500232c150aSwdenk 		struct usb_class_ethernet_networking_descriptor ethernet_networking;
501232c150aSwdenk 		struct usb_class_atm_networking_descriptor atm_networking;
502232c150aSwdenk 		struct usb_class_mdlm_descriptor mobile_direct;
503232c150aSwdenk 		struct usb_class_mdlmd_descriptor mobile_direct_detail;
504232c150aSwdenk 		struct usb_class_hid_descriptor hid;
505232c150aSwdenk 	} descriptor;
506232c150aSwdenk 
507232c150aSwdenk } __attribute__ ((packed));
508232c150aSwdenk 
509988365a2STom Rix #ifdef DEBUG
print_device_descriptor(struct usb_device_descriptor * d)510988365a2STom Rix static inline void print_device_descriptor(struct usb_device_descriptor *d)
511988365a2STom Rix {
512988365a2STom Rix 	serial_printf("usb device descriptor \n");
513988365a2STom Rix 	serial_printf("\tbLength %2.2x\n", d->bLength);
514988365a2STom Rix 	serial_printf("\tbDescriptorType %2.2x\n", d->bDescriptorType);
515988365a2STom Rix 	serial_printf("\tbcdUSB %4.4x\n", d->bcdUSB);
516988365a2STom Rix 	serial_printf("\tbDeviceClass %2.2x\n", d->bDeviceClass);
517988365a2STom Rix 	serial_printf("\tbDeviceSubClass %2.2x\n", d->bDeviceSubClass);
518988365a2STom Rix 	serial_printf("\tbDeviceProtocol %2.2x\n", d->bDeviceProtocol);
519988365a2STom Rix 	serial_printf("\tbMaxPacketSize0 %2.2x\n", d->bMaxPacketSize0);
520988365a2STom Rix 	serial_printf("\tidVendor %4.4x\n", d->idVendor);
521988365a2STom Rix 	serial_printf("\tidProduct %4.4x\n", d->idProduct);
522988365a2STom Rix 	serial_printf("\tbcdDevice %4.4x\n", d->bcdDevice);
523988365a2STom Rix 	serial_printf("\tiManufacturer %2.2x\n", d->iManufacturer);
524988365a2STom Rix 	serial_printf("\tiProduct %2.2x\n", d->iProduct);
525988365a2STom Rix 	serial_printf("\tiSerialNumber %2.2x\n", d->iSerialNumber);
526988365a2STom Rix 	serial_printf("\tbNumConfigurations %2.2x\n", d->bNumConfigurations);
527988365a2STom Rix }
528988365a2STom Rix 
529988365a2STom Rix #else
530988365a2STom Rix 
531988365a2STom Rix /* stubs */
532988365a2STom Rix #define print_device_descriptor(d)
533988365a2STom Rix 
534988365a2STom Rix #endif /* DEBUG */
535232c150aSwdenk #endif
536