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 * 16232c150aSwdenk * This program is free software; you can redistribute it and/or modify 17232c150aSwdenk * it under the terms of the GNU General Public License as published by 18232c150aSwdenk * the Free Software Foundation; either version 2 of the License, or 19232c150aSwdenk * (at your option) any later version. 20232c150aSwdenk * 21232c150aSwdenk * This program is distributed in the hope that it will be useful, 22232c150aSwdenk * but WITHOUT ANY WARRANTY; without even the implied warranty of 23232c150aSwdenk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24232c150aSwdenk * GNU General Public License for more details. 25232c150aSwdenk * 26232c150aSwdenk * You should have received a copy of the GNU General Public License 27232c150aSwdenk * along with this program; if not, write to the Free Software 28232c150aSwdenk * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 29232c150aSwdenk * 30232c150aSwdenk */ 31232c150aSwdenk 32232c150aSwdenk /* USB Descriptors - Create a complete description of all of the 33232c150aSwdenk * function driver capabilities. These map directly to the USB descriptors. 34232c150aSwdenk * 35232c150aSwdenk * This heirarchy is created by the functions drivers and is passed to the 36232c150aSwdenk * usb-device driver when the function driver is registered. 37232c150aSwdenk * 38232c150aSwdenk * device 39232c150aSwdenk * configuration 40232c150aSwdenk * interface 41232c150aSwdenk * alternate 42232c150aSwdenk * class 43232c150aSwdenk * class 44232c150aSwdenk * alternate 45232c150aSwdenk * endpoint 46232c150aSwdenk * endpoint 47232c150aSwdenk * interface 48232c150aSwdenk * alternate 49232c150aSwdenk * endpoint 50232c150aSwdenk * endpoint 51232c150aSwdenk * configuration 52232c150aSwdenk * interface 53232c150aSwdenk * alternate 54232c150aSwdenk * endpoint 55232c150aSwdenk * endpoint 56232c150aSwdenk * 57232c150aSwdenk * 58232c150aSwdenk * The configuration structures refer to the USB Configurations that will be 59232c150aSwdenk * made available to a USB HOST during the enumeration process. 60232c150aSwdenk * 61232c150aSwdenk * The USB HOST will select a configuration and optionally an interface with 62232c150aSwdenk * the usb set configuration and set interface commands. 63232c150aSwdenk * 64232c150aSwdenk * The selected interface (or the default interface if not specifically 65232c150aSwdenk * selected) will define the list of endpoints that will be used. 66232c150aSwdenk * 67232c150aSwdenk * The configuration and interfaces are stored in an array that is indexed 68232c150aSwdenk * by the specified configuratin or interface number minus one. 69232c150aSwdenk * 70232c150aSwdenk * A configuration number of zero is used to specify a return to the unconfigured 71232c150aSwdenk * state. 72232c150aSwdenk * 73232c150aSwdenk */ 74232c150aSwdenk 75232c150aSwdenk 76232c150aSwdenk #ifndef __USBDESCRIPTORS_H__ 77232c150aSwdenk #define __USBDESCRIPTORS_H__ 78232c150aSwdenk 79232c150aSwdenk #include <asm/types.h> 80232c150aSwdenk 81232c150aSwdenk /* 82232c150aSwdenk * communications class types 83232c150aSwdenk * 84232c150aSwdenk * c.f. CDC USB Class Definitions for Communications Devices 85232c150aSwdenk * c.f. WMCD USB CDC Subclass Specification for Wireless Mobile Communications Devices 86232c150aSwdenk * 87232c150aSwdenk */ 88232c150aSwdenk 89232c150aSwdenk #define CLASS_BCD_VERSION 0x0110 90232c150aSwdenk 91232c150aSwdenk /* c.f. CDC 4.1 Table 14 */ 92232c150aSwdenk #define COMMUNICATIONS_DEVICE_CLASS 0x02 93232c150aSwdenk 94232c150aSwdenk /* c.f. CDC 4.2 Table 15 */ 9516c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_CONTROL 0x02 9616c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_DATA 0x0A 9716c8d5e7SWolfgang Denk #define COMMUNICATIONS_INTERFACE_CLASS_VENDOR 0x0FF 98232c150aSwdenk 99232c150aSwdenk /* c.f. CDC 4.3 Table 16 */ 100232c150aSwdenk #define COMMUNICATIONS_NO_SUBCLASS 0x00 101232c150aSwdenk #define COMMUNICATIONS_DLCM_SUBCLASS 0x01 102232c150aSwdenk #define COMMUNICATIONS_ACM_SUBCLASS 0x02 103232c150aSwdenk #define COMMUNICATIONS_TCM_SUBCLASS 0x03 104232c150aSwdenk #define COMMUNICATIONS_MCCM_SUBCLASS 0x04 105232c150aSwdenk #define COMMUNICATIONS_CCM_SUBCLASS 0x05 106232c150aSwdenk #define COMMUNICATIONS_ENCM_SUBCLASS 0x06 107232c150aSwdenk #define COMMUNICATIONS_ANCM_SUBCLASS 0x07 108232c150aSwdenk 109232c150aSwdenk /* c.f. WMCD 5.1 */ 110232c150aSwdenk #define COMMUNICATIONS_WHCM_SUBCLASS 0x08 111232c150aSwdenk #define COMMUNICATIONS_DMM_SUBCLASS 0x09 112232c150aSwdenk #define COMMUNICATIONS_MDLM_SUBCLASS 0x0a 113232c150aSwdenk #define COMMUNICATIONS_OBEX_SUBCLASS 0x0b 114232c150aSwdenk 11516c8d5e7SWolfgang Denk /* c.f. CDC 4.4 Table 17 */ 11616c8d5e7SWolfgang Denk #define COMMUNICATIONS_NO_PROTOCOL 0x00 11716c8d5e7SWolfgang Denk #define COMMUNICATIONS_V25TER_PROTOCOL 0x01 /*Common AT Hayes compatible*/ 11816c8d5e7SWolfgang Denk 11916c8d5e7SWolfgang Denk /* c.f. CDC 4.5 Table 18 */ 120232c150aSwdenk #define DATA_INTERFACE_CLASS 0x0a 121232c150aSwdenk 12216c8d5e7SWolfgang Denk /* c.f. CDC 4.6 No Table */ 12316c8d5e7SWolfgang Denk #define DATA_INTERFACE_SUBCLASS_NONE 0x00 /* No subclass pertinent */ 12416c8d5e7SWolfgang Denk 125232c150aSwdenk /* c.f. CDC 4.7 Table 19 */ 12616c8d5e7SWolfgang Denk #define DATA_INTERFACE_PROTOCOL_NONE 0x00 /* No class protcol required */ 127232c150aSwdenk 128232c150aSwdenk 129232c150aSwdenk /* c.f. CDC 5.2.3 Table 24 */ 130232c150aSwdenk #define CS_INTERFACE 0x24 131232c150aSwdenk #define CS_ENDPOINT 0x25 132232c150aSwdenk 133232c150aSwdenk /* 134232c150aSwdenk * bDescriptorSubtypes 135232c150aSwdenk * 136232c150aSwdenk * c.f. CDC 5.2.3 Table 25 137232c150aSwdenk * c.f. WMCD 5.3 Table 5.3 138232c150aSwdenk */ 139232c150aSwdenk 140232c150aSwdenk #define USB_ST_HEADER 0x00 141232c150aSwdenk #define USB_ST_CMF 0x01 142232c150aSwdenk #define USB_ST_ACMF 0x02 143232c150aSwdenk #define USB_ST_DLMF 0x03 144232c150aSwdenk #define USB_ST_TRF 0x04 145232c150aSwdenk #define USB_ST_TCLF 0x05 146232c150aSwdenk #define USB_ST_UF 0x06 147232c150aSwdenk #define USB_ST_CSF 0x07 148232c150aSwdenk #define USB_ST_TOMF 0x08 149232c150aSwdenk #define USB_ST_USBTF 0x09 150232c150aSwdenk #define USB_ST_NCT 0x0a 151232c150aSwdenk #define USB_ST_PUF 0x0b 152232c150aSwdenk #define USB_ST_EUF 0x0c 153232c150aSwdenk #define USB_ST_MCMF 0x0d 154232c150aSwdenk #define USB_ST_CCMF 0x0e 155232c150aSwdenk #define USB_ST_ENF 0x0f 156232c150aSwdenk #define USB_ST_ATMNF 0x10 157232c150aSwdenk 158232c150aSwdenk #define USB_ST_WHCM 0x11 159232c150aSwdenk #define USB_ST_MDLM 0x12 160232c150aSwdenk #define USB_ST_MDLMD 0x13 161232c150aSwdenk #define USB_ST_DMM 0x14 162232c150aSwdenk #define USB_ST_OBEX 0x15 163232c150aSwdenk #define USB_ST_CS 0x16 164232c150aSwdenk #define USB_ST_CSD 0x17 165232c150aSwdenk #define USB_ST_TCM 0x18 166232c150aSwdenk 167232c150aSwdenk /* endpoint modifiers 168232c150aSwdenk * static struct usb_endpoint_description function_default_A_1[] = { 169232c150aSwdenk * 170232c150aSwdenk * {this_endpoint: 0, attributes: CONTROL, max_size: 8, polling_interval: 0 }, 171232c150aSwdenk * {this_endpoint: 1, attributes: BULK, max_size: 64, polling_interval: 0, direction: IN}, 172232c150aSwdenk * {this_endpoint: 2, attributes: BULK, max_size: 64, polling_interval: 0, direction: OUT}, 173232c150aSwdenk * {this_endpoint: 3, attributes: INTERRUPT, max_size: 8, polling_interval: 0}, 174232c150aSwdenk * 175232c150aSwdenk * 176232c150aSwdenk */ 177232c150aSwdenk #define OUT 0x00 178232c150aSwdenk #define IN 0x80 179232c150aSwdenk 180232c150aSwdenk #define CONTROL 0x00 181232c150aSwdenk #define ISOCHRONOUS 0x01 182232c150aSwdenk #define BULK 0x02 183232c150aSwdenk #define INTERRUPT 0x03 184232c150aSwdenk 185232c150aSwdenk 186232c150aSwdenk /* configuration modifiers 187232c150aSwdenk */ 188232c150aSwdenk #define BMATTRIBUTE_RESERVED 0x80 189232c150aSwdenk #define BMATTRIBUTE_SELF_POWERED 0x40 190232c150aSwdenk 191232c150aSwdenk /* 192232c150aSwdenk * standard usb descriptor structures 193232c150aSwdenk */ 194232c150aSwdenk 195232c150aSwdenk struct usb_endpoint_descriptor { 196232c150aSwdenk u8 bLength; 197232c150aSwdenk u8 bDescriptorType; /* 0x5 */ 198232c150aSwdenk u8 bEndpointAddress; 199232c150aSwdenk u8 bmAttributes; 200232c150aSwdenk u16 wMaxPacketSize; 201232c150aSwdenk u8 bInterval; 202b2fb47f1STom Rini } __attribute__ ((packed)); 203232c150aSwdenk 204232c150aSwdenk struct usb_interface_descriptor { 205232c150aSwdenk u8 bLength; 206232c150aSwdenk u8 bDescriptorType; /* 0x04 */ 207232c150aSwdenk u8 bInterfaceNumber; 208232c150aSwdenk u8 bAlternateSetting; 209232c150aSwdenk u8 bNumEndpoints; 210232c150aSwdenk u8 bInterfaceClass; 211232c150aSwdenk u8 bInterfaceSubClass; 212232c150aSwdenk u8 bInterfaceProtocol; 213232c150aSwdenk u8 iInterface; 214232c150aSwdenk } __attribute__ ((packed)); 215232c150aSwdenk 216232c150aSwdenk struct usb_configuration_descriptor { 217232c150aSwdenk u8 bLength; 218232c150aSwdenk u8 bDescriptorType; /* 0x2 */ 219232c150aSwdenk u16 wTotalLength; 220232c150aSwdenk u8 bNumInterfaces; 221232c150aSwdenk u8 bConfigurationValue; 222232c150aSwdenk u8 iConfiguration; 223232c150aSwdenk u8 bmAttributes; 224232c150aSwdenk u8 bMaxPower; 225232c150aSwdenk } __attribute__ ((packed)); 226232c150aSwdenk 227232c150aSwdenk struct usb_device_descriptor { 228232c150aSwdenk u8 bLength; 229232c150aSwdenk u8 bDescriptorType; /* 0x01 */ 230232c150aSwdenk u16 bcdUSB; 231232c150aSwdenk u8 bDeviceClass; 232232c150aSwdenk u8 bDeviceSubClass; 233232c150aSwdenk u8 bDeviceProtocol; 234232c150aSwdenk u8 bMaxPacketSize0; 235232c150aSwdenk u16 idVendor; 236232c150aSwdenk u16 idProduct; 237232c150aSwdenk u16 bcdDevice; 238232c150aSwdenk u8 iManufacturer; 239232c150aSwdenk u8 iProduct; 240232c150aSwdenk u8 iSerialNumber; 241232c150aSwdenk u8 bNumConfigurations; 242232c150aSwdenk } __attribute__ ((packed)); 243232c150aSwdenk 244*f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 245*f9da0f89SVipin KUMAR struct usb_qualifier_descriptor { 246*f9da0f89SVipin KUMAR u8 bLength; 247*f9da0f89SVipin KUMAR u8 bDescriptorType; 248*f9da0f89SVipin KUMAR 249*f9da0f89SVipin KUMAR u16 bcdUSB; 250*f9da0f89SVipin KUMAR u8 bDeviceClass; 251*f9da0f89SVipin KUMAR u8 bDeviceSubClass; 252*f9da0f89SVipin KUMAR u8 bDeviceProtocol; 253*f9da0f89SVipin KUMAR u8 bMaxPacketSize0; 254*f9da0f89SVipin KUMAR u8 bNumConfigurations; 255*f9da0f89SVipin KUMAR u8 breserved; 256*f9da0f89SVipin KUMAR } __attribute__ ((packed)); 257*f9da0f89SVipin KUMAR #endif 258*f9da0f89SVipin KUMAR 259232c150aSwdenk struct usb_string_descriptor { 260232c150aSwdenk u8 bLength; 261232c150aSwdenk u8 bDescriptorType; /* 0x03 */ 262232c150aSwdenk u16 wData[0]; 263232c150aSwdenk } __attribute__ ((packed)); 264232c150aSwdenk 265232c150aSwdenk struct usb_generic_descriptor { 266232c150aSwdenk u8 bLength; 267232c150aSwdenk u8 bDescriptorType; 268232c150aSwdenk u8 bDescriptorSubtype; 269232c150aSwdenk } __attribute__ ((packed)); 270232c150aSwdenk 271232c150aSwdenk 272232c150aSwdenk /* 273232c150aSwdenk * communications class descriptor structures 274232c150aSwdenk * 275232c150aSwdenk * c.f. CDC 5.2 Table 25c 276232c150aSwdenk */ 277232c150aSwdenk 278232c150aSwdenk struct usb_class_function_descriptor { 279232c150aSwdenk u8 bFunctionLength; 280232c150aSwdenk u8 bDescriptorType; 281232c150aSwdenk u8 bDescriptorSubtype; 282232c150aSwdenk } __attribute__ ((packed)); 283232c150aSwdenk 284232c150aSwdenk struct usb_class_function_descriptor_generic { 285232c150aSwdenk u8 bFunctionLength; 286232c150aSwdenk u8 bDescriptorType; 287232c150aSwdenk u8 bDescriptorSubtype; 288232c150aSwdenk u8 bmCapabilities; 289232c150aSwdenk } __attribute__ ((packed)); 290232c150aSwdenk 291232c150aSwdenk struct usb_class_header_function_descriptor { 292232c150aSwdenk u8 bFunctionLength; 293232c150aSwdenk u8 bDescriptorType; 294232c150aSwdenk u8 bDescriptorSubtype; /* 0x00 */ 295232c150aSwdenk u16 bcdCDC; 296232c150aSwdenk } __attribute__ ((packed)); 297232c150aSwdenk 298232c150aSwdenk struct usb_class_call_management_descriptor { 299232c150aSwdenk u8 bFunctionLength; 300232c150aSwdenk u8 bDescriptorType; 301232c150aSwdenk u8 bDescriptorSubtype; /* 0x01 */ 302232c150aSwdenk u8 bmCapabilities; 303232c150aSwdenk u8 bDataInterface; 304232c150aSwdenk } __attribute__ ((packed)); 305232c150aSwdenk 306232c150aSwdenk struct usb_class_abstract_control_descriptor { 307232c150aSwdenk u8 bFunctionLength; 308232c150aSwdenk u8 bDescriptorType; 309232c150aSwdenk u8 bDescriptorSubtype; /* 0x02 */ 310232c150aSwdenk u8 bmCapabilities; 311232c150aSwdenk } __attribute__ ((packed)); 312232c150aSwdenk 313232c150aSwdenk struct usb_class_direct_line_descriptor { 314232c150aSwdenk u8 bFunctionLength; 315232c150aSwdenk u8 bDescriptorType; 316232c150aSwdenk u8 bDescriptorSubtype; /* 0x03 */ 317232c150aSwdenk } __attribute__ ((packed)); 318232c150aSwdenk 319232c150aSwdenk struct usb_class_telephone_ringer_descriptor { 320232c150aSwdenk u8 bFunctionLength; 321232c150aSwdenk u8 bDescriptorType; 322232c150aSwdenk u8 bDescriptorSubtype; /* 0x04 */ 323232c150aSwdenk u8 bRingerVolSeps; 324232c150aSwdenk u8 bNumRingerPatterns; 325232c150aSwdenk } __attribute__ ((packed)); 326232c150aSwdenk 327232c150aSwdenk struct usb_class_telephone_call_descriptor { 328232c150aSwdenk u8 bFunctionLength; 329232c150aSwdenk u8 bDescriptorType; 330232c150aSwdenk u8 bDescriptorSubtype; /* 0x05 */ 331232c150aSwdenk u8 bmCapabilities; 332232c150aSwdenk } __attribute__ ((packed)); 333232c150aSwdenk 334232c150aSwdenk struct usb_class_union_function_descriptor { 335232c150aSwdenk u8 bFunctionLength; 336232c150aSwdenk u8 bDescriptorType; 337232c150aSwdenk u8 bDescriptorSubtype; /* 0x06 */ 338232c150aSwdenk u8 bMasterInterface; 339386eda02SWolfgang Denk /* u8 bSlaveInterface0[0]; */ 34016c8d5e7SWolfgang Denk u8 bSlaveInterface0; 341232c150aSwdenk } __attribute__ ((packed)); 342232c150aSwdenk 343232c150aSwdenk struct usb_class_country_selection_descriptor { 344232c150aSwdenk u8 bFunctionLength; 345232c150aSwdenk u8 bDescriptorType; 346232c150aSwdenk u8 bDescriptorSubtype; /* 0x07 */ 347232c150aSwdenk u8 iCountryCodeRelDate; 348232c150aSwdenk u16 wCountryCode0[0]; 349232c150aSwdenk } __attribute__ ((packed)); 350232c150aSwdenk 351232c150aSwdenk 352232c150aSwdenk struct usb_class_telephone_operational_descriptor { 353232c150aSwdenk u8 bFunctionLength; 354232c150aSwdenk u8 bDescriptorType; 355232c150aSwdenk u8 bDescriptorSubtype; /* 0x08 */ 356232c150aSwdenk u8 bmCapabilities; 357232c150aSwdenk } __attribute__ ((packed)); 358232c150aSwdenk 359232c150aSwdenk 360232c150aSwdenk struct usb_class_usb_terminal_descriptor { 361232c150aSwdenk u8 bFunctionLength; 362232c150aSwdenk u8 bDescriptorType; 363232c150aSwdenk u8 bDescriptorSubtype; /* 0x09 */ 364232c150aSwdenk u8 bEntityId; 365232c150aSwdenk u8 bInterfaceNo; 366232c150aSwdenk u8 bOutInterfaceNo; 367232c150aSwdenk u8 bmOptions; 368232c150aSwdenk u8 bChild0[0]; 369232c150aSwdenk } __attribute__ ((packed)); 370232c150aSwdenk 371232c150aSwdenk struct usb_class_network_channel_descriptor { 372232c150aSwdenk u8 bFunctionLength; 373232c150aSwdenk u8 bDescriptorType; 374232c150aSwdenk u8 bDescriptorSubtype; /* 0x0a */ 375232c150aSwdenk u8 bEntityId; 376232c150aSwdenk u8 iName; 377232c150aSwdenk u8 bChannelIndex; 378232c150aSwdenk u8 bPhysicalInterface; 379232c150aSwdenk } __attribute__ ((packed)); 380232c150aSwdenk 381232c150aSwdenk struct usb_class_protocol_unit_function_descriptor { 382232c150aSwdenk u8 bFunctionLength; 383232c150aSwdenk u8 bDescriptorType; 384232c150aSwdenk u8 bDescriptorSubtype; /* 0x0b */ 385232c150aSwdenk u8 bEntityId; 386232c150aSwdenk u8 bProtocol; 387232c150aSwdenk u8 bChild0[0]; 388232c150aSwdenk } __attribute__ ((packed)); 389232c150aSwdenk 390232c150aSwdenk struct usb_class_extension_unit_descriptor { 391232c150aSwdenk u8 bFunctionLength; 392232c150aSwdenk u8 bDescriptorType; 393232c150aSwdenk u8 bDescriptorSubtype; /* 0x0c */ 394232c150aSwdenk u8 bEntityId; 395232c150aSwdenk u8 bExtensionCode; 396232c150aSwdenk u8 iName; 397232c150aSwdenk u8 bChild0[0]; 398232c150aSwdenk } __attribute__ ((packed)); 399232c150aSwdenk 400232c150aSwdenk struct usb_class_multi_channel_descriptor { 401232c150aSwdenk u8 bFunctionLength; 402232c150aSwdenk u8 bDescriptorType; 403232c150aSwdenk u8 bDescriptorSubtype; /* 0x0d */ 404232c150aSwdenk u8 bmCapabilities; 405232c150aSwdenk } __attribute__ ((packed)); 406232c150aSwdenk 407232c150aSwdenk struct usb_class_capi_control_descriptor { 408232c150aSwdenk u8 bFunctionLength; 409232c150aSwdenk u8 bDescriptorType; 410232c150aSwdenk u8 bDescriptorSubtype; /* 0x0e */ 411232c150aSwdenk u8 bmCapabilities; 412232c150aSwdenk } __attribute__ ((packed)); 413232c150aSwdenk 414232c150aSwdenk struct usb_class_ethernet_networking_descriptor { 415232c150aSwdenk u8 bFunctionLength; 416232c150aSwdenk u8 bDescriptorType; 417232c150aSwdenk u8 bDescriptorSubtype; /* 0x0f */ 418232c150aSwdenk u8 iMACAddress; 419232c150aSwdenk u32 bmEthernetStatistics; 420232c150aSwdenk u16 wMaxSegmentSize; 421232c150aSwdenk u16 wNumberMCFilters; 422232c150aSwdenk u8 bNumberPowerFilters; 423232c150aSwdenk } __attribute__ ((packed)); 424232c150aSwdenk 425232c150aSwdenk struct usb_class_atm_networking_descriptor { 426232c150aSwdenk u8 bFunctionLength; 427232c150aSwdenk u8 bDescriptorType; 428232c150aSwdenk u8 bDescriptorSubtype; /* 0x10 */ 429232c150aSwdenk u8 iEndSystermIdentifier; 430232c150aSwdenk u8 bmDataCapabilities; 431232c150aSwdenk u8 bmATMDeviceStatistics; 432232c150aSwdenk u16 wType2MaxSegmentSize; 433232c150aSwdenk u16 wType3MaxSegmentSize; 434232c150aSwdenk u16 wMaxVC; 435232c150aSwdenk } __attribute__ ((packed)); 436232c150aSwdenk 437232c150aSwdenk 438232c150aSwdenk struct usb_class_mdlm_descriptor { 439232c150aSwdenk u8 bFunctionLength; 440232c150aSwdenk u8 bDescriptorType; 441232c150aSwdenk u8 bDescriptorSubtype; /* 0x12 */ 442232c150aSwdenk u16 bcdVersion; 443232c150aSwdenk u8 bGUID[16]; 444232c150aSwdenk } __attribute__ ((packed)); 445232c150aSwdenk 446232c150aSwdenk struct usb_class_mdlmd_descriptor { 447232c150aSwdenk u8 bFunctionLength; 448232c150aSwdenk u8 bDescriptorType; 449232c150aSwdenk u8 bDescriptorSubtype; /* 0x13 */ 450232c150aSwdenk u8 bGuidDescriptorType; 451232c150aSwdenk u8 bDetailData[0]; 452232c150aSwdenk 453232c150aSwdenk } __attribute__ ((packed)); 454232c150aSwdenk 455232c150aSwdenk /* 456232c150aSwdenk * HID class descriptor structures 457232c150aSwdenk * 458232c150aSwdenk * c.f. HID 6.2.1 459232c150aSwdenk */ 460232c150aSwdenk 461232c150aSwdenk struct usb_class_hid_descriptor { 462232c150aSwdenk u8 bLength; 463232c150aSwdenk u8 bDescriptorType; 464232c150aSwdenk u16 bcdCDC; 465232c150aSwdenk u8 bCountryCode; 466232c150aSwdenk u8 bNumDescriptors; /* 0x01 */ 467232c150aSwdenk u8 bDescriptorType0; 468232c150aSwdenk u16 wDescriptorLength0; 469232c150aSwdenk /* optional descriptors are not supported. */ 470232c150aSwdenk } __attribute__((packed)); 471232c150aSwdenk 472232c150aSwdenk struct usb_class_report_descriptor { 473232c150aSwdenk u8 bLength; /* dummy */ 474232c150aSwdenk u8 bDescriptorType; 475232c150aSwdenk u16 wLength; 476232c150aSwdenk u8 bData[0]; 477232c150aSwdenk } __attribute__((packed)); 478232c150aSwdenk 479232c150aSwdenk /* 480232c150aSwdenk * descriptor union structures 481232c150aSwdenk */ 482232c150aSwdenk 483232c150aSwdenk struct usb_descriptor { 484232c150aSwdenk union { 485232c150aSwdenk struct usb_generic_descriptor generic; 486232c150aSwdenk struct usb_endpoint_descriptor endpoint; 487232c150aSwdenk struct usb_interface_descriptor interface; 488232c150aSwdenk struct usb_configuration_descriptor configuration; 489232c150aSwdenk struct usb_device_descriptor device; 490232c150aSwdenk struct usb_string_descriptor string; 491232c150aSwdenk } descriptor; 492232c150aSwdenk 493232c150aSwdenk } __attribute__ ((packed)); 494232c150aSwdenk 495232c150aSwdenk struct usb_class_descriptor { 496232c150aSwdenk union { 497232c150aSwdenk struct usb_class_function_descriptor function; 498232c150aSwdenk struct usb_class_function_descriptor_generic generic; 499232c150aSwdenk struct usb_class_header_function_descriptor header_function; 500232c150aSwdenk struct usb_class_call_management_descriptor call_management; 501232c150aSwdenk struct usb_class_abstract_control_descriptor abstract_control; 502232c150aSwdenk struct usb_class_direct_line_descriptor direct_line; 503232c150aSwdenk struct usb_class_telephone_ringer_descriptor telephone_ringer; 504232c150aSwdenk struct usb_class_telephone_operational_descriptor telephone_operational; 505232c150aSwdenk struct usb_class_telephone_call_descriptor telephone_call; 506232c150aSwdenk struct usb_class_union_function_descriptor union_function; 507232c150aSwdenk struct usb_class_country_selection_descriptor country_selection; 508232c150aSwdenk struct usb_class_usb_terminal_descriptor usb_terminal; 509232c150aSwdenk struct usb_class_network_channel_descriptor network_channel; 510232c150aSwdenk struct usb_class_extension_unit_descriptor extension_unit; 511232c150aSwdenk struct usb_class_multi_channel_descriptor multi_channel; 512232c150aSwdenk struct usb_class_capi_control_descriptor capi_control; 513232c150aSwdenk struct usb_class_ethernet_networking_descriptor ethernet_networking; 514232c150aSwdenk struct usb_class_atm_networking_descriptor atm_networking; 515232c150aSwdenk struct usb_class_mdlm_descriptor mobile_direct; 516232c150aSwdenk struct usb_class_mdlmd_descriptor mobile_direct_detail; 517232c150aSwdenk struct usb_class_hid_descriptor hid; 518232c150aSwdenk } descriptor; 519232c150aSwdenk 520232c150aSwdenk } __attribute__ ((packed)); 521232c150aSwdenk 522988365a2STom Rix #ifdef DEBUG 523988365a2STom Rix static inline void print_device_descriptor(struct usb_device_descriptor *d) 524988365a2STom Rix { 525988365a2STom Rix serial_printf("usb device descriptor \n"); 526988365a2STom Rix serial_printf("\tbLength %2.2x\n", d->bLength); 527988365a2STom Rix serial_printf("\tbDescriptorType %2.2x\n", d->bDescriptorType); 528988365a2STom Rix serial_printf("\tbcdUSB %4.4x\n", d->bcdUSB); 529988365a2STom Rix serial_printf("\tbDeviceClass %2.2x\n", d->bDeviceClass); 530988365a2STom Rix serial_printf("\tbDeviceSubClass %2.2x\n", d->bDeviceSubClass); 531988365a2STom Rix serial_printf("\tbDeviceProtocol %2.2x\n", d->bDeviceProtocol); 532988365a2STom Rix serial_printf("\tbMaxPacketSize0 %2.2x\n", d->bMaxPacketSize0); 533988365a2STom Rix serial_printf("\tidVendor %4.4x\n", d->idVendor); 534988365a2STom Rix serial_printf("\tidProduct %4.4x\n", d->idProduct); 535988365a2STom Rix serial_printf("\tbcdDevice %4.4x\n", d->bcdDevice); 536988365a2STom Rix serial_printf("\tiManufacturer %2.2x\n", d->iManufacturer); 537988365a2STom Rix serial_printf("\tiProduct %2.2x\n", d->iProduct); 538988365a2STom Rix serial_printf("\tiSerialNumber %2.2x\n", d->iSerialNumber); 539988365a2STom Rix serial_printf("\tbNumConfigurations %2.2x\n", d->bNumConfigurations); 540988365a2STom Rix } 541988365a2STom Rix 542988365a2STom Rix #else 543988365a2STom Rix 544988365a2STom Rix /* stubs */ 545988365a2STom Rix #define print_device_descriptor(d) 546988365a2STom Rix 547988365a2STom Rix #endif /* DEBUG */ 548232c150aSwdenk #endif 549