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 */ 95 #define COMMUNICATIONS_INTERFACE_CLASS_CONTROL 0x02 96 #define COMMUNICATIONS_INTERFACE_CLASS_DATA 0x0A 97 #define COMMUNICATIONS_INTERFACE_CLASS_VENDOR 0x0FF 98 99 /* c.f. CDC 4.3 Table 16 */ 100 #define COMMUNICATIONS_NO_SUBCLASS 0x00 101 #define COMMUNICATIONS_DLCM_SUBCLASS 0x01 102 #define COMMUNICATIONS_ACM_SUBCLASS 0x02 103 #define COMMUNICATIONS_TCM_SUBCLASS 0x03 104 #define COMMUNICATIONS_MCCM_SUBCLASS 0x04 105 #define COMMUNICATIONS_CCM_SUBCLASS 0x05 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 111 #define COMMUNICATIONS_DMM_SUBCLASS 0x09 112 #define COMMUNICATIONS_MDLM_SUBCLASS 0x0a 113 #define COMMUNICATIONS_OBEX_SUBCLASS 0x0b 114 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 */ 120 #define DATA_INTERFACE_CLASS 0x0a 121 122 /* c.f. CDC 4.6 No Table */ 123 #define DATA_INTERFACE_SUBCLASS_NONE 0x00 /* No subclass pertinent */ 124 125 /* c.f. CDC 4.7 Table 19 */ 126 #define DATA_INTERFACE_PROTOCOL_NONE 0x00 /* No class protcol required */ 127 128 129 /* c.f. CDC 5.2.3 Table 24 */ 130 #define CS_INTERFACE 0x24 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 140 #define USB_ST_HEADER 0x00 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 149 #define USB_ST_USBTF 0x09 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 156 #define USB_ST_ATMNF 0x10 157 158 #define USB_ST_WHCM 0x11 159 #define USB_ST_MDLM 0x12 160 #define USB_ST_MDLMD 0x13 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; 324 /* u8 bSlaveInterface0[0]; */ 325 u8 bSlaveInterface0; 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 508