1*23cd1385SRemy Bohmer /* 2*23cd1385SRemy Bohmer * USB Communications Device Class (CDC) definitions 3*23cd1385SRemy Bohmer * 4*23cd1385SRemy Bohmer * CDC says how to talk to lots of different types of network adapters, 5*23cd1385SRemy Bohmer * notably ethernet adapters and various modems. It's used mostly with 6*23cd1385SRemy Bohmer * firmware based USB peripherals. 7*23cd1385SRemy Bohmer * 8*23cd1385SRemy Bohmer * Ported to U-boot by: Thomas Smits <ts.smits@gmail.com> and 9*23cd1385SRemy Bohmer * Remy Bohmer <linux@bohmer.net> 10*23cd1385SRemy Bohmer */ 11*23cd1385SRemy Bohmer 12*23cd1385SRemy Bohmer 13*23cd1385SRemy Bohmer 14*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_ACM 0x02 15*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_ETHERNET 0x06 16*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_WHCM 0x08 17*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_DMM 0x09 18*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_MDLM 0x0a 19*23cd1385SRemy Bohmer #define USB_CDC_SUBCLASS_OBEX 0x0b 20*23cd1385SRemy Bohmer 21*23cd1385SRemy Bohmer #define USB_CDC_PROTO_NONE 0 22*23cd1385SRemy Bohmer 23*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_V25TER 1 24*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_PCCA101 2 25*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3 26*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_GSM 4 27*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_3G 5 28*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_AT_CDMA 6 29*23cd1385SRemy Bohmer #define USB_CDC_ACM_PROTO_VENDOR 0xff 30*23cd1385SRemy Bohmer 31*23cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/ 32*23cd1385SRemy Bohmer 33*23cd1385SRemy Bohmer /* 34*23cd1385SRemy Bohmer * Class-Specific descriptors ... there are a couple dozen of them 35*23cd1385SRemy Bohmer */ 36*23cd1385SRemy Bohmer 37*23cd1385SRemy Bohmer #define USB_CDC_HEADER_TYPE 0x00 /* header_desc */ 38*23cd1385SRemy Bohmer #define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */ 39*23cd1385SRemy Bohmer #define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ 40*23cd1385SRemy Bohmer #define USB_CDC_UNION_TYPE 0x06 /* union_desc */ 41*23cd1385SRemy Bohmer #define USB_CDC_COUNTRY_TYPE 0x07 42*23cd1385SRemy Bohmer #define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */ 43*23cd1385SRemy Bohmer #define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ 44*23cd1385SRemy Bohmer #define USB_CDC_WHCM_TYPE 0x11 45*23cd1385SRemy Bohmer #define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ 46*23cd1385SRemy Bohmer #define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */ 47*23cd1385SRemy Bohmer #define USB_CDC_DMM_TYPE 0x14 48*23cd1385SRemy Bohmer #define USB_CDC_OBEX_TYPE 0x15 49*23cd1385SRemy Bohmer 50*23cd1385SRemy Bohmer /* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ 51*23cd1385SRemy Bohmer struct usb_cdc_header_desc { 52*23cd1385SRemy Bohmer __u8 bLength; 53*23cd1385SRemy Bohmer __u8 bDescriptorType; 54*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 55*23cd1385SRemy Bohmer 56*23cd1385SRemy Bohmer __le16 bcdCDC; 57*23cd1385SRemy Bohmer } __attribute__ ((packed)); 58*23cd1385SRemy Bohmer 59*23cd1385SRemy Bohmer /* "Call Management Descriptor" from CDC spec 5.2.3.2 */ 60*23cd1385SRemy Bohmer struct usb_cdc_call_mgmt_descriptor { 61*23cd1385SRemy Bohmer __u8 bLength; 62*23cd1385SRemy Bohmer __u8 bDescriptorType; 63*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 64*23cd1385SRemy Bohmer 65*23cd1385SRemy Bohmer __u8 bmCapabilities; 66*23cd1385SRemy Bohmer #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01 67*23cd1385SRemy Bohmer #define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02 68*23cd1385SRemy Bohmer 69*23cd1385SRemy Bohmer __u8 bDataInterface; 70*23cd1385SRemy Bohmer } __attribute__ ((packed)); 71*23cd1385SRemy Bohmer 72*23cd1385SRemy Bohmer /* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */ 73*23cd1385SRemy Bohmer struct usb_cdc_acm_descriptor { 74*23cd1385SRemy Bohmer __u8 bLength; 75*23cd1385SRemy Bohmer __u8 bDescriptorType; 76*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 77*23cd1385SRemy Bohmer 78*23cd1385SRemy Bohmer __u8 bmCapabilities; 79*23cd1385SRemy Bohmer } __attribute__ ((packed)); 80*23cd1385SRemy Bohmer 81*23cd1385SRemy Bohmer /* capabilities from 5.2.3.3 */ 82*23cd1385SRemy Bohmer 83*23cd1385SRemy Bohmer #define USB_CDC_COMM_FEATURE 0x01 84*23cd1385SRemy Bohmer #define USB_CDC_CAP_LINE 0x02 85*23cd1385SRemy Bohmer #define USB_CDC_CAP_BRK 0x04 86*23cd1385SRemy Bohmer #define USB_CDC_CAP_NOTIFY 0x08 87*23cd1385SRemy Bohmer 88*23cd1385SRemy Bohmer /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */ 89*23cd1385SRemy Bohmer struct usb_cdc_union_desc { 90*23cd1385SRemy Bohmer __u8 bLength; 91*23cd1385SRemy Bohmer __u8 bDescriptorType; 92*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 93*23cd1385SRemy Bohmer 94*23cd1385SRemy Bohmer __u8 bMasterInterface0; 95*23cd1385SRemy Bohmer __u8 bSlaveInterface0; 96*23cd1385SRemy Bohmer /* ... and there could be other slave interfaces */ 97*23cd1385SRemy Bohmer } __attribute__ ((packed)); 98*23cd1385SRemy Bohmer 99*23cd1385SRemy Bohmer /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */ 100*23cd1385SRemy Bohmer struct usb_cdc_country_functional_desc { 101*23cd1385SRemy Bohmer __u8 bLength; 102*23cd1385SRemy Bohmer __u8 bDescriptorType; 103*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 104*23cd1385SRemy Bohmer 105*23cd1385SRemy Bohmer __u8 iCountryCodeRelDate; 106*23cd1385SRemy Bohmer __le16 wCountyCode0; 107*23cd1385SRemy Bohmer /* ... and there can be a lot of country codes */ 108*23cd1385SRemy Bohmer } __attribute__ ((packed)); 109*23cd1385SRemy Bohmer 110*23cd1385SRemy Bohmer /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */ 111*23cd1385SRemy Bohmer struct usb_cdc_network_terminal_desc { 112*23cd1385SRemy Bohmer __u8 bLength; 113*23cd1385SRemy Bohmer __u8 bDescriptorType; 114*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 115*23cd1385SRemy Bohmer 116*23cd1385SRemy Bohmer __u8 bEntityId; 117*23cd1385SRemy Bohmer __u8 iName; 118*23cd1385SRemy Bohmer __u8 bChannelIndex; 119*23cd1385SRemy Bohmer __u8 bPhysicalInterface; 120*23cd1385SRemy Bohmer } __attribute__ ((packed)); 121*23cd1385SRemy Bohmer 122*23cd1385SRemy Bohmer /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ 123*23cd1385SRemy Bohmer struct usb_cdc_ether_desc { 124*23cd1385SRemy Bohmer __u8 bLength; 125*23cd1385SRemy Bohmer __u8 bDescriptorType; 126*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 127*23cd1385SRemy Bohmer 128*23cd1385SRemy Bohmer __u8 iMACAddress; 129*23cd1385SRemy Bohmer __le32 bmEthernetStatistics; 130*23cd1385SRemy Bohmer __le16 wMaxSegmentSize; 131*23cd1385SRemy Bohmer __le16 wNumberMCFilters; 132*23cd1385SRemy Bohmer __u8 bNumberPowerFilters; 133*23cd1385SRemy Bohmer } __attribute__ ((packed)); 134*23cd1385SRemy Bohmer 135*23cd1385SRemy Bohmer /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */ 136*23cd1385SRemy Bohmer struct usb_cdc_mdlm_desc { 137*23cd1385SRemy Bohmer __u8 bLength; 138*23cd1385SRemy Bohmer __u8 bDescriptorType; 139*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 140*23cd1385SRemy Bohmer 141*23cd1385SRemy Bohmer __le16 bcdVersion; 142*23cd1385SRemy Bohmer __u8 bGUID[16]; 143*23cd1385SRemy Bohmer } __attribute__ ((packed)); 144*23cd1385SRemy Bohmer 145*23cd1385SRemy Bohmer /* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */ 146*23cd1385SRemy Bohmer struct usb_cdc_mdlm_detail_desc { 147*23cd1385SRemy Bohmer __u8 bLength; 148*23cd1385SRemy Bohmer __u8 bDescriptorType; 149*23cd1385SRemy Bohmer __u8 bDescriptorSubType; 150*23cd1385SRemy Bohmer 151*23cd1385SRemy Bohmer /* type is associated with mdlm_desc.bGUID */ 152*23cd1385SRemy Bohmer __u8 bGuidDescriptorType; 153*23cd1385SRemy Bohmer __u8 bDetailData[0]; 154*23cd1385SRemy Bohmer } __attribute__ ((packed)); 155*23cd1385SRemy Bohmer 156*23cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/ 157*23cd1385SRemy Bohmer 158*23cd1385SRemy Bohmer /* 159*23cd1385SRemy Bohmer * Class-Specific Control Requests (6.2) 160*23cd1385SRemy Bohmer * 161*23cd1385SRemy Bohmer * section 3.6.2.1 table 4 has the ACM profile, for modems. 162*23cd1385SRemy Bohmer * section 3.8.2 table 10 has the ethernet profile. 163*23cd1385SRemy Bohmer */ 164*23cd1385SRemy Bohmer 165*23cd1385SRemy Bohmer #define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00 166*23cd1385SRemy Bohmer #define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01 167*23cd1385SRemy Bohmer #define USB_CDC_REQ_SET_LINE_CODING 0x20 168*23cd1385SRemy Bohmer #define USB_CDC_REQ_GET_LINE_CODING 0x21 169*23cd1385SRemy Bohmer #define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22 170*23cd1385SRemy Bohmer #define USB_CDC_REQ_SEND_BREAK 0x23 171*23cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 172*23cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41 173*23cd1385SRemy Bohmer #define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42 174*23cd1385SRemy Bohmer #define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43 175*23cd1385SRemy Bohmer #define USB_CDC_GET_ETHERNET_STATISTIC 0x44 176*23cd1385SRemy Bohmer 177*23cd1385SRemy Bohmer /* Line Coding Structure from CDC spec 6.2.13 */ 178*23cd1385SRemy Bohmer struct usb_cdc_line_coding { 179*23cd1385SRemy Bohmer __le32 dwDTERate; 180*23cd1385SRemy Bohmer __u8 bCharFormat; 181*23cd1385SRemy Bohmer #define USB_CDC_1_STOP_BITS 0 182*23cd1385SRemy Bohmer #define USB_CDC_1_5_STOP_BITS 1 183*23cd1385SRemy Bohmer #define USB_CDC_2_STOP_BITS 2 184*23cd1385SRemy Bohmer 185*23cd1385SRemy Bohmer __u8 bParityType; 186*23cd1385SRemy Bohmer #define USB_CDC_NO_PARITY 0 187*23cd1385SRemy Bohmer #define USB_CDC_ODD_PARITY 1 188*23cd1385SRemy Bohmer #define USB_CDC_EVEN_PARITY 2 189*23cd1385SRemy Bohmer #define USB_CDC_MARK_PARITY 3 190*23cd1385SRemy Bohmer #define USB_CDC_SPACE_PARITY 4 191*23cd1385SRemy Bohmer 192*23cd1385SRemy Bohmer __u8 bDataBits; 193*23cd1385SRemy Bohmer } __attribute__ ((packed)); 194*23cd1385SRemy Bohmer 195*23cd1385SRemy Bohmer /* table 62; bits in multicast filter */ 196*23cd1385SRemy Bohmer #define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0) 197*23cd1385SRemy Bohmer #define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */ 198*23cd1385SRemy Bohmer #define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2) 199*23cd1385SRemy Bohmer #define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3) 200*23cd1385SRemy Bohmer #define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */ 201*23cd1385SRemy Bohmer 202*23cd1385SRemy Bohmer 203*23cd1385SRemy Bohmer /*-------------------------------------------------------------------------*/ 204*23cd1385SRemy Bohmer 205*23cd1385SRemy Bohmer /* 206*23cd1385SRemy Bohmer * Class-Specific Notifications (6.3) sent by interrupt transfers 207*23cd1385SRemy Bohmer * 208*23cd1385SRemy Bohmer * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications 209*23cd1385SRemy Bohmer * section 3.6.2.1 table 5 specifies ACM notifications 210*23cd1385SRemy Bohmer */ 211*23cd1385SRemy Bohmer 212*23cd1385SRemy Bohmer #define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00 213*23cd1385SRemy Bohmer #define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01 214*23cd1385SRemy Bohmer #define USB_CDC_NOTIFY_SERIAL_STATE 0x20 215*23cd1385SRemy Bohmer #define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a 216*23cd1385SRemy Bohmer 217*23cd1385SRemy Bohmer struct usb_cdc_notification { 218*23cd1385SRemy Bohmer __u8 bmRequestType; 219*23cd1385SRemy Bohmer __u8 bNotificationType; 220*23cd1385SRemy Bohmer __le16 wValue; 221*23cd1385SRemy Bohmer __le16 wIndex; 222*23cd1385SRemy Bohmer __le16 wLength; 223*23cd1385SRemy Bohmer } __attribute__ ((packed)); 224*23cd1385SRemy Bohmer 225