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