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