1 | /* $NetBSD: usb.h,v 1.116 2018/07/31 16:44:30 khorben Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (c) 1998 The NetBSD Foundation, Inc. |
5 | * All rights reserved. |
6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Lennart Augustsson (lennart@augustsson.net) at |
9 | * Carlstedt Research & Technology. |
10 | * |
11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions |
13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright |
15 | * notice, this list of conditions and the following disclaimer. |
16 | * 2. Redistributions in binary form must reproduce the above copyright |
17 | * notice, this list of conditions and the following disclaimer in the |
18 | * documentation and/or other materials provided with the distribution. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
21 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
24 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
30 | * POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | |
34 | #ifndef _USB_H_ |
35 | #define _USB_H_ |
36 | |
37 | #include <sys/types.h> |
38 | #include <sys/time.h> |
39 | |
40 | #include <sys/ioctl.h> |
41 | |
42 | #if defined(_KERNEL) |
43 | |
44 | #include <sys/device.h> |
45 | |
46 | #endif |
47 | |
48 | #ifdef USB_DEBUG |
49 | #define Static |
50 | #else |
51 | #define Static static |
52 | #endif |
53 | |
54 | #define USB_STACK_VERSION 2 |
55 | |
56 | #define USB_MAX_DEVICES 128 /* 0, 1-127 */ |
57 | #define USB_MIN_DEVICES 2 /* unused + root HUB */ |
58 | #define USB_START_ADDR 0 |
59 | |
60 | #define USB_CONTROL_ENDPOINT 0 |
61 | #define USB_MAX_ENDPOINTS 16 |
62 | |
63 | #define USB_FRAMES_PER_SECOND 1000 |
64 | #define USB_UFRAMES_PER_FRAME 8 |
65 | |
66 | /* |
67 | * The USB records contain some unaligned little-endian word |
68 | * components. The U[SG]ETW macros take care of both the alignment |
69 | * and endian problem and should always be used to access non-byte |
70 | * values. |
71 | */ |
72 | typedef uint8_t uByte; |
73 | typedef uint8_t uWord[2]; |
74 | typedef uint8_t uDWord[4]; |
75 | |
76 | #define USETW2(w,h,l) ((w)[0] = (uint8_t)(l), (w)[1] = (uint8_t)(h)) |
77 | |
78 | #define UGETW(w) ((w)[0] | ((w)[1] << 8)) |
79 | #define USETW(w,v) ((w)[0] = (uint8_t)(v), (w)[1] = (uint8_t)((v) >> 8)) |
80 | #define USETWD(val) { (uint8_t)(val), (uint8_t)((val) >> 8) } |
81 | #define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) |
82 | #define USETDW(w,v) ((w)[0] = (uint8_t)(v), \ |
83 | (w)[1] = (uint8_t)((v) >> 8), \ |
84 | (w)[2] = (uint8_t)((v) >> 16), \ |
85 | (w)[3] = (uint8_t)((v) >> 24)) |
86 | #define UPACKED __packed |
87 | |
88 | typedef struct { |
89 | uByte bmRequestType; |
90 | uByte bRequest; |
91 | uWord wValue; |
92 | uWord wIndex; |
93 | uWord wLength; |
94 | } UPACKED usb_device_request_t; |
95 | |
96 | #define UT_GET_DIR(a) ((a) & 0x80) |
97 | #define UT_WRITE 0x00 |
98 | #define UT_READ 0x80 |
99 | |
100 | #define UT_GET_TYPE(a) ((a) & 0x60) |
101 | #define UT_STANDARD 0x00 |
102 | #define UT_CLASS 0x20 |
103 | #define UT_VENDOR 0x40 |
104 | |
105 | #define UT_GET_RECIPIENT(a) ((a) & 0x1f) |
106 | #define UT_DEVICE 0x00 |
107 | #define UT_INTERFACE 0x01 |
108 | #define UT_ENDPOINT 0x02 |
109 | #define UT_OTHER 0x03 |
110 | |
111 | #define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) |
112 | #define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) |
113 | #define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) |
114 | #define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) |
115 | #define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) |
116 | #define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) |
117 | #define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) |
118 | #define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) |
119 | #define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) |
120 | #define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) |
121 | #define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) |
122 | #define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) |
123 | #define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) |
124 | #define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) |
125 | #define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) |
126 | #define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) |
127 | #define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) |
128 | #define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) |
129 | #define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) |
130 | #define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) |
131 | #define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) |
132 | #define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) |
133 | |
134 | /* Standard Requests Codes from the USB 2.0 spec, table 9-4 */ |
135 | #define UR_GET_STATUS 0x00 |
136 | #define UR_CLEAR_FEATURE 0x01 |
137 | #define UR_SET_FEATURE 0x03 |
138 | #define UR_SET_ADDRESS 0x05 |
139 | #define UR_GET_DESCRIPTOR 0x06 |
140 | #define UDESC_DEVICE 0x01 |
141 | #define UDESC_CONFIG 0x02 |
142 | #define UDESC_STRING 0x03 |
143 | #define UDESC_INTERFACE 0x04 |
144 | #define UDESC_ENDPOINT 0x05 |
145 | #define UDESC_DEVICE_QUALIFIER 0x06 |
146 | #define UDESC_OTHER_SPEED_CONFIGURATION 0x07 |
147 | #define UDESC_INTERFACE_POWER 0x08 |
148 | #define UDESC_OTG 0x09 |
149 | #define UDESC_DEBUG 0x0a |
150 | #define UDESC_INTERFACE_ASSOC 0x0b |
151 | #define UDESC_BOS 0x0f |
152 | #define UDESC_DEVICE_CAPABILITY 0x10 |
153 | #define UDESC_CS_DEVICE 0x21 /* class specific */ |
154 | #define UDESC_CS_CONFIG 0x22 |
155 | #define UDESC_CS_STRING 0x23 |
156 | #define UDESC_CS_INTERFACE 0x24 |
157 | #define UDESC_CS_ENDPOINT 0x25 |
158 | #define UDESC_HUB 0x29 |
159 | #define UDESC_SS_HUB 0x2a /* super speed */ |
160 | #define UDESC_ENDPOINT_SS_COMP 0x30 /* super speed */ |
161 | #define UDESC_ENDPOINT_ISOCH_SSP_COMP 0x31 |
162 | #define UR_SET_DESCRIPTOR 0x07 |
163 | #define UR_GET_CONFIG 0x08 |
164 | #define UR_SET_CONFIG 0x09 |
165 | #define UR_GET_INTERFACE 0x0a |
166 | #define UR_SET_INTERFACE 0x0b |
167 | #define UR_SYNCH_FRAME 0x0c |
168 | #define UR_SET_ENCRYPTION 0x0d |
169 | #define UR_GET_ENCRYPTION 0x0e |
170 | #define UR_SET_HANDSHAKE 0x0f |
171 | #define UR_GET_HANDSHAKE 0x10 |
172 | #define UR_SET_CONNECTION 0x11 |
173 | #define UR_SET_SECURITY_DATA 0x12 |
174 | #define UR_GET_SECURITY_DATA 0x13 |
175 | #define UR_SET_WUSB_DATA 0x14 |
176 | #define UR_LOOPBACK_DATA_WRITE 0x15 |
177 | #define UR_LOOPBACK_DATA_READ 0x16 |
178 | #define UR_SET_INTERFACE_DS 0x17 |
179 | #define UR_SET_SEL 0x30 |
180 | #define UR_SET_ISOCH_DELAY 0x31 |
181 | |
182 | /* |
183 | * Feature selectors. USB 2.0 spec, table 9-6 and OTG and EH suppliment, |
184 | * table 6-2 |
185 | */ |
186 | #define UF_ENDPOINT_HALT 0 |
187 | #define UF_INTERFACE_FUNCTION_SUSPEND 0 |
188 | #define UF_DEVICE_REMOTE_WAKEUP 1 |
189 | #define UF_TEST_MODE 2 |
190 | #define UF_DEVICE_B_HNP_ENABLE 3 |
191 | #define UF_DEVICE_A_HNP_SUPPORT 4 |
192 | #define UF_DEVICE_A_ALT_HNP_SUPPORT 5 |
193 | #define UF_DEVICE_WUSB_DEVICE 6 |
194 | #define UF_U1_ENABLE 0x30 |
195 | #define UF_U2_ENABLE 0x31 |
196 | #define UF_LTM_ENABLE 0x32 |
197 | |
198 | #define USB_MAX_IPACKET 8 /* maximum size of the initial packet */ |
199 | |
200 | #define USB_2_MAX_CTRL_PACKET 64 |
201 | #define USB_2_MAX_BULK_PACKET 512 |
202 | |
203 | #define USB_3_MAX_CTRL_PACKET 512 |
204 | |
205 | typedef struct { |
206 | uByte bLength; |
207 | uByte bDescriptorType; |
208 | uByte bDescriptorSubtype; |
209 | } UPACKED usb_descriptor_t; |
210 | |
211 | typedef struct { |
212 | uByte bLength; |
213 | uByte bDescriptorType; |
214 | uWord bcdUSB; |
215 | #define UD_USB_2_0 0x0200 |
216 | #define UD_USB_3_0 0x0300 |
217 | #define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0) |
218 | #define UD_IS_USB3(d) (UGETW((d)->bcdUSB) >= UD_USB_3_0) |
219 | uByte bDeviceClass; |
220 | uByte bDeviceSubClass; |
221 | uByte bDeviceProtocol; |
222 | uByte bMaxPacketSize; |
223 | /* The fields below are not part of the initial descriptor. */ |
224 | uWord idVendor; |
225 | uWord idProduct; |
226 | uWord bcdDevice; |
227 | uByte iManufacturer; |
228 | uByte iProduct; |
229 | uByte iSerialNumber; |
230 | uByte bNumConfigurations; |
231 | } UPACKED usb_device_descriptor_t; |
232 | #define USB_DEVICE_DESCRIPTOR_SIZE 18 |
233 | |
234 | typedef struct { |
235 | uByte bLength; |
236 | uByte bDescriptorType; |
237 | uWord wTotalLength; |
238 | uByte bNumInterface; |
239 | uByte bConfigurationValue; |
240 | uByte iConfiguration; |
241 | uByte bmAttributes; |
242 | #define UC_ATTR_MBO 0x80 |
243 | #define UC_SELF_POWERED 0x40 |
244 | #define UC_REMOTE_WAKEUP 0x20 |
245 | uByte bMaxPower; /* max current in 2 mA units */ |
246 | #define UC_POWER_FACTOR 2 |
247 | #define UC_POWER_FACTOR_SS 8 |
248 | } UPACKED usb_config_descriptor_t; |
249 | #define USB_CONFIG_DESCRIPTOR_SIZE 9 |
250 | |
251 | typedef struct { |
252 | uByte bLength; |
253 | uByte bDescriptorType; |
254 | uByte bInterfaceNumber; |
255 | uByte bAlternateSetting; |
256 | uByte bNumEndpoints; |
257 | uByte bInterfaceClass; |
258 | uByte bInterfaceSubClass; |
259 | uByte bInterfaceProtocol; |
260 | uByte iInterface; |
261 | } UPACKED usb_interface_descriptor_t; |
262 | #define USB_INTERFACE_DESCRIPTOR_SIZE 9 |
263 | |
264 | typedef struct { |
265 | uByte bLength; |
266 | uByte bDescriptorType; |
267 | uByte bFirstInterface; |
268 | uByte bInterfaceCount; |
269 | uByte bFunctionClass; |
270 | uByte bFunctionSubClass; |
271 | uByte bFunctionProtocol; |
272 | uByte iFunction; |
273 | } UPACKED usb_interface_assoc_descriptor_t; |
274 | #define USB_INTERFACE_ASSOC_DESCRIPTOR_SIZE 8 |
275 | |
276 | typedef struct { |
277 | uByte bLength; |
278 | uByte bDescriptorType; |
279 | uByte bEndpointAddress; |
280 | #define UE_GET_DIR(a) ((a) & 0x80) |
281 | #define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) |
282 | #define UE_DIR_IN 0x80 |
283 | #define UE_DIR_OUT 0x00 |
284 | #define UE_ADDR 0x0f |
285 | #define UE_GET_ADDR(a) ((a) & UE_ADDR) |
286 | uByte bmAttributes; |
287 | #define UE_XFERTYPE 0x03 |
288 | #define UE_CONTROL 0x00 |
289 | #define UE_ISOCHRONOUS 0x01 |
290 | #define UE_BULK 0x02 |
291 | #define UE_INTERRUPT 0x03 |
292 | #define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) |
293 | #define UE_ISO_TYPE 0x0c |
294 | #define UE_ISO_ASYNC 0x04 |
295 | #define UE_ISO_ADAPT 0x08 |
296 | #define UE_ISO_SYNC 0x0c |
297 | #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) |
298 | uWord wMaxPacketSize; |
299 | #define UE_GET_TRANS(a) (((a) >> 11) & 0x3) |
300 | #define UE_GET_SIZE(a) ((a) & 0x7ff) |
301 | uByte bInterval; |
302 | } UPACKED usb_endpoint_descriptor_t; |
303 | #define USB_ENDPOINT_DESCRIPTOR_SIZE 7 |
304 | |
305 | typedef struct { |
306 | uByte bLength; |
307 | uByte bDescriptorType; |
308 | uByte bMaxBurst; |
309 | uByte bmAttributes; |
310 | #define UE_GET_BULK_STREAMS_MASK __BITS(4,0) |
311 | #define UE_GET_BULK_STREAMS(x) __SHIFTOUT(x, UE_GET_BULK_STREAMS_MASK) |
312 | #define UE_GET_SS_ISO_MULT_MASK __BITS(1,0) |
313 | #define UE_GET_SS_ISO_MULT(x) __SHIFTOUT(x, UE_GET_SS_ISO_MULT_MASK) |
314 | #define UE_GET_SS_ISO_SSP_MASK __BIT(7) |
315 | #define UE_GET_SS_ISO_SSP(x) __SHIFTOUT(x, UE_GET_SS_ISO_SSP_MASK) |
316 | /* The fields below are only valid for periodic endpoints */ |
317 | uWord wBytesPerInterval; |
318 | } UPACKED usb_endpoint_ss_comp_descriptor_t; |
319 | #define USB_ENDPOINT_SS_COMP_DESCRIPTOR_SIZE 6 |
320 | |
321 | /* USB 3.0 9.6.2, Table 9-12 */ |
322 | typedef struct { |
323 | uByte bLength; |
324 | uByte bDescriptorType; |
325 | uWord wTotalLength; |
326 | uByte bNumDeviceCaps; |
327 | } UPACKED usb_bos_descriptor_t; |
328 | #define USB_BOS_DESCRIPTOR_SIZE 5 |
329 | |
330 | /* common members of device capability descriptors */ |
331 | typedef struct { |
332 | uByte bLength; |
333 | uByte bDescriptorType; |
334 | uByte bDevCapabilityType; |
335 | /* Table 9-14 */ |
336 | #define USB_DEVCAP_RESERVED 0x00 |
337 | #define USB_DEVCAP_WUSB 0x01 |
338 | #define USB_DEVCAP_USB2EXT 0x02 |
339 | #define USB_DEVCAP_SUPER_SPEED 0x03 |
340 | #define USB_DEVCAP_CONTAINER_ID 0x04 |
341 | #define USB_DEVCAP_PLATFORM 0x05 |
342 | #define USB_DEVCAP_POWER_DELIVERY_CAPABILITY 0x06 |
343 | #define USB_DEVCAP_BATTERY_INFO_CAPABILITY 0x07 |
344 | #define USB_DEVCAP_PD_CONSUMER_PORT_CAPABILITY 0x08 |
345 | #define USB_DEVCAP_PD_PROVIDER_PORT_CAPABILITY 0x09 |
346 | #define USB_DEVCAP_SUPERSPEED_PLUS 0x0a |
347 | #define USB_DEVCAP_PRECISION_TIME_MEASUREMENT 0x0b |
348 | #define USB_DEVCAP_WUSB_EXT 0x0c |
349 | /* data ... */ |
350 | } UPACKED usb_device_capability_descriptor_t; |
351 | #define USB_DEVICE_CAPABILITY_DESCRIPTOR_SIZE 3 /* at least */ |
352 | |
353 | /* 9.6.2.1 */ |
354 | typedef struct { |
355 | uByte bLength; |
356 | uByte bDescriptorType; |
357 | uByte bDevCapabilityType; |
358 | uDWord bmAttributes; |
359 | #define USB_DEVCAP_V2EXT_LPM __BIT(1) |
360 | #define USB_DEVCAP_V2EXT_BESL_SUPPORTED __BIT(2) |
361 | #define USB_DEVCAP_V2EXT_BESL_BASELINE_VALID __BIT(3) |
362 | #define USB_DEVCAP_V2EXT_BESL_DEEP_VALID __BIT(4) |
363 | #define USB_DEVCAP_V2EXT_BESL_BASELINE_MASK __BITS(11, 8) |
364 | #define USB_DEVCAP_V2EXT_BESL_BASELINE_GET(x) __SHIFTOUT(x, USB_V2EXT_BESL_BASELINE_MASK) |
365 | #define USB_DEVCAP_V2EXT_BESL_DEEP_MASK __BITS(15, 12) |
366 | #define USB_DEVCAP_V2EXT_BESL_DEEP_GET(x) __SHIFTOUT(x, USB_V2EXT_BESL_DEEP_MASK) |
367 | } UPACKED usb_devcap_usb2ext_descriptor_t; |
368 | #define USB_DEVCAP_USB2EXT_DESCRIPTOR_SIZE 7 |
369 | |
370 | /* 9.6.2.2 */ |
371 | typedef struct { |
372 | uByte bLength; |
373 | uByte bDescriptorType; |
374 | uByte bDevCapabilityType; |
375 | uByte bmAttributes; |
376 | #define USB_DEVCAP_SS_LTM __BIT(1) |
377 | uWord wSpeedsSupported; |
378 | #define USB_DEVCAP_SS_SPEED_LS __BIT(0) |
379 | #define USB_DEVCAP_SS_SPEED_FS __BIT(1) |
380 | #define USB_DEVCAP_SS_SPEED_HS __BIT(2) |
381 | #define USB_DEVCAP_SS_SPEED_SS __BIT(3) |
382 | uByte bFunctionalitySupport; |
383 | uByte bU1DevExitLat; |
384 | uWord wU2DevExitLat; |
385 | } UPACKED usb_devcap_ss_descriptor_t; |
386 | #define USB_DEVCAP_SS_DESCRIPTOR_SIZE 10 |
387 | |
388 | /* 9.6.2.4 */ |
389 | typedef struct { |
390 | uByte bLength; |
391 | uByte bDescriptorType; |
392 | uByte bDevCapabilityType; |
393 | uByte bReserved; |
394 | uByte ContainerID[16]; |
395 | } UPACKED usb_devcap_container_id_descriptor_t; |
396 | #define USB_DEVCAP_CONTAINER_ID_DESCRIPTOR_SIZE 20 |
397 | |
398 | typedef struct { |
399 | uByte bLength; |
400 | uByte bDescriptorType; |
401 | uByte bDevCapabilityType; |
402 | uByte bReserved; |
403 | uByte PlatformCapabilityUUID[16]; |
404 | uByte CapabilityData[0]; |
405 | } UPACKED usb_devcap_platform_descriptor_t; |
406 | #define USB_DEVCAP_PLATFORM_DESCRIPTOR_SIZE 20 |
407 | |
408 | /* usb 3.1 ch 9.6.2.5 */ |
409 | typedef struct { |
410 | uByte bLength; |
411 | uByte bDescriptorType; |
412 | uByte bDevCapabilityType; |
413 | uByte bReserved; |
414 | uDWord bmAttributes; |
415 | #define USB_DEVCAP_SSP_SSAC(x) __SHIFTOUT(x, __BITS(4,0)) |
416 | #define USB_DEVCAP_SSP_SSIC(x) __SHIFTOUT(x, __BITS(8,5)) |
417 | uWord wFunctionalitySupport; |
418 | #define USB_DEVCAP_SSP_SSID(x) __SHIFTOUT(x, __BITS(3,0)) |
419 | #define USB_DEVCAP_SSP_MIN_RXLANE_COUNT(x) __SHIFTOUT(x, __BITS(11,8)) |
420 | #define USB_DEVCAP_SSP_MIN_TXLANE_COUNT(x) __SHIFTOUT(x, __BITS(15,12)) |
421 | uWord wReserved; |
422 | uDWord bmSublinkSpeedAttr[0]; |
423 | #define USB_DEVCAP_SSP_SSID(x) __SHIFTOUT(x, __BITS(3,0)) |
424 | #define USB_DEVCAP_SSP_LSE(x) __SHIFTOUT(x, __BITS(5,4)) |
425 | #define USB_DEVCAP_SSP_ST(x) __SHIFTOUT(x, __BITS(7,6)) |
426 | #define USB_DEVCAP_SSP_LP(x) __SHIFTOUT(x, __BITS(15,14)) |
427 | #define USB_DEVCAP_SSP_LSM(x) __SHIFTOUT(x, __BITS(31,16)) |
428 | } UPACKED usb_devcap_ssp_descriptor_t; |
429 | #define USB_DEVCAP_SSP_DESCRIPTOR_SIZE 12 /* variable length */ |
430 | |
431 | typedef struct { |
432 | uByte bLength; |
433 | uByte bDescriptorType; |
434 | uWord bString[126]; |
435 | } UPACKED usb_string_descriptor_t; |
436 | #define USB_MAX_STRING_LEN 128 |
437 | #define USB_LANGUAGE_TABLE 0 /* # of the string language id table */ |
438 | #define USB_MAX_ENCODED_STRING_LEN (USB_MAX_STRING_LEN * 3) /* UTF8 */ |
439 | |
440 | /* Hub specific request */ |
441 | #define UR_GET_BUS_STATE 0x02 |
442 | #define UR_CLEAR_TT_BUFFER 0x08 |
443 | #define UR_RESET_TT 0x09 |
444 | #define UR_GET_TT_STATE 0x0a |
445 | #define UR_STOP_TT 0x0b |
446 | #define UR_SET_AND_TEST 0x0c /* USB 2.0 only */ |
447 | #define UR_SET_HUB_DEPTH 0x0c /* USB 3.0 only */ |
448 | #define UR_GET_PORT_ERR_COUNT 0x0d |
449 | /* Port Status Type for GET_STATUS, USB 3.1 10.16.2.6 and Table 10-12 */ |
450 | #define UR_PST_PORT_STATUS 0 |
451 | #define UR_PST_PD_STATUS 1 |
452 | #define UR_PST_EXT_PORT_STATUS 2 |
453 | |
454 | /* |
455 | * Hub features from USB 2.0 spec, table 11-17 and updated by the |
456 | * LPM ECN table 4-7. |
457 | */ |
458 | #define UHF_C_HUB_LOCAL_POWER 0 |
459 | #define UHF_C_HUB_OVER_CURRENT 1 |
460 | #define UHF_PORT_CONNECTION 0 |
461 | #define UHF_PORT_ENABLE 1 |
462 | #define UHF_PORT_SUSPEND 2 |
463 | #define UHF_PORT_OVER_CURRENT 3 |
464 | #define UHF_PORT_RESET 4 |
465 | #define UHF_PORT_LINK_STATE 5 |
466 | #define UHF_PORT_POWER 8 |
467 | #define UHF_PORT_LOW_SPEED 9 |
468 | #define UHF_PORT_L1 10 |
469 | #define UHF_C_PORT_CONNECTION 16 |
470 | #define UHF_C_PORT_ENABLE 17 |
471 | #define UHF_C_PORT_SUSPEND 18 |
472 | #define UHF_C_PORT_OVER_CURRENT 19 |
473 | #define UHF_C_PORT_RESET 20 |
474 | #define UHF_PORT_TEST 21 |
475 | #define UHF_PORT_INDICATOR 22 |
476 | #define UHF_C_PORT_L1 23 |
477 | |
478 | /* SS HUB specific features */ |
479 | #define UHF_PORT_U1_TIMEOUT 23 |
480 | #define UHF_PORT_U2_TIMEOUT 24 |
481 | #define UHF_C_PORT_LINK_STATE 25 |
482 | #define UHF_C_PORT_CONFIG_ERROR 26 |
483 | #define UHF_PORT_REMOTE_WAKE_MASK 27 |
484 | #define UHF_BH_PORT_RESET 28 |
485 | #define UHF_C_BH_PORT_RESET 29 |
486 | #define UHF_FORCE_LINKPM_ACCEPT 30 |
487 | |
488 | typedef struct { |
489 | uByte bDescLength; |
490 | uByte bDescriptorType; |
491 | uByte bNbrPorts; |
492 | #define UHD_NPORTS_MAX 255 |
493 | uWord wHubCharacteristics; |
494 | #define UHD_PWR 0x0003 |
495 | #define UHD_PWR_GANGED 0x0000 |
496 | #define UHD_PWR_INDIVIDUAL 0x0001 |
497 | #define UHD_PWR_NO_SWITCH 0x0002 |
498 | #define UHD_COMPOUND 0x0004 |
499 | #define UHD_OC 0x0018 |
500 | #define UHD_OC_GLOBAL 0x0000 |
501 | #define UHD_OC_INDIVIDUAL 0x0008 |
502 | #define UHD_OC_NONE 0x0010 |
503 | #define UHD_TT_THINK 0x0060 |
504 | #define UHD_TT_THINK_8 0x0000 |
505 | #define UHD_TT_THINK_16 0x0020 |
506 | #define UHD_TT_THINK_24 0x0040 |
507 | #define UHD_TT_THINK_32 0x0060 |
508 | #define UHD_PORT_IND 0x0080 |
509 | uByte bPwrOn2PwrGood; /* delay in 2 ms units */ |
510 | #define UHD_PWRON_FACTOR 2 |
511 | uByte bHubContrCurrent; |
512 | uByte DeviceRemovable[32]; /* max 255 ports */ |
513 | #define UHD_NOT_REMOV(desc, i) \ |
514 | (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) |
515 | /* deprecated */ uByte PortPowerCtrlMask[1]; |
516 | } UPACKED usb_hub_descriptor_t; |
517 | #define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */ |
518 | |
519 | typedef struct { |
520 | uByte bLength; |
521 | uByte bDescriptorType; |
522 | uByte bNbrPorts; |
523 | #define UHD_SS_NPORTS_MAX 15 |
524 | uWord wHubCharacteristics; |
525 | uByte bPwrOn2PwrGood; /* delay in 2 ms units */ |
526 | uByte bHubContrCurrent; |
527 | uByte bHubHdrDecLat; |
528 | uWord wHubDelay; /* forward delay in nanosec */ |
529 | uByte DeviceRemovable[2]; /* max 15 ports */ |
530 | } UPACKED usb_hub_ss_descriptor_t; |
531 | #define USB_HUB_SS_DESCRIPTOR_SIZE 12 |
532 | |
533 | typedef struct { |
534 | uByte bLength; |
535 | uByte bDescriptorType; |
536 | uWord bcdUSB; |
537 | uByte bDeviceClass; |
538 | uByte bDeviceSubClass; |
539 | uByte bDeviceProtocol; |
540 | uByte bMaxPacketSize0; |
541 | uByte bNumConfigurations; |
542 | uByte bReserved; |
543 | } UPACKED usb_device_qualifier_t; |
544 | #define USB_DEVICE_QUALIFIER_SIZE 10 |
545 | |
546 | typedef struct { |
547 | uByte bLength; |
548 | uByte bDescriptorType; |
549 | uByte bmAttributes; |
550 | #define UOTG_SRP 0x01 |
551 | #define UOTG_HNP 0x02 |
552 | } UPACKED usb_otg_descriptor_t; |
553 | |
554 | /* OTG feature selectors */ |
555 | #define UOTG_B_HNP_ENABLE 3 |
556 | #define UOTG_A_HNP_SUPPORT 4 |
557 | #define UOTG_A_ALT_HNP_SUPPORT 5 |
558 | |
559 | typedef struct { |
560 | uByte bLength; |
561 | uByte bDescriptorType; |
562 | uByte bDebugInEndpoint; |
563 | uByte bDebugOutEndpoint; |
564 | } UPACKED usb_debug_descriptor_t; |
565 | |
566 | typedef struct { |
567 | uWord wStatus; |
568 | /* Device status flags */ |
569 | #define UDS_SELF_POWERED 0x0001 |
570 | #define UDS_REMOTE_WAKEUP 0x0002 |
571 | /* Endpoint status flags */ |
572 | #define UES_HALT 0x0001 |
573 | } UPACKED usb_status_t; |
574 | |
575 | typedef struct { |
576 | uWord wHubStatus; |
577 | #define UHS_LOCAL_POWER 0x0001 |
578 | #define UHS_OVER_CURRENT 0x0002 |
579 | uWord wHubChange; |
580 | } UPACKED usb_hub_status_t; |
581 | |
582 | typedef struct { |
583 | uWord wPortStatus; |
584 | #define UPS_CURRENT_CONNECT_STATUS 0x0001 |
585 | #define UPS_PORT_ENABLED 0x0002 |
586 | #define UPS_SUSPEND 0x0004 |
587 | #define UPS_OVERCURRENT_INDICATOR 0x0008 |
588 | #define UPS_RESET 0x0010 |
589 | #define UPS_PORT_L1 0x0020 |
590 | #define UPS_PORT_LS_MASK __BITS(8,5) |
591 | #define UPS_PORT_LS_GET(x) __SHIFTOUT(x, UPS_PORT_LS_MASK) |
592 | #define UPS_PORT_LS_SET(x) __SHIFTIN(x, UPS_PORT_LS_MASK) |
593 | #define UPS_PORT_LS_U0 0x00 |
594 | #define UPS_PORT_LS_U1 0x01 |
595 | #define UPS_PORT_LS_U2 0x02 |
596 | #define UPS_PORT_LS_U3 0x03 |
597 | #define UPS_PORT_LS_SS_DIS 0x04 |
598 | #define UPS_PORT_LS_RX_DET 0x05 |
599 | #define UPS_PORT_LS_SS_INA 0x06 |
600 | #define UPS_PORT_LS_POLL 0x07 |
601 | #define UPS_PORT_LS_RECOVER 0x08 |
602 | #define UPS_PORT_LS_HOT_RST 0x09 |
603 | #define UPS_PORT_LS_COMP_MODE 0x0a |
604 | #define UPS_PORT_LS_LOOPBACK 0x0b |
605 | #define UPS_PORT_LS_RESUME 0x0f |
606 | #define UPS_PORT_POWER 0x0100 |
607 | #define UPS_PORT_POWER_SS 0x0200 |
608 | #define UPS_FULL_SPEED 0x0000 /* for completeness */ |
609 | #define UPS_LOW_SPEED 0x0200 |
610 | #define UPS_HIGH_SPEED 0x0400 |
611 | #define UPS_PORT_TEST 0x0800 |
612 | #define UPS_PORT_INDICATOR 0x1000 |
613 | #define UPS_OTHER_SPEED 0x2000 /* currently NetBSD specific */ |
614 | uWord wPortChange; |
615 | #define UPS_C_CONNECT_STATUS 0x0001 |
616 | #define UPS_C_PORT_ENABLED 0x0002 |
617 | #define UPS_C_SUSPEND 0x0004 |
618 | #define UPS_C_OVERCURRENT_INDICATOR 0x0008 |
619 | #define UPS_C_PORT_RESET 0x0010 |
620 | #define UPS_C_PORT_L1 0x0020 |
621 | #define UPS_C_BH_PORT_RESET 0x0020 |
622 | #define UPS_C_PORT_LINK_STATE 0x0040 |
623 | #define UPS_C_PORT_CONFIG_ERROR 0x0080 |
624 | } UPACKED usb_port_status_t; |
625 | |
626 | /* 10.16.2.6 */ |
627 | /* Valid when port status type is UR_PST_EXT_PORT_STATUS. */ |
628 | typedef struct { |
629 | uWord wPortStatus; |
630 | uWord wPortChange; |
631 | uDWord dwExtPortStatus; |
632 | } UPACKED usb_port_status_ext_t; |
633 | |
634 | /* Device class codes */ |
635 | #define UDCLASS_IN_INTERFACE 0x00 |
636 | #define UDCLASS_COMM 0x02 |
637 | #define UDCLASS_HUB 0x09 |
638 | #define UDSUBCLASS_HUB 0x00 |
639 | #define UDPROTO_FSHUB 0x00 |
640 | #define UDPROTO_HSHUBSTT 0x01 |
641 | #define UDPROTO_HSHUBMTT 0x02 |
642 | #define UDPROTO_SSHUB 0x03 |
643 | #define UDCLASS_DIAGNOSTIC 0xdc |
644 | #define UDCLASS_WIRELESS 0xe0 |
645 | #define UDSUBCLASS_RF 0x01 |
646 | #define UDPROTO_BLUETOOTH 0x01 |
647 | #define UDCLASS_VENDOR 0xff |
648 | |
649 | /* Interface class codes */ |
650 | #define UICLASS_UNSPEC 0x00 |
651 | |
652 | #define UICLASS_AUDIO 0x01 |
653 | #define UISUBCLASS_AUDIOCONTROL 1 |
654 | #define UISUBCLASS_AUDIOSTREAM 2 |
655 | #define UISUBCLASS_MIDISTREAM 3 |
656 | |
657 | #define UICLASS_VIDEO 0x0e |
658 | #define UISUBCLASS_VIDEOCONTROL 1 |
659 | #define UISUBCLASS_VIDEOSTREAMING 2 |
660 | #define UISUBCLASS_VIDEOCOLLECTION 3 |
661 | |
662 | #define UICLASS_CDC 0x02 /* communication */ |
663 | #define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 |
664 | #define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 |
665 | #define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 |
666 | #define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 |
667 | #define UISUBCLASS_CAPI_CONTROLMODEL 5 |
668 | #define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 |
669 | #define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 |
670 | #define UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10 |
671 | #define UISUBCLASS_NETWORK_CONTROL_MODEL 13 |
672 | #define UISUBCLASS_MOBILE_BROADBAND_INTERFACE_MODEL 14 |
673 | #define UIPROTO_CDC_NOCLASS 0 /* no class specific |
674 | protocol required */ |
675 | #define UIPROTO_CDC_AT 1 |
676 | |
677 | #define UICLASS_HID 0x03 |
678 | #define UISUBCLASS_BOOT 1 |
679 | #define UIPROTO_BOOT_KEYBOARD 1 |
680 | #define UIPROTO_MOUSE 2 |
681 | |
682 | #define UICLASS_PHYSICAL 0x05 |
683 | |
684 | #define UICLASS_IMAGE 0x06 |
685 | |
686 | #define UICLASS_PRINTER 0x07 |
687 | #define UISUBCLASS_PRINTER 1 |
688 | #define UIPROTO_PRINTER_UNI 1 |
689 | #define UIPROTO_PRINTER_BI 2 |
690 | #define UIPROTO_PRINTER_1284 3 |
691 | |
692 | #define UICLASS_MASS 0x08 |
693 | #define UISUBCLASS_RBC 1 |
694 | #define UISUBCLASS_SFF8020I 2 |
695 | #define UISUBCLASS_QIC157 3 |
696 | #define UISUBCLASS_UFI 4 |
697 | #define UISUBCLASS_SFF8070I 5 |
698 | #define UISUBCLASS_SCSI 6 |
699 | #define UIPROTO_MASS_CBI_I 0 |
700 | #define UIPROTO_MASS_CBI 1 |
701 | #define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ |
702 | #define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ |
703 | #define UIPROTO_MASS_UAS 98 /* USB Attached SCSI */ |
704 | |
705 | #define UICLASS_HUB 0x09 |
706 | #define UISUBCLASS_HUB 0 |
707 | #define UIPROTO_FSHUB 0 |
708 | #define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ |
709 | #define UIPROTO_HSHUBMTT 1 |
710 | |
711 | #define UICLASS_CDC_DATA 0x0a |
712 | #define UISUBCLASS_DATA 0 |
713 | #define UIPROTO_DATA_MBIM 0x02 /* MBIM */ |
714 | #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ |
715 | #define UIPROTO_DATA_HDLC 0x31 /* HDLC */ |
716 | #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ |
717 | #define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ |
718 | #define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ |
719 | #define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ |
720 | #define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ |
721 | #define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ |
722 | #define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ |
723 | #define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ |
724 | #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ |
725 | #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc.*/ |
726 | #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ |
727 | |
728 | #define UICLASS_SMARTCARD 0x0b |
729 | |
730 | /*#define UICLASS_FIRM_UPD 0x0c*/ |
731 | |
732 | #define UICLASS_SECURITY 0x0d |
733 | |
734 | #define UICLASS_DIAGNOSTIC 0xdc |
735 | |
736 | #define UICLASS_WIRELESS 0xe0 |
737 | #define UISUBCLASS_RF 0x01 |
738 | #define UIPROTO_BLUETOOTH 0x01 |
739 | #define UIPROTO_RNDIS 0x03 |
740 | |
741 | #define UICLASS_APPL_SPEC 0xfe |
742 | #define UISUBCLASS_FIRMWARE_DOWNLOAD 1 |
743 | #define UISUBCLASS_IRDA 2 |
744 | #define UIPROTO_IRDA 0 |
745 | |
746 | #define UICLASS_VENDOR 0xff |
747 | |
748 | |
749 | #define USB_HUB_MAX_DEPTH 5 |
750 | |
751 | /* |
752 | * Minimum time a device needs to be powered down to go through |
753 | * a power cycle. XXX Are these time in the spec? |
754 | */ |
755 | #define USB_POWER_DOWN_TIME 200 /* ms */ |
756 | #define USB_PORT_POWER_DOWN_TIME 100 /* ms */ |
757 | |
758 | #if 0 |
759 | /* These are the values from the spec. */ |
760 | #define USB_PORT_RESET_DELAY 10 /* ms */ |
761 | #define USB_PORT_ROOT_RESET_DELAY 50 /* ms */ |
762 | #define USB_PORT_RESET_RECOVERY 10 /* ms */ |
763 | #define USB_PORT_POWERUP_DELAY 100 /* ms */ |
764 | #define USB_SET_ADDRESS_SETTLE 2 /* ms */ |
765 | #define USB_RESUME_DELAY (20*5) /* ms */ |
766 | #define USB_RESUME_WAIT 10 /* ms */ |
767 | #define USB_RESUME_RECOVERY 10 /* ms */ |
768 | #define USB_EXTRA_POWER_UP_TIME 0 /* ms */ |
769 | #else |
770 | /* Allow for marginal (i.e. non-conforming) devices. */ |
771 | #define USB_PORT_RESET_DELAY 50 /* ms */ |
772 | #define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ |
773 | #define USB_PORT_RESET_RECOVERY 250 /* ms */ |
774 | #define USB_PORT_POWERUP_DELAY 300 /* ms */ |
775 | #define USB_SET_ADDRESS_SETTLE 10 /* ms */ |
776 | #define USB_RESUME_DELAY (50*5) /* ms */ |
777 | #define USB_RESUME_WAIT 50 /* ms */ |
778 | #define USB_RESUME_RECOVERY 50 /* ms */ |
779 | #define 20 /* ms */ |
780 | #endif |
781 | |
782 | #define USB_MIN_POWER 100 /* mA */ |
783 | #define USB_MIN_POWER_SS 150 /* mA */ |
784 | #define USB_MAX_POWER 500 /* mA */ |
785 | #define USB_MAX_POWER_SS 900 /* mA */ |
786 | |
787 | #define USB_BUS_RESET_DELAY 100 /* ms XXX?*/ |
788 | |
789 | |
790 | #define USB_UNCONFIG_NO 0 |
791 | #define USB_UNCONFIG_INDEX (-1) |
792 | |
793 | |
794 | /* Packet IDs */ |
795 | #define UPID_RESERVED 0xf0 |
796 | #define UPID_OUT 0xe1 |
797 | #define UPID_ACK 0xd2 |
798 | #define UPID_DATA0 0xc3 |
799 | #define UPID_PING 0xb4 |
800 | #define UPID_SOF 0xa5 |
801 | #define UPID_NYET 0x96 |
802 | #define UPID_DATA2 0x87 |
803 | #define UPID_SPLIT 0x78 |
804 | #define UPID_IN 0x69 |
805 | #define UPID_NAK 0x5a |
806 | #define UPID_DATA1 0x4b |
807 | #define UPID_ERR 0x3c |
808 | #define UPID_PREAMBLE 0x3c |
809 | #define UPID_SETUP 0x2d |
810 | #define UPID_STALL 0x1e |
811 | #define UPID_MDATA 0x0f |
812 | |
813 | |
814 | /*** ioctl() related stuff ***/ |
815 | |
816 | struct usb_ctl_request { |
817 | int ucr_addr; |
818 | usb_device_request_t ucr_request; |
819 | void *ucr_data; |
820 | int ucr_flags; |
821 | #define USBD_SHORT_XFER_OK 0x04 /* allow short reads */ |
822 | int ucr_actlen; /* actual length transferred */ |
823 | }; |
824 | |
825 | struct usb_alt_interface { |
826 | int uai_config_index; |
827 | int uai_interface_index; |
828 | int uai_alt_no; |
829 | }; |
830 | |
831 | #define USB_CURRENT_CONFIG_INDEX (-1) |
832 | #define USB_CURRENT_ALT_INDEX (-1) |
833 | |
834 | struct usb_config_desc { |
835 | int ucd_config_index; |
836 | usb_config_descriptor_t ucd_desc; |
837 | }; |
838 | |
839 | struct usb_interface_desc { |
840 | int uid_config_index; |
841 | int uid_interface_index; |
842 | int uid_alt_index; |
843 | usb_interface_descriptor_t uid_desc; |
844 | }; |
845 | |
846 | struct usb_endpoint_desc { |
847 | int ued_config_index; |
848 | int ued_interface_index; |
849 | int ued_alt_index; |
850 | int ued_endpoint_index; |
851 | usb_endpoint_descriptor_t ued_desc; |
852 | }; |
853 | |
854 | struct usb_full_desc { |
855 | int ufd_config_index; |
856 | u_int ufd_size; |
857 | u_char *ufd_data; |
858 | }; |
859 | |
860 | struct usb_string_desc { |
861 | int usd_string_index; |
862 | int usd_language_id; |
863 | usb_string_descriptor_t usd_desc; |
864 | }; |
865 | |
866 | struct usb_ctl_report_desc { |
867 | int ucrd_size; |
868 | u_char ucrd_data[1024]; /* filled data size will vary */ |
869 | }; |
870 | |
871 | typedef struct { uint32_t cookie; } usb_event_cookie_t; |
872 | |
873 | #define USB_MAX_DEVNAMES 4 |
874 | #define USB_MAX_DEVNAMELEN 16 |
875 | struct usb_device_info { |
876 | uint8_t udi_bus; |
877 | uint8_t udi_addr; /* device address */ |
878 | usb_event_cookie_t udi_cookie; |
879 | char udi_product[USB_MAX_ENCODED_STRING_LEN]; |
880 | char udi_vendor[USB_MAX_ENCODED_STRING_LEN]; |
881 | char udi_release[8]; |
882 | char udi_serial[USB_MAX_ENCODED_STRING_LEN]; |
883 | uint16_t udi_productNo; |
884 | uint16_t udi_vendorNo; |
885 | uint16_t udi_releaseNo; |
886 | uint8_t udi_class; |
887 | uint8_t udi_subclass; |
888 | uint8_t udi_protocol; |
889 | uint8_t udi_config; |
890 | uint8_t udi_speed; |
891 | #define USB_SPEED_LOW 1 |
892 | #define USB_SPEED_FULL 2 |
893 | #define USB_SPEED_HIGH 3 |
894 | #define USB_SPEED_SUPER 4 |
895 | #define USB_SPEED_SUPER_PLUS 5 |
896 | #define USB_IS_SS(X) ((X) == USB_SPEED_SUPER || (X) == USB_SPEED_SUPER_PLUS) |
897 | int udi_power; /* power consumption in mA, 0 if selfpowered */ |
898 | int udi_nports; |
899 | char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; |
900 | uint8_t udi_ports[16];/* hub only: addresses of devices on ports */ |
901 | #define USB_PORT_ENABLED 0xff |
902 | #define USB_PORT_SUSPENDED 0xfe |
903 | #define USB_PORT_POWERED 0xfd |
904 | #define USB_PORT_DISABLED 0xfc |
905 | }; |
906 | |
907 | /* <=3.0 had this layout of the structure */ |
908 | struct usb_device_info_old { |
909 | uint8_t udi_bus; |
910 | uint8_t udi_addr; /* device address */ |
911 | usb_event_cookie_t udi_cookie; |
912 | char udi_product[USB_MAX_STRING_LEN]; |
913 | char udi_vendor[USB_MAX_STRING_LEN]; |
914 | char udi_release[8]; |
915 | uint16_t udi_productNo; |
916 | uint16_t udi_vendorNo; |
917 | uint16_t udi_releaseNo; |
918 | uint8_t udi_class; |
919 | uint8_t udi_subclass; |
920 | uint8_t udi_protocol; |
921 | uint8_t udi_config; |
922 | uint8_t udi_speed; |
923 | int udi_power; /* power consumption in mA, 0 if selfpowered */ |
924 | int udi_nports; |
925 | char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; |
926 | uint8_t udi_ports[16];/* hub only: addresses of devices on ports */ |
927 | }; |
928 | |
929 | struct usb_ctl_report { |
930 | int ucr_report; |
931 | u_char ucr_data[1024]; /* filled data size will vary */ |
932 | }; |
933 | |
934 | struct usb_device_stats { |
935 | u_long uds_requests[4]; /* indexed by transfer type UE_* */ |
936 | }; |
937 | |
938 | struct usb_bulk_ra_wb_opt { |
939 | u_int ra_wb_buffer_size; |
940 | u_int ra_wb_request_size; |
941 | }; |
942 | |
943 | /* Events that can be read from /dev/usb */ |
944 | struct usb_event { |
945 | int ue_type; |
946 | #define USB_EVENT_CTRLR_ATTACH 1 |
947 | #define USB_EVENT_CTRLR_DETACH 2 |
948 | #define USB_EVENT_DEVICE_ATTACH 3 |
949 | #define USB_EVENT_DEVICE_DETACH 4 |
950 | #define USB_EVENT_DRIVER_ATTACH 5 |
951 | #define USB_EVENT_DRIVER_DETACH 6 |
952 | #define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH) |
953 | #define USB_EVENT_IS_DETACH(n) ((n) == USB_EVENT_CTRLR_DETACH || (n) == USB_EVENT_DEVICE_DETACH || (n) == USB_EVENT_DRIVER_DETACH) |
954 | struct timespec ue_time; |
955 | union { |
956 | struct { |
957 | int ue_bus; |
958 | } ue_ctrlr; |
959 | struct usb_device_info ue_device; |
960 | struct { |
961 | usb_event_cookie_t ue_cookie; |
962 | char ue_devname[16]; |
963 | } ue_driver; |
964 | } u; |
965 | }; |
966 | |
967 | /* old <=3.0 compat event */ |
968 | struct usb_event_old { |
969 | int ue_type; |
970 | struct timespec ue_time; |
971 | union { |
972 | struct { |
973 | int ue_bus; |
974 | } ue_ctrlr; |
975 | struct usb_device_info_old ue_device; |
976 | struct { |
977 | usb_event_cookie_t ue_cookie; |
978 | char ue_devname[16]; |
979 | } ue_driver; |
980 | } u; |
981 | }; |
982 | |
983 | |
984 | /* USB controller */ |
985 | #define USB_REQUEST _IOWR('U', 1, struct usb_ctl_request) |
986 | #define USB_SETDEBUG _IOW ('U', 2, int) |
987 | #define USB_DISCOVER _IO ('U', 3) |
988 | #define USB_DEVICEINFO _IOWR('U', 4, struct usb_device_info) |
989 | #define USB_DEVICEINFO_OLD _IOWR('U', 4, struct usb_device_info_old) |
990 | #define USB_DEVICESTATS _IOR ('U', 5, struct usb_device_stats) |
991 | |
992 | /* Generic HID device */ |
993 | #define USB_GET_REPORT_DESC _IOR ('U', 21, struct usb_ctl_report_desc) |
994 | #define USB_SET_IMMED _IOW ('U', 22, int) |
995 | #define USB_GET_REPORT _IOWR('U', 23, struct usb_ctl_report) |
996 | #define USB_SET_REPORT _IOW ('U', 24, struct usb_ctl_report) |
997 | #define USB_GET_REPORT_ID _IOR ('U', 25, int) |
998 | |
999 | /* Generic USB device */ |
1000 | #define USB_GET_CONFIG _IOR ('U', 100, int) |
1001 | #define USB_SET_CONFIG _IOW ('U', 101, int) |
1002 | #define USB_GET_ALTINTERFACE _IOWR('U', 102, struct usb_alt_interface) |
1003 | #define USB_SET_ALTINTERFACE _IOWR('U', 103, struct usb_alt_interface) |
1004 | #define USB_GET_NO_ALT _IOWR('U', 104, struct usb_alt_interface) |
1005 | #define USB_GET_DEVICE_DESC _IOR ('U', 105, usb_device_descriptor_t) |
1006 | #define USB_GET_CONFIG_DESC _IOWR('U', 106, struct usb_config_desc) |
1007 | #define USB_GET_INTERFACE_DESC _IOWR('U', 107, struct usb_interface_desc) |
1008 | #define USB_GET_ENDPOINT_DESC _IOWR('U', 108, struct usb_endpoint_desc) |
1009 | #define USB_GET_FULL_DESC _IOWR('U', 109, struct usb_full_desc) |
1010 | #define USB_GET_STRING_DESC _IOWR('U', 110, struct usb_string_desc) |
1011 | #define USB_DO_REQUEST _IOWR('U', 111, struct usb_ctl_request) |
1012 | #define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info) |
1013 | #define USB_GET_DEVICEINFO_OLD _IOR ('U', 112, struct usb_device_info_old) |
1014 | #define USB_SET_SHORT_XFER _IOW ('U', 113, int) |
1015 | #define USB_SET_TIMEOUT _IOW ('U', 114, int) |
1016 | #define USB_SET_BULK_RA _IOW ('U', 115, int) |
1017 | #define USB_SET_BULK_WB _IOW ('U', 116, int) |
1018 | #define USB_SET_BULK_RA_OPT _IOW ('U', 117, struct usb_bulk_ra_wb_opt) |
1019 | #define USB_SET_BULK_WB_OPT _IOW ('U', 118, struct usb_bulk_ra_wb_opt) |
1020 | |
1021 | /* Modem device */ |
1022 | #define USB_GET_CM_OVER_DATA _IOR ('U', 130, int) |
1023 | #define USB_SET_CM_OVER_DATA _IOW ('U', 131, int) |
1024 | |
1025 | #endif /* _USB_H_ */ |
1026 | |