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