xref: /rk3399_rockchip-uboot/include/usbdescriptors.h (revision f9da0f894328802cb8aaeb8a24660e37ff624d26)
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  *
16232c150aSwdenk  * This program is free software; you can redistribute it and/or modify
17232c150aSwdenk  * it under the terms of the GNU General Public License as published by
18232c150aSwdenk  * the Free Software Foundation; either version 2 of the License, or
19232c150aSwdenk  * (at your option) any later version.
20232c150aSwdenk  *
21232c150aSwdenk  * This program is distributed in the hope that it will be useful,
22232c150aSwdenk  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23232c150aSwdenk  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
24232c150aSwdenk  * GNU General Public License for more details.
25232c150aSwdenk  *
26232c150aSwdenk  * You should have received a copy of the GNU General Public License
27232c150aSwdenk  * along with this program; if not, write to the Free Software
28232c150aSwdenk  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29232c150aSwdenk  *
30232c150aSwdenk  */
31232c150aSwdenk 
32232c150aSwdenk /* USB Descriptors - Create a complete description of all of the
33232c150aSwdenk  * function driver capabilities. These map directly to the USB descriptors.
34232c150aSwdenk  *
35232c150aSwdenk  * This heirarchy is created by the functions drivers and is passed to the
36232c150aSwdenk  * usb-device driver when the function driver is registered.
37232c150aSwdenk  *
38232c150aSwdenk  *  device
39232c150aSwdenk  *	configuration
40232c150aSwdenk  *	     interface
41232c150aSwdenk  *		alternate
42232c150aSwdenk  *		     class
43232c150aSwdenk  *		     class
44232c150aSwdenk  *		alternate
45232c150aSwdenk  *		     endpoint
46232c150aSwdenk  *		     endpoint
47232c150aSwdenk  *	     interface
48232c150aSwdenk  *		alternate
49232c150aSwdenk  *		     endpoint
50232c150aSwdenk  *		     endpoint
51232c150aSwdenk  *	configuration
52232c150aSwdenk  *	     interface
53232c150aSwdenk  *		alternate
54232c150aSwdenk  *		     endpoint
55232c150aSwdenk  *		     endpoint
56232c150aSwdenk  *
57232c150aSwdenk  *
58232c150aSwdenk  * The configuration structures refer to the USB Configurations that will be
59232c150aSwdenk  * made available to a USB HOST during the enumeration process.
60232c150aSwdenk  *
61232c150aSwdenk  * The USB HOST will select a configuration and optionally an interface with
62232c150aSwdenk  * the usb set configuration and set interface commands.
63232c150aSwdenk  *
64232c150aSwdenk  * The selected interface (or the default interface if not specifically
65232c150aSwdenk  * selected) will define the list of endpoints that will be used.
66232c150aSwdenk  *
67232c150aSwdenk  * The configuration and interfaces are stored in an array that is indexed
68232c150aSwdenk  * by the specified configuratin or interface number minus one.
69232c150aSwdenk  *
70232c150aSwdenk  * A configuration number of zero is used to specify a return to the unconfigured
71232c150aSwdenk  * state.
72232c150aSwdenk  *
73232c150aSwdenk  */
74232c150aSwdenk 
75232c150aSwdenk 
76232c150aSwdenk #ifndef __USBDESCRIPTORS_H__
77232c150aSwdenk #define __USBDESCRIPTORS_H__
78232c150aSwdenk 
79232c150aSwdenk #include <asm/types.h>
80232c150aSwdenk 
81232c150aSwdenk /*
82232c150aSwdenk  * communications class types
83232c150aSwdenk  *
84232c150aSwdenk  * c.f. CDC  USB Class Definitions for Communications Devices
85232c150aSwdenk  * c.f. WMCD USB CDC Subclass Specification for Wireless Mobile Communications Devices
86232c150aSwdenk  *
87232c150aSwdenk  */
88232c150aSwdenk 
89232c150aSwdenk #define CLASS_BCD_VERSION		0x0110
90232c150aSwdenk 
91232c150aSwdenk /* c.f. CDC 4.1 Table 14 */
92232c150aSwdenk #define COMMUNICATIONS_DEVICE_CLASS	0x02
93232c150aSwdenk 
94232c150aSwdenk /* c.f. CDC 4.2 Table 15 */
9516c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_CONTROL	0x02
9616c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_DATA		0x0A
9716c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_VENDOR	0x0FF
98232c150aSwdenk 
99232c150aSwdenk /* c.f. CDC 4.3 Table 16 */
100232c150aSwdenk #define COMMUNICATIONS_NO_SUBCLASS		0x00
101232c150aSwdenk #define COMMUNICATIONS_DLCM_SUBCLASS	0x01
102232c150aSwdenk #define COMMUNICATIONS_ACM_SUBCLASS		0x02
103232c150aSwdenk #define COMMUNICATIONS_TCM_SUBCLASS		0x03
104232c150aSwdenk #define COMMUNICATIONS_MCCM_SUBCLASS	0x04
105232c150aSwdenk #define COMMUNICATIONS_CCM_SUBCLASS		0x05
106232c150aSwdenk #define COMMUNICATIONS_ENCM_SUBCLASS	0x06
107232c150aSwdenk #define COMMUNICATIONS_ANCM_SUBCLASS	0x07
108232c150aSwdenk 
109232c150aSwdenk /* c.f. WMCD 5.1 */
110232c150aSwdenk #define COMMUNICATIONS_WHCM_SUBCLASS	0x08
111232c150aSwdenk #define COMMUNICATIONS_DMM_SUBCLASS		0x09
112232c150aSwdenk #define COMMUNICATIONS_MDLM_SUBCLASS	0x0a
113232c150aSwdenk #define COMMUNICATIONS_OBEX_SUBCLASS	0x0b
114232c150aSwdenk 
11516c8d5e7SWolfgang Denk /* c.f. CDC 4.4 Table 17 */
11616c8d5e7SWolfgang Denk #define COMMUNICATIONS_NO_PROTOCOL		0x00
11716c8d5e7SWolfgang Denk #define COMMUNICATIONS_V25TER_PROTOCOL	0x01	/*Common AT Hayes compatible*/
11816c8d5e7SWolfgang Denk 
11916c8d5e7SWolfgang Denk /* c.f. CDC 4.5 Table 18 */
120232c150aSwdenk #define DATA_INTERFACE_CLASS		0x0a
121232c150aSwdenk 
12216c8d5e7SWolfgang Denk /* c.f. CDC 4.6 No Table */
12316c8d5e7SWolfgang Denk #define DATA_INTERFACE_SUBCLASS_NONE	0x00	/* No subclass pertinent */
12416c8d5e7SWolfgang Denk 
125232c150aSwdenk /* c.f. CDC 4.7 Table 19 */
12616c8d5e7SWolfgang Denk #define DATA_INTERFACE_PROTOCOL_NONE	0x00	/* No class protcol required */
127232c150aSwdenk 
128232c150aSwdenk 
129232c150aSwdenk /* c.f. CDC 5.2.3 Table 24 */
130232c150aSwdenk #define CS_INTERFACE		0x24
131232c150aSwdenk #define CS_ENDPOINT			0x25
132232c150aSwdenk 
133232c150aSwdenk /*
134232c150aSwdenk  * bDescriptorSubtypes
135232c150aSwdenk  *
136232c150aSwdenk  * c.f. CDC 5.2.3 Table 25
137232c150aSwdenk  * c.f. WMCD 5.3 Table 5.3
138232c150aSwdenk  */
139232c150aSwdenk 
140232c150aSwdenk #define USB_ST_HEADER		0x00
141232c150aSwdenk #define USB_ST_CMF			0x01
142232c150aSwdenk #define USB_ST_ACMF			0x02
143232c150aSwdenk #define USB_ST_DLMF			0x03
144232c150aSwdenk #define USB_ST_TRF			0x04
145232c150aSwdenk #define USB_ST_TCLF			0x05
146232c150aSwdenk #define USB_ST_UF			0x06
147232c150aSwdenk #define USB_ST_CSF			0x07
148232c150aSwdenk #define USB_ST_TOMF			0x08
149232c150aSwdenk #define USB_ST_USBTF		0x09
150232c150aSwdenk #define USB_ST_NCT			0x0a
151232c150aSwdenk #define USB_ST_PUF			0x0b
152232c150aSwdenk #define USB_ST_EUF			0x0c
153232c150aSwdenk #define USB_ST_MCMF			0x0d
154232c150aSwdenk #define USB_ST_CCMF			0x0e
155232c150aSwdenk #define USB_ST_ENF			0x0f
156232c150aSwdenk #define USB_ST_ATMNF		0x10
157232c150aSwdenk 
158232c150aSwdenk #define USB_ST_WHCM			0x11
159232c150aSwdenk #define USB_ST_MDLM			0x12
160232c150aSwdenk #define USB_ST_MDLMD		0x13
161232c150aSwdenk #define USB_ST_DMM			0x14
162232c150aSwdenk #define USB_ST_OBEX			0x15
163232c150aSwdenk #define USB_ST_CS			0x16
164232c150aSwdenk #define USB_ST_CSD			0x17
165232c150aSwdenk #define USB_ST_TCM			0x18
166232c150aSwdenk 
167232c150aSwdenk /* endpoint modifiers
168232c150aSwdenk  * static struct usb_endpoint_description function_default_A_1[] = {
169232c150aSwdenk  *
170232c150aSwdenk  *     {this_endpoint: 0, attributes: CONTROL,	 max_size: 8,  polling_interval: 0 },
171232c150aSwdenk  *     {this_endpoint: 1, attributes: BULK,	 max_size: 64, polling_interval: 0, direction: IN},
172232c150aSwdenk  *     {this_endpoint: 2, attributes: BULK,	 max_size: 64, polling_interval: 0, direction: OUT},
173232c150aSwdenk  *     {this_endpoint: 3, attributes: INTERRUPT, max_size: 8,  polling_interval: 0},
174232c150aSwdenk  *
175232c150aSwdenk  *
176232c150aSwdenk  */
177232c150aSwdenk #define OUT		0x00
178232c150aSwdenk #define IN		0x80
179232c150aSwdenk 
180232c150aSwdenk #define CONTROL		0x00
181232c150aSwdenk #define ISOCHRONOUS	0x01
182232c150aSwdenk #define BULK		0x02
183232c150aSwdenk #define INTERRUPT	0x03
184232c150aSwdenk 
185232c150aSwdenk 
186232c150aSwdenk /* configuration modifiers
187232c150aSwdenk  */
188232c150aSwdenk #define BMATTRIBUTE_RESERVED		0x80
189232c150aSwdenk #define BMATTRIBUTE_SELF_POWERED	0x40
190232c150aSwdenk 
191232c150aSwdenk /*
192232c150aSwdenk  * standard usb descriptor structures
193232c150aSwdenk  */
194232c150aSwdenk 
195232c150aSwdenk struct usb_endpoint_descriptor {
196232c150aSwdenk 	u8 bLength;
197232c150aSwdenk 	u8 bDescriptorType;	/* 0x5 */
198232c150aSwdenk 	u8 bEndpointAddress;
199232c150aSwdenk 	u8 bmAttributes;
200232c150aSwdenk 	u16 wMaxPacketSize;
201232c150aSwdenk 	u8 bInterval;
202b2fb47f1STom Rini } __attribute__ ((packed));
203232c150aSwdenk 
204232c150aSwdenk struct usb_interface_descriptor {
205232c150aSwdenk 	u8 bLength;
206232c150aSwdenk 	u8 bDescriptorType;	/* 0x04 */
207232c150aSwdenk 	u8 bInterfaceNumber;
208232c150aSwdenk 	u8 bAlternateSetting;
209232c150aSwdenk 	u8 bNumEndpoints;
210232c150aSwdenk 	u8 bInterfaceClass;
211232c150aSwdenk 	u8 bInterfaceSubClass;
212232c150aSwdenk 	u8 bInterfaceProtocol;
213232c150aSwdenk 	u8 iInterface;
214232c150aSwdenk } __attribute__ ((packed));
215232c150aSwdenk 
216232c150aSwdenk struct usb_configuration_descriptor {
217232c150aSwdenk 	u8 bLength;
218232c150aSwdenk 	u8 bDescriptorType;	/* 0x2 */
219232c150aSwdenk 	u16 wTotalLength;
220232c150aSwdenk 	u8 bNumInterfaces;
221232c150aSwdenk 	u8 bConfigurationValue;
222232c150aSwdenk 	u8 iConfiguration;
223232c150aSwdenk 	u8 bmAttributes;
224232c150aSwdenk 	u8 bMaxPower;
225232c150aSwdenk } __attribute__ ((packed));
226232c150aSwdenk 
227232c150aSwdenk struct usb_device_descriptor {
228232c150aSwdenk 	u8 bLength;
229232c150aSwdenk 	u8 bDescriptorType;	/* 0x01 */
230232c150aSwdenk 	u16 bcdUSB;
231232c150aSwdenk 	u8 bDeviceClass;
232232c150aSwdenk 	u8 bDeviceSubClass;
233232c150aSwdenk 	u8 bDeviceProtocol;
234232c150aSwdenk 	u8 bMaxPacketSize0;
235232c150aSwdenk 	u16 idVendor;
236232c150aSwdenk 	u16 idProduct;
237232c150aSwdenk 	u16 bcdDevice;
238232c150aSwdenk 	u8 iManufacturer;
239232c150aSwdenk 	u8 iProduct;
240232c150aSwdenk 	u8 iSerialNumber;
241232c150aSwdenk 	u8 bNumConfigurations;
242232c150aSwdenk } __attribute__ ((packed));
243232c150aSwdenk 
244*f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS)
245*f9da0f89SVipin KUMAR struct usb_qualifier_descriptor {
246*f9da0f89SVipin KUMAR 	u8 bLength;
247*f9da0f89SVipin KUMAR 	u8 bDescriptorType;
248*f9da0f89SVipin KUMAR 
249*f9da0f89SVipin KUMAR 	u16 bcdUSB;
250*f9da0f89SVipin KUMAR 	u8 bDeviceClass;
251*f9da0f89SVipin KUMAR 	u8 bDeviceSubClass;
252*f9da0f89SVipin KUMAR 	u8 bDeviceProtocol;
253*f9da0f89SVipin KUMAR 	u8 bMaxPacketSize0;
254*f9da0f89SVipin KUMAR 	u8 bNumConfigurations;
255*f9da0f89SVipin KUMAR 	u8 breserved;
256*f9da0f89SVipin KUMAR } __attribute__ ((packed));
257*f9da0f89SVipin KUMAR #endif
258*f9da0f89SVipin KUMAR 
259232c150aSwdenk struct usb_string_descriptor {
260232c150aSwdenk 	u8 bLength;
261232c150aSwdenk 	u8 bDescriptorType;	/* 0x03 */
262232c150aSwdenk 	u16 wData[0];
263232c150aSwdenk } __attribute__ ((packed));
264232c150aSwdenk 
265232c150aSwdenk struct usb_generic_descriptor {
266232c150aSwdenk 	u8 bLength;
267232c150aSwdenk 	u8 bDescriptorType;
268232c150aSwdenk 	u8 bDescriptorSubtype;
269232c150aSwdenk } __attribute__ ((packed));
270232c150aSwdenk 
271232c150aSwdenk 
272232c150aSwdenk /*
273232c150aSwdenk  * communications class descriptor structures
274232c150aSwdenk  *
275232c150aSwdenk  * c.f. CDC 5.2 Table 25c
276232c150aSwdenk  */
277232c150aSwdenk 
278232c150aSwdenk struct usb_class_function_descriptor {
279232c150aSwdenk 	u8 bFunctionLength;
280232c150aSwdenk 	u8 bDescriptorType;
281232c150aSwdenk 	u8 bDescriptorSubtype;
282232c150aSwdenk } __attribute__ ((packed));
283232c150aSwdenk 
284232c150aSwdenk struct usb_class_function_descriptor_generic {
285232c150aSwdenk 	u8 bFunctionLength;
286232c150aSwdenk 	u8 bDescriptorType;
287232c150aSwdenk 	u8 bDescriptorSubtype;
288232c150aSwdenk 	u8 bmCapabilities;
289232c150aSwdenk } __attribute__ ((packed));
290232c150aSwdenk 
291232c150aSwdenk struct usb_class_header_function_descriptor {
292232c150aSwdenk 	u8 bFunctionLength;
293232c150aSwdenk 	u8 bDescriptorType;
294232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x00 */
295232c150aSwdenk 	u16 bcdCDC;
296232c150aSwdenk } __attribute__ ((packed));
297232c150aSwdenk 
298232c150aSwdenk struct usb_class_call_management_descriptor {
299232c150aSwdenk 	u8 bFunctionLength;
300232c150aSwdenk 	u8 bDescriptorType;
301232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x01 */
302232c150aSwdenk 	u8 bmCapabilities;
303232c150aSwdenk 	u8 bDataInterface;
304232c150aSwdenk } __attribute__ ((packed));
305232c150aSwdenk 
306232c150aSwdenk struct usb_class_abstract_control_descriptor {
307232c150aSwdenk 	u8 bFunctionLength;
308232c150aSwdenk 	u8 bDescriptorType;
309232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x02 */
310232c150aSwdenk 	u8 bmCapabilities;
311232c150aSwdenk } __attribute__ ((packed));
312232c150aSwdenk 
313232c150aSwdenk struct usb_class_direct_line_descriptor {
314232c150aSwdenk 	u8 bFunctionLength;
315232c150aSwdenk 	u8 bDescriptorType;
316232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x03 */
317232c150aSwdenk } __attribute__ ((packed));
318232c150aSwdenk 
319232c150aSwdenk struct usb_class_telephone_ringer_descriptor {
320232c150aSwdenk 	u8 bFunctionLength;
321232c150aSwdenk 	u8 bDescriptorType;
322232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x04 */
323232c150aSwdenk 	u8 bRingerVolSeps;
324232c150aSwdenk 	u8 bNumRingerPatterns;
325232c150aSwdenk } __attribute__ ((packed));
326232c150aSwdenk 
327232c150aSwdenk struct usb_class_telephone_call_descriptor {
328232c150aSwdenk 	u8 bFunctionLength;
329232c150aSwdenk 	u8 bDescriptorType;
330232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x05 */
331232c150aSwdenk 	u8 bmCapabilities;
332232c150aSwdenk } __attribute__ ((packed));
333232c150aSwdenk 
334232c150aSwdenk struct usb_class_union_function_descriptor {
335232c150aSwdenk 	u8 bFunctionLength;
336232c150aSwdenk 	u8 bDescriptorType;
337232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x06 */
338232c150aSwdenk 	u8 bMasterInterface;
339386eda02SWolfgang Denk 	/* u8 bSlaveInterface0[0]; */
34016c8d5e7SWolfgang Denk 	u8 bSlaveInterface0;
341232c150aSwdenk } __attribute__ ((packed));
342232c150aSwdenk 
343232c150aSwdenk struct usb_class_country_selection_descriptor {
344232c150aSwdenk 	u8 bFunctionLength;
345232c150aSwdenk 	u8 bDescriptorType;
346232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x07 */
347232c150aSwdenk 	u8 iCountryCodeRelDate;
348232c150aSwdenk 	u16 wCountryCode0[0];
349232c150aSwdenk } __attribute__ ((packed));
350232c150aSwdenk 
351232c150aSwdenk 
352232c150aSwdenk struct usb_class_telephone_operational_descriptor {
353232c150aSwdenk 	u8 bFunctionLength;
354232c150aSwdenk 	u8 bDescriptorType;
355232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x08 */
356232c150aSwdenk 	u8 bmCapabilities;
357232c150aSwdenk } __attribute__ ((packed));
358232c150aSwdenk 
359232c150aSwdenk 
360232c150aSwdenk struct usb_class_usb_terminal_descriptor {
361232c150aSwdenk 	u8 bFunctionLength;
362232c150aSwdenk 	u8 bDescriptorType;
363232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x09 */
364232c150aSwdenk 	u8 bEntityId;
365232c150aSwdenk 	u8 bInterfaceNo;
366232c150aSwdenk 	u8 bOutInterfaceNo;
367232c150aSwdenk 	u8 bmOptions;
368232c150aSwdenk 	u8 bChild0[0];
369232c150aSwdenk } __attribute__ ((packed));
370232c150aSwdenk 
371232c150aSwdenk struct usb_class_network_channel_descriptor {
372232c150aSwdenk 	u8 bFunctionLength;
373232c150aSwdenk 	u8 bDescriptorType;
374232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0a */
375232c150aSwdenk 	u8 bEntityId;
376232c150aSwdenk 	u8 iName;
377232c150aSwdenk 	u8 bChannelIndex;
378232c150aSwdenk 	u8 bPhysicalInterface;
379232c150aSwdenk } __attribute__ ((packed));
380232c150aSwdenk 
381232c150aSwdenk struct usb_class_protocol_unit_function_descriptor {
382232c150aSwdenk 	u8 bFunctionLength;
383232c150aSwdenk 	u8 bDescriptorType;
384232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0b */
385232c150aSwdenk 	u8 bEntityId;
386232c150aSwdenk 	u8 bProtocol;
387232c150aSwdenk 	u8 bChild0[0];
388232c150aSwdenk } __attribute__ ((packed));
389232c150aSwdenk 
390232c150aSwdenk struct usb_class_extension_unit_descriptor {
391232c150aSwdenk 	u8 bFunctionLength;
392232c150aSwdenk 	u8 bDescriptorType;
393232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0c */
394232c150aSwdenk 	u8 bEntityId;
395232c150aSwdenk 	u8 bExtensionCode;
396232c150aSwdenk 	u8 iName;
397232c150aSwdenk 	u8 bChild0[0];
398232c150aSwdenk } __attribute__ ((packed));
399232c150aSwdenk 
400232c150aSwdenk struct usb_class_multi_channel_descriptor {
401232c150aSwdenk 	u8 bFunctionLength;
402232c150aSwdenk 	u8 bDescriptorType;
403232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0d */
404232c150aSwdenk 	u8 bmCapabilities;
405232c150aSwdenk } __attribute__ ((packed));
406232c150aSwdenk 
407232c150aSwdenk struct usb_class_capi_control_descriptor {
408232c150aSwdenk 	u8 bFunctionLength;
409232c150aSwdenk 	u8 bDescriptorType;
410232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0e */
411232c150aSwdenk 	u8 bmCapabilities;
412232c150aSwdenk } __attribute__ ((packed));
413232c150aSwdenk 
414232c150aSwdenk struct usb_class_ethernet_networking_descriptor {
415232c150aSwdenk 	u8 bFunctionLength;
416232c150aSwdenk 	u8 bDescriptorType;
417232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x0f */
418232c150aSwdenk 	u8 iMACAddress;
419232c150aSwdenk 	u32 bmEthernetStatistics;
420232c150aSwdenk 	u16 wMaxSegmentSize;
421232c150aSwdenk 	u16 wNumberMCFilters;
422232c150aSwdenk 	u8 bNumberPowerFilters;
423232c150aSwdenk } __attribute__ ((packed));
424232c150aSwdenk 
425232c150aSwdenk struct usb_class_atm_networking_descriptor {
426232c150aSwdenk 	u8 bFunctionLength;
427232c150aSwdenk 	u8 bDescriptorType;
428232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x10 */
429232c150aSwdenk 	u8 iEndSystermIdentifier;
430232c150aSwdenk 	u8 bmDataCapabilities;
431232c150aSwdenk 	u8 bmATMDeviceStatistics;
432232c150aSwdenk 	u16 wType2MaxSegmentSize;
433232c150aSwdenk 	u16 wType3MaxSegmentSize;
434232c150aSwdenk 	u16 wMaxVC;
435232c150aSwdenk } __attribute__ ((packed));
436232c150aSwdenk 
437232c150aSwdenk 
438232c150aSwdenk struct usb_class_mdlm_descriptor {
439232c150aSwdenk 	u8 bFunctionLength;
440232c150aSwdenk 	u8 bDescriptorType;
441232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x12 */
442232c150aSwdenk 	u16 bcdVersion;
443232c150aSwdenk 	u8 bGUID[16];
444232c150aSwdenk } __attribute__ ((packed));
445232c150aSwdenk 
446232c150aSwdenk struct usb_class_mdlmd_descriptor {
447232c150aSwdenk 	u8 bFunctionLength;
448232c150aSwdenk 	u8 bDescriptorType;
449232c150aSwdenk 	u8 bDescriptorSubtype;	/* 0x13 */
450232c150aSwdenk 	u8 bGuidDescriptorType;
451232c150aSwdenk 	u8 bDetailData[0];
452232c150aSwdenk 
453232c150aSwdenk } __attribute__ ((packed));
454232c150aSwdenk 
455232c150aSwdenk /*
456232c150aSwdenk  * HID class descriptor structures
457232c150aSwdenk  *
458232c150aSwdenk  * c.f. HID 6.2.1
459232c150aSwdenk  */
460232c150aSwdenk 
461232c150aSwdenk struct usb_class_hid_descriptor {
462232c150aSwdenk     u8	      bLength;
463232c150aSwdenk     u8	      bDescriptorType;
464232c150aSwdenk     u16	      bcdCDC;
465232c150aSwdenk     u8	      bCountryCode;
466232c150aSwdenk     u8	      bNumDescriptors;	/* 0x01 */
467232c150aSwdenk     u8	      bDescriptorType0;
468232c150aSwdenk     u16	      wDescriptorLength0;
469232c150aSwdenk     /* optional descriptors are not supported. */
470232c150aSwdenk } __attribute__((packed));
471232c150aSwdenk 
472232c150aSwdenk struct usb_class_report_descriptor {
473232c150aSwdenk     u8	      bLength;	/* dummy */
474232c150aSwdenk     u8	      bDescriptorType;
475232c150aSwdenk     u16	      wLength;
476232c150aSwdenk     u8		bData[0];
477232c150aSwdenk } __attribute__((packed));
478232c150aSwdenk 
479232c150aSwdenk /*
480232c150aSwdenk  * descriptor union structures
481232c150aSwdenk  */
482232c150aSwdenk 
483232c150aSwdenk struct usb_descriptor {
484232c150aSwdenk 	union {
485232c150aSwdenk 		struct usb_generic_descriptor generic;
486232c150aSwdenk 		struct usb_endpoint_descriptor endpoint;
487232c150aSwdenk 		struct usb_interface_descriptor interface;
488232c150aSwdenk 		struct usb_configuration_descriptor configuration;
489232c150aSwdenk 		struct usb_device_descriptor device;
490232c150aSwdenk 		struct usb_string_descriptor string;
491232c150aSwdenk 	} descriptor;
492232c150aSwdenk 
493232c150aSwdenk } __attribute__ ((packed));
494232c150aSwdenk 
495232c150aSwdenk struct usb_class_descriptor {
496232c150aSwdenk 	union {
497232c150aSwdenk 		struct usb_class_function_descriptor function;
498232c150aSwdenk 		struct usb_class_function_descriptor_generic generic;
499232c150aSwdenk 		struct usb_class_header_function_descriptor header_function;
500232c150aSwdenk 		struct usb_class_call_management_descriptor call_management;
501232c150aSwdenk 		struct usb_class_abstract_control_descriptor abstract_control;
502232c150aSwdenk 		struct usb_class_direct_line_descriptor direct_line;
503232c150aSwdenk 		struct usb_class_telephone_ringer_descriptor telephone_ringer;
504232c150aSwdenk 		struct usb_class_telephone_operational_descriptor telephone_operational;
505232c150aSwdenk 		struct usb_class_telephone_call_descriptor telephone_call;
506232c150aSwdenk 		struct usb_class_union_function_descriptor union_function;
507232c150aSwdenk 		struct usb_class_country_selection_descriptor country_selection;
508232c150aSwdenk 		struct usb_class_usb_terminal_descriptor usb_terminal;
509232c150aSwdenk 		struct usb_class_network_channel_descriptor network_channel;
510232c150aSwdenk 		struct usb_class_extension_unit_descriptor extension_unit;
511232c150aSwdenk 		struct usb_class_multi_channel_descriptor multi_channel;
512232c150aSwdenk 		struct usb_class_capi_control_descriptor capi_control;
513232c150aSwdenk 		struct usb_class_ethernet_networking_descriptor ethernet_networking;
514232c150aSwdenk 		struct usb_class_atm_networking_descriptor atm_networking;
515232c150aSwdenk 		struct usb_class_mdlm_descriptor mobile_direct;
516232c150aSwdenk 		struct usb_class_mdlmd_descriptor mobile_direct_detail;
517232c150aSwdenk 		struct usb_class_hid_descriptor hid;
518232c150aSwdenk 	} descriptor;
519232c150aSwdenk 
520232c150aSwdenk } __attribute__ ((packed));
521232c150aSwdenk 
522988365a2STom Rix #ifdef DEBUG
523988365a2STom Rix static inline void print_device_descriptor(struct usb_device_descriptor *d)
524988365a2STom Rix {
525988365a2STom Rix 	serial_printf("usb device descriptor \n");
526988365a2STom Rix 	serial_printf("\tbLength %2.2x\n", d->bLength);
527988365a2STom Rix 	serial_printf("\tbDescriptorType %2.2x\n", d->bDescriptorType);
528988365a2STom Rix 	serial_printf("\tbcdUSB %4.4x\n", d->bcdUSB);
529988365a2STom Rix 	serial_printf("\tbDeviceClass %2.2x\n", d->bDeviceClass);
530988365a2STom Rix 	serial_printf("\tbDeviceSubClass %2.2x\n", d->bDeviceSubClass);
531988365a2STom Rix 	serial_printf("\tbDeviceProtocol %2.2x\n", d->bDeviceProtocol);
532988365a2STom Rix 	serial_printf("\tbMaxPacketSize0 %2.2x\n", d->bMaxPacketSize0);
533988365a2STom Rix 	serial_printf("\tidVendor %4.4x\n", d->idVendor);
534988365a2STom Rix 	serial_printf("\tidProduct %4.4x\n", d->idProduct);
535988365a2STom Rix 	serial_printf("\tbcdDevice %4.4x\n", d->bcdDevice);
536988365a2STom Rix 	serial_printf("\tiManufacturer %2.2x\n", d->iManufacturer);
537988365a2STom Rix 	serial_printf("\tiProduct %2.2x\n", d->iProduct);
538988365a2STom Rix 	serial_printf("\tiSerialNumber %2.2x\n", d->iSerialNumber);
539988365a2STom Rix 	serial_printf("\tbNumConfigurations %2.2x\n", d->bNumConfigurations);
540988365a2STom Rix }
541988365a2STom Rix 
542988365a2STom Rix #else
543988365a2STom Rix 
544988365a2STom Rix /* stubs */
545988365a2STom Rix #define print_device_descriptor(d)
546988365a2STom Rix 
547988365a2STom Rix #endif /* DEBUG */
548232c150aSwdenk #endif
549