xref: /rk3399_rockchip-uboot/include/linux/usb/cdc.h (revision 23cd138503f90ff6af109c0096727ba641942614)
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