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