]> Git Repo - J-u-boot.git/blob - include/usbdescriptors.h
Merge tag 'v2025.01-rc6' into next
[J-u-boot.git] / include / usbdescriptors.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2003
4  * Gerry Hamel, [email protected], Texas Instruments
5  *
6  * Based on
7  * linux/drivers/usbd/usb-function.h - USB Function
8  *
9  * Copyright (c) 2000, 2001, 2002 Lineo
10  * Copyright (c) 2001 Hewlett Packard
11  *
12  * By:
13  *      Stuart Lynne <[email protected]>,
14  *      Tom Rushworth <[email protected]>,
15  *      Bruce Balden <[email protected]>
16  */
17
18 /* USB Descriptors - Create a complete description of all of the
19  * function driver capabilities. These map directly to the USB descriptors.
20  *
21  * This heirarchy is created by the functions drivers and is passed to the
22  * usb-device driver when the function driver is registered.
23  *
24  *  device
25  *      configuration
26  *           interface
27  *              alternate
28  *                   class
29  *                   class
30  *              alternate
31  *                   endpoint
32  *                   endpoint
33  *           interface
34  *              alternate
35  *                   endpoint
36  *                   endpoint
37  *      configuration
38  *           interface
39  *              alternate
40  *                   endpoint
41  *                   endpoint
42  *
43  *
44  * The configuration structures refer to the USB Configurations that will be
45  * made available to a USB HOST during the enumeration process.
46  *
47  * The USB HOST will select a configuration and optionally an interface with
48  * the usb set configuration and set interface commands.
49  *
50  * The selected interface (or the default interface if not specifically
51  * selected) will define the list of endpoints that will be used.
52  *
53  * The configuration and interfaces are stored in an array that is indexed
54  * by the specified configuratin or interface number minus one.
55  *
56  * A configuration number of zero is used to specify a return to the unconfigured
57  * state.
58  *
59  */
60
61 #ifndef __USBDESCRIPTORS_H__
62 #define __USBDESCRIPTORS_H__
63
64 #include <asm/types.h>
65
66 /*
67  * communications class types
68  *
69  * c.f. CDC  USB Class Definitions for Communications Devices
70  * c.f. WMCD USB CDC Subclass Specification for Wireless Mobile Communications Devices
71  *
72  */
73
74 #define CLASS_BCD_VERSION               0x0110
75
76 /* c.f. CDC 4.1 Table 14 */
77 #define COMMUNICATIONS_DEVICE_CLASS     0x02
78
79 /* c.f. CDC 4.2 Table 15 */
80 #define COMMUNICATIONS_INTERFACE_CLASS_CONTROL  0x02
81 #define COMMUNICATIONS_INTERFACE_CLASS_DATA             0x0A
82 #define COMMUNICATIONS_INTERFACE_CLASS_VENDOR   0x0FF
83
84 /* c.f. CDC 4.3 Table 16 */
85 #define COMMUNICATIONS_NO_SUBCLASS              0x00
86 #define COMMUNICATIONS_DLCM_SUBCLASS    0x01
87 #define COMMUNICATIONS_ACM_SUBCLASS             0x02
88 #define COMMUNICATIONS_TCM_SUBCLASS             0x03
89 #define COMMUNICATIONS_MCCM_SUBCLASS    0x04
90 #define COMMUNICATIONS_CCM_SUBCLASS             0x05
91 #define COMMUNICATIONS_ENCM_SUBCLASS    0x06
92 #define COMMUNICATIONS_ANCM_SUBCLASS    0x07
93
94 /* c.f. WMCD 5.1 */
95 #define COMMUNICATIONS_WHCM_SUBCLASS    0x08
96 #define COMMUNICATIONS_DMM_SUBCLASS             0x09
97 #define COMMUNICATIONS_MDLM_SUBCLASS    0x0a
98 #define COMMUNICATIONS_OBEX_SUBCLASS    0x0b
99
100 /* c.f. CDC 4.4 Table 17 */
101 #define COMMUNICATIONS_NO_PROTOCOL              0x00
102 #define COMMUNICATIONS_V25TER_PROTOCOL  0x01    /*Common AT Hayes compatible*/
103
104 /* c.f. CDC 4.5 Table 18 */
105 #define DATA_INTERFACE_CLASS            0x0a
106
107 /* c.f. CDC 4.6 No Table */
108 #define DATA_INTERFACE_SUBCLASS_NONE    0x00    /* No subclass pertinent */
109
110 /* c.f. CDC 4.7 Table 19 */
111 #define DATA_INTERFACE_PROTOCOL_NONE    0x00    /* No class protcol required */
112
113 /* c.f. CDC 5.2.3 Table 24 */
114 #define CS_INTERFACE            0x24
115 #define CS_ENDPOINT                     0x25
116
117 /*
118  * bDescriptorSubtypes
119  *
120  * c.f. CDC 5.2.3 Table 25
121  * c.f. WMCD 5.3 Table 5.3
122  */
123
124 #define USB_ST_HEADER           0x00
125 #define USB_ST_CMF                      0x01
126 #define USB_ST_ACMF                     0x02
127 #define USB_ST_DLMF                     0x03
128 #define USB_ST_TRF                      0x04
129 #define USB_ST_TCLF                     0x05
130 #define USB_ST_UF                       0x06
131 #define USB_ST_CSF                      0x07
132 #define USB_ST_TOMF                     0x08
133 #define USB_ST_USBTF            0x09
134 #define USB_ST_NCT                      0x0a
135 #define USB_ST_PUF                      0x0b
136 #define USB_ST_EUF                      0x0c
137 #define USB_ST_MCMF                     0x0d
138 #define USB_ST_CCMF                     0x0e
139 #define USB_ST_ENF                      0x0f
140 #define USB_ST_ATMNF            0x10
141
142 #define USB_ST_WHCM                     0x11
143 #define USB_ST_MDLM                     0x12
144 #define USB_ST_MDLMD            0x13
145 #define USB_ST_DMM                      0x14
146 #define USB_ST_OBEX                     0x15
147 #define USB_ST_CS                       0x16
148 #define USB_ST_CSD                      0x17
149 #define USB_ST_TCM                      0x18
150
151 /* endpoint modifiers
152  * static struct usb_endpoint_description function_default_A_1[] = {
153  *
154  *     {this_endpoint: 0, attributes: CONTROL,   max_size: 8,  polling_interval: 0 },
155  *     {this_endpoint: 1, attributes: BULK,      max_size: 64, polling_interval: 0, direction: IN},
156  *     {this_endpoint: 2, attributes: BULK,      max_size: 64, polling_interval: 0, direction: OUT},
157  *     {this_endpoint: 3, attributes: INTERRUPT, max_size: 8,  polling_interval: 0},
158  *
159  *
160  */
161 #define OUT             0x00
162 #define IN              0x80
163
164 #define CONTROL         0x00
165 #define ISOCHRONOUS     0x01
166 #define BULK            0x02
167 #define INTERRUPT       0x03
168
169 /* configuration modifiers
170  */
171 #define BMATTRIBUTE_RESERVED            0x80
172 #define BMATTRIBUTE_SELF_POWERED        0x40
173
174 /*
175  * standard usb descriptor structures
176  */
177
178 struct usb_endpoint_descriptor {
179         u8 bLength;
180         u8 bDescriptorType;     /* 0x5 */
181         u8 bEndpointAddress;
182         u8 bmAttributes;
183         u16 wMaxPacketSize;
184         u8 bInterval;
185 } __attribute__ ((packed));
186
187 struct usb_interface_descriptor {
188         u8 bLength;
189         u8 bDescriptorType;     /* 0x04 */
190         u8 bInterfaceNumber;
191         u8 bAlternateSetting;
192         u8 bNumEndpoints;
193         u8 bInterfaceClass;
194         u8 bInterfaceSubClass;
195         u8 bInterfaceProtocol;
196         u8 iInterface;
197 } __attribute__ ((packed));
198
199 struct usb_configuration_descriptor {
200         u8 bLength;
201         u8 bDescriptorType;     /* 0x2 */
202         u16 wTotalLength;
203         u8 bNumInterfaces;
204         u8 bConfigurationValue;
205         u8 iConfiguration;
206         u8 bmAttributes;
207         u8 bMaxPower;
208 } __attribute__ ((packed));
209
210 struct usb_device_descriptor {
211         u8 bLength;
212         u8 bDescriptorType;     /* 0x01 */
213         u16 bcdUSB;
214         u8 bDeviceClass;
215         u8 bDeviceSubClass;
216         u8 bDeviceProtocol;
217         u8 bMaxPacketSize0;
218         u16 idVendor;
219         u16 idProduct;
220         u16 bcdDevice;
221         u8 iManufacturer;
222         u8 iProduct;
223         u8 iSerialNumber;
224         u8 bNumConfigurations;
225 } __attribute__ ((packed));
226
227 struct usb_string_descriptor {
228         u8 bLength;
229         u8 bDescriptorType;     /* 0x03 */
230         u16 wData[0];
231 } __attribute__ ((packed));
232
233 struct usb_generic_descriptor {
234         u8 bLength;
235         u8 bDescriptorType;
236         u8 bDescriptorSubtype;
237 } __attribute__ ((packed));
238
239 /*
240  * communications class descriptor structures
241  *
242  * c.f. CDC 5.2 Table 25c
243  */
244
245 struct usb_class_function_descriptor {
246         u8 bFunctionLength;
247         u8 bDescriptorType;
248         u8 bDescriptorSubtype;
249 } __attribute__ ((packed));
250
251 struct usb_class_function_descriptor_generic {
252         u8 bFunctionLength;
253         u8 bDescriptorType;
254         u8 bDescriptorSubtype;
255         u8 bmCapabilities;
256 } __attribute__ ((packed));
257
258 struct usb_class_header_function_descriptor {
259         u8 bFunctionLength;
260         u8 bDescriptorType;
261         u8 bDescriptorSubtype;  /* 0x00 */
262         u16 bcdCDC;
263 } __attribute__ ((packed));
264
265 struct usb_class_call_management_descriptor {
266         u8 bFunctionLength;
267         u8 bDescriptorType;
268         u8 bDescriptorSubtype;  /* 0x01 */
269         u8 bmCapabilities;
270         u8 bDataInterface;
271 } __attribute__ ((packed));
272
273 struct usb_class_abstract_control_descriptor {
274         u8 bFunctionLength;
275         u8 bDescriptorType;
276         u8 bDescriptorSubtype;  /* 0x02 */
277         u8 bmCapabilities;
278 } __attribute__ ((packed));
279
280 struct usb_class_direct_line_descriptor {
281         u8 bFunctionLength;
282         u8 bDescriptorType;
283         u8 bDescriptorSubtype;  /* 0x03 */
284 } __attribute__ ((packed));
285
286 struct usb_class_telephone_ringer_descriptor {
287         u8 bFunctionLength;
288         u8 bDescriptorType;
289         u8 bDescriptorSubtype;  /* 0x04 */
290         u8 bRingerVolSeps;
291         u8 bNumRingerPatterns;
292 } __attribute__ ((packed));
293
294 struct usb_class_telephone_call_descriptor {
295         u8 bFunctionLength;
296         u8 bDescriptorType;
297         u8 bDescriptorSubtype;  /* 0x05 */
298         u8 bmCapabilities;
299 } __attribute__ ((packed));
300
301 struct usb_class_union_function_descriptor {
302         u8 bFunctionLength;
303         u8 bDescriptorType;
304         u8 bDescriptorSubtype;  /* 0x06 */
305         u8 bMasterInterface;
306         /* u8 bSlaveInterface0[0]; */
307         u8 bSlaveInterface0;
308 } __attribute__ ((packed));
309
310 struct usb_class_country_selection_descriptor {
311         u8 bFunctionLength;
312         u8 bDescriptorType;
313         u8 bDescriptorSubtype;  /* 0x07 */
314         u8 iCountryCodeRelDate;
315         u16 wCountryCode0[0];
316 } __attribute__ ((packed));
317
318 struct usb_class_telephone_operational_descriptor {
319         u8 bFunctionLength;
320         u8 bDescriptorType;
321         u8 bDescriptorSubtype;  /* 0x08 */
322         u8 bmCapabilities;
323 } __attribute__ ((packed));
324
325 struct usb_class_usb_terminal_descriptor {
326         u8 bFunctionLength;
327         u8 bDescriptorType;
328         u8 bDescriptorSubtype;  /* 0x09 */
329         u8 bEntityId;
330         u8 bInterfaceNo;
331         u8 bOutInterfaceNo;
332         u8 bmOptions;
333         u8 bChild0[0];
334 } __attribute__ ((packed));
335
336 struct usb_class_network_channel_descriptor {
337         u8 bFunctionLength;
338         u8 bDescriptorType;
339         u8 bDescriptorSubtype;  /* 0x0a */
340         u8 bEntityId;
341         u8 iName;
342         u8 bChannelIndex;
343         u8 bPhysicalInterface;
344 } __attribute__ ((packed));
345
346 struct usb_class_protocol_unit_function_descriptor {
347         u8 bFunctionLength;
348         u8 bDescriptorType;
349         u8 bDescriptorSubtype;  /* 0x0b */
350         u8 bEntityId;
351         u8 bProtocol;
352         u8 bChild0[0];
353 } __attribute__ ((packed));
354
355 struct usb_class_extension_unit_descriptor {
356         u8 bFunctionLength;
357         u8 bDescriptorType;
358         u8 bDescriptorSubtype;  /* 0x0c */
359         u8 bEntityId;
360         u8 bExtensionCode;
361         u8 iName;
362         u8 bChild0[0];
363 } __attribute__ ((packed));
364
365 struct usb_class_multi_channel_descriptor {
366         u8 bFunctionLength;
367         u8 bDescriptorType;
368         u8 bDescriptorSubtype;  /* 0x0d */
369         u8 bmCapabilities;
370 } __attribute__ ((packed));
371
372 struct usb_class_capi_control_descriptor {
373         u8 bFunctionLength;
374         u8 bDescriptorType;
375         u8 bDescriptorSubtype;  /* 0x0e */
376         u8 bmCapabilities;
377 } __attribute__ ((packed));
378
379 struct usb_class_ethernet_networking_descriptor {
380         u8 bFunctionLength;
381         u8 bDescriptorType;
382         u8 bDescriptorSubtype;  /* 0x0f */
383         u8 iMACAddress;
384         u32 bmEthernetStatistics;
385         u16 wMaxSegmentSize;
386         u16 wNumberMCFilters;
387         u8 bNumberPowerFilters;
388 } __attribute__ ((packed));
389
390 struct usb_class_atm_networking_descriptor {
391         u8 bFunctionLength;
392         u8 bDescriptorType;
393         u8 bDescriptorSubtype;  /* 0x10 */
394         u8 iEndSystermIdentifier;
395         u8 bmDataCapabilities;
396         u8 bmATMDeviceStatistics;
397         u16 wType2MaxSegmentSize;
398         u16 wType3MaxSegmentSize;
399         u16 wMaxVC;
400 } __attribute__ ((packed));
401
402 struct usb_class_mdlm_descriptor {
403         u8 bFunctionLength;
404         u8 bDescriptorType;
405         u8 bDescriptorSubtype;  /* 0x12 */
406         u16 bcdVersion;
407         u8 bGUID[16];
408 } __attribute__ ((packed));
409
410 struct usb_class_mdlmd_descriptor {
411         u8 bFunctionLength;
412         u8 bDescriptorType;
413         u8 bDescriptorSubtype;  /* 0x13 */
414         u8 bGuidDescriptorType;
415         u8 bDetailData[0];
416
417 } __attribute__ ((packed));
418
419 /*
420  * HID class descriptor structures
421  *
422  * c.f. HID 6.2.1
423  */
424
425 struct usb_class_hid_descriptor {
426     u8        bLength;
427     u8        bDescriptorType;
428     u16       bcdCDC;
429     u8        bCountryCode;
430     u8        bNumDescriptors;  /* 0x01 */
431     u8        bDescriptorType0;
432     u16       wDescriptorLength0;
433     /* optional descriptors are not supported. */
434 } __attribute__((packed));
435
436 struct usb_class_report_descriptor {
437     u8        bLength;  /* dummy */
438     u8        bDescriptorType;
439     u16       wLength;
440     u8          bData[0];
441 } __attribute__((packed));
442
443 /*
444  * descriptor union structures
445  */
446
447 struct usb_descriptor {
448         union {
449                 struct usb_generic_descriptor generic;
450                 struct usb_endpoint_descriptor endpoint;
451                 struct usb_interface_descriptor interface;
452                 struct usb_configuration_descriptor configuration;
453                 struct usb_device_descriptor device;
454                 struct usb_string_descriptor string;
455         } descriptor;
456
457 } __attribute__ ((packed));
458
459 struct usb_class_descriptor {
460         union {
461                 struct usb_class_function_descriptor function;
462                 struct usb_class_function_descriptor_generic generic;
463                 struct usb_class_header_function_descriptor header_function;
464                 struct usb_class_call_management_descriptor call_management;
465                 struct usb_class_abstract_control_descriptor abstract_control;
466                 struct usb_class_direct_line_descriptor direct_line;
467                 struct usb_class_telephone_ringer_descriptor telephone_ringer;
468                 struct usb_class_telephone_operational_descriptor telephone_operational;
469                 struct usb_class_telephone_call_descriptor telephone_call;
470                 struct usb_class_union_function_descriptor union_function;
471                 struct usb_class_country_selection_descriptor country_selection;
472                 struct usb_class_usb_terminal_descriptor usb_terminal;
473                 struct usb_class_network_channel_descriptor network_channel;
474                 struct usb_class_extension_unit_descriptor extension_unit;
475                 struct usb_class_multi_channel_descriptor multi_channel;
476                 struct usb_class_capi_control_descriptor capi_control;
477                 struct usb_class_ethernet_networking_descriptor ethernet_networking;
478                 struct usb_class_atm_networking_descriptor atm_networking;
479                 struct usb_class_mdlm_descriptor mobile_direct;
480                 struct usb_class_mdlmd_descriptor mobile_direct_detail;
481                 struct usb_class_hid_descriptor hid;
482         } descriptor;
483
484 } __attribute__ ((packed));
485
486 #ifdef DEBUG
487 static inline void print_device_descriptor(struct usb_device_descriptor *d)
488 {
489         serial_printf("usb device descriptor \n");
490         serial_printf("\tbLength %2.2x\n", d->bLength);
491         serial_printf("\tbDescriptorType %2.2x\n", d->bDescriptorType);
492         serial_printf("\tbcdUSB %4.4x\n", d->bcdUSB);
493         serial_printf("\tbDeviceClass %2.2x\n", d->bDeviceClass);
494         serial_printf("\tbDeviceSubClass %2.2x\n", d->bDeviceSubClass);
495         serial_printf("\tbDeviceProtocol %2.2x\n", d->bDeviceProtocol);
496         serial_printf("\tbMaxPacketSize0 %2.2x\n", d->bMaxPacketSize0);
497         serial_printf("\tidVendor %4.4x\n", d->idVendor);
498         serial_printf("\tidProduct %4.4x\n", d->idProduct);
499         serial_printf("\tbcdDevice %4.4x\n", d->bcdDevice);
500         serial_printf("\tiManufacturer %2.2x\n", d->iManufacturer);
501         serial_printf("\tiProduct %2.2x\n", d->iProduct);
502         serial_printf("\tiSerialNumber %2.2x\n", d->iSerialNumber);
503         serial_printf("\tbNumConfigurations %2.2x\n", d->bNumConfigurations);
504 }
505
506 #else
507
508 /* stubs */
509 #define print_device_descriptor(d)
510
511 #endif /* DEBUG */
512 #endif
This page took 0.053846 seconds and 4 git commands to generate.