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