1 /* $NetBSD: usb.h,v 1.63 2002/02/25 00:46:37 augustss Exp $ */ 2 /* $FreeBSD$ */ 3 4 /* 5 * Copyright (c) 1998 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Lennart Augustsson (lennart@augustsson.net) at 10 * Carlstedt Research & Technology. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * This product includes software developed by the NetBSD 23 * Foundation, Inc. and its contributors. 24 * 4. Neither the name of The NetBSD Foundation nor the names of its 25 * contributors may be used to endorse or promote products derived 26 * from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 31 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 32 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 */ 40 41 42 #ifndef _USB_H_ 43 #define _USB_H_ 44 45 #include <sys/types.h> 46 #include <sys/time.h> 47 48 #if defined(__NetBSD__) || defined(__OpenBSD__) 49 #include <sys/ioctl.h> 50 #endif 51 52 #if defined(_KERNEL) 53 #include <dev/usb/usb_port.h> 54 #endif /* _KERNEL */ 55 56 /* These two defines are used by usbd to autoload the usb kld */ 57 #define USB_KLD "usb" /* name of usb module */ 58 #define USB_UHUB "usb/uhub" /* root hub */ 59 60 #define USB_STACK_VERSION 2 61 62 #define USB_MAX_DEVICES 128 63 #define USB_START_ADDR 0 64 65 #define USB_CONTROL_ENDPOINT 0 66 #define USB_MAX_ENDPOINTS 16 67 68 #define USB_FRAMES_PER_SECOND 1000 69 70 /* 71 * The USB records contain some unaligned little-endian word 72 * components. The U[SG]ETW macros take care of both the alignment 73 * and endian problem and should always be used to access non-byte 74 * values. 75 */ 76 typedef u_int8_t uByte; 77 typedef u_int8_t uWord[2]; 78 typedef u_int8_t uDWord[4]; 79 80 #define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) 81 82 #if 1 83 #define UGETW(w) ((w)[0] | ((w)[1] << 8)) 84 #define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8)) 85 #define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) 86 #define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \ 87 (w)[1] = (u_int8_t)((v) >> 8), \ 88 (w)[2] = (u_int8_t)((v) >> 16), \ 89 (w)[3] = (u_int8_t)((v) >> 24)) 90 #else 91 /* 92 * On little-endian machines that can handle unanliged accesses 93 * (e.g. i386) these macros can be replaced by the following. 94 */ 95 #define UGETW(w) (*(u_int16_t *)(w)) 96 #define USETW(w,v) (*(u_int16_t *)(w) = (v)) 97 #define UGETDW(w) (*(u_int32_t *)(w)) 98 #define USETDW(w,v) (*(u_int32_t *)(w) = (v)) 99 #endif 100 101 #define UPACKED __attribute__((__packed__)) 102 103 typedef struct { 104 uByte bmRequestType; 105 uByte bRequest; 106 uWord wValue; 107 uWord wIndex; 108 uWord wLength; 109 } UPACKED usb_device_request_t; 110 111 #define UT_WRITE 0x00 112 #define UT_READ 0x80 113 #define UT_STANDARD 0x00 114 #define UT_CLASS 0x20 115 #define UT_VENDOR 0x40 116 #define UT_DEVICE 0x00 117 #define UT_INTERFACE 0x01 118 #define UT_ENDPOINT 0x02 119 #define UT_OTHER 0x03 120 121 #define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) 122 #define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) 123 #define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) 124 #define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) 125 #define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) 126 #define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) 127 #define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) 128 #define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) 129 #define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) 130 #define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) 131 #define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) 132 #define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) 133 #define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) 134 #define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) 135 #define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) 136 #define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) 137 #define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) 138 #define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) 139 #define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) 140 #define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) 141 #define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) 142 #define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) 143 144 /* Requests */ 145 #define UR_GET_STATUS 0x00 146 #define UR_CLEAR_FEATURE 0x01 147 #define UR_SET_FEATURE 0x03 148 #define UR_SET_ADDRESS 0x05 149 #define UR_GET_DESCRIPTOR 0x06 150 #define UDESC_DEVICE 0x01 151 #define UDESC_CONFIG 0x02 152 #define UDESC_STRING 0x03 153 #define UDESC_INTERFACE 0x04 154 #define UDESC_ENDPOINT 0x05 155 #define UDESC_DEVICE_QUALIFIER 0x06 156 #define UDESC_OTHER_SPEED_CONFIGURATION 0x07 157 #define UDESC_INTERFACE_POWER 0x08 158 #define UDESC_OTG 0x09 159 #define UDESC_CS_DEVICE 0x21 /* class specific */ 160 #define UDESC_CS_CONFIG 0x22 161 #define UDESC_CS_STRING 0x23 162 #define UDESC_CS_INTERFACE 0x24 163 #define UDESC_CS_ENDPOINT 0x25 164 #define UDESC_HUB 0x29 165 #define UR_SET_DESCRIPTOR 0x07 166 #define UR_GET_CONFIG 0x08 167 #define UR_SET_CONFIG 0x09 168 #define UR_GET_INTERFACE 0x0a 169 #define UR_SET_INTERFACE 0x0b 170 #define UR_SYNCH_FRAME 0x0c 171 172 /* Feature numbers */ 173 #define UF_ENDPOINT_HALT 0 174 #define UF_DEVICE_REMOTE_WAKEUP 1 175 #define UF_TEST_MODE 2 176 177 #define USB_MAX_IPACKET 8 /* maximum size of the initial packet */ 178 179 #define USB_2_MAX_CTRL_PACKET 64 180 #define USB_2_MAX_BULK_PACKET 512 181 182 typedef struct { 183 uByte bLength; 184 uByte bDescriptorType; 185 uByte bDescriptorSubtype; 186 } UPACKED usb_descriptor_t; 187 188 typedef struct { 189 uByte bLength; 190 uByte bDescriptorType; 191 uWord bcdUSB; 192 #define UD_USB_2_0 0x0200 193 #define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0) 194 uByte bDeviceClass; 195 uByte bDeviceSubClass; 196 uByte bDeviceProtocol; 197 uByte bMaxPacketSize; 198 /* The fields below are not part of the initial descriptor. */ 199 uWord idVendor; 200 uWord idProduct; 201 uWord bcdDevice; 202 uByte iManufacturer; 203 uByte iProduct; 204 uByte iSerialNumber; 205 uByte bNumConfigurations; 206 } UPACKED usb_device_descriptor_t; 207 #define USB_DEVICE_DESCRIPTOR_SIZE 18 208 209 typedef struct { 210 uByte bLength; 211 uByte bDescriptorType; 212 uWord wTotalLength; 213 uByte bNumInterface; 214 uByte bConfigurationValue; 215 uByte iConfiguration; 216 uByte bmAttributes; 217 #define UC_BUS_POWERED 0x80 218 #define UC_SELF_POWERED 0x40 219 #define UC_REMOTE_WAKEUP 0x20 220 uByte bMaxPower; /* max current in 2 mA units */ 221 #define UC_POWER_FACTOR 2 222 } UPACKED usb_config_descriptor_t; 223 #define USB_CONFIG_DESCRIPTOR_SIZE 9 224 225 typedef struct { 226 uByte bLength; 227 uByte bDescriptorType; 228 uByte bInterfaceNumber; 229 uByte bAlternateSetting; 230 uByte bNumEndpoints; 231 uByte bInterfaceClass; 232 uByte bInterfaceSubClass; 233 uByte bInterfaceProtocol; 234 uByte iInterface; 235 } UPACKED usb_interface_descriptor_t; 236 #define USB_INTERFACE_DESCRIPTOR_SIZE 9 237 238 typedef struct { 239 uByte bLength; 240 uByte bDescriptorType; 241 uByte bEndpointAddress; 242 #define UE_GET_DIR(a) ((a) & 0x80) 243 #define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) 244 #define UE_DIR_IN 0x80 245 #define UE_DIR_OUT 0x00 246 #define UE_ADDR 0x0f 247 #define UE_GET_ADDR(a) ((a) & UE_ADDR) 248 uByte bmAttributes; 249 #define UE_XFERTYPE 0x03 250 #define UE_CONTROL 0x00 251 #define UE_ISOCHRONOUS 0x01 252 #define UE_BULK 0x02 253 #define UE_INTERRUPT 0x03 254 #define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) 255 #define UE_ISO_TYPE 0x0c 256 #define UE_ISO_ASYNC 0x04 257 #define UE_ISO_ADAPT 0x08 258 #define UE_ISO_SYNC 0x0c 259 #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) 260 uWord wMaxPacketSize; 261 uByte bInterval; 262 } UPACKED usb_endpoint_descriptor_t; 263 #define USB_ENDPOINT_DESCRIPTOR_SIZE 7 264 265 typedef struct { 266 uByte bLength; 267 uByte bDescriptorType; 268 uWord bString[127]; 269 } UPACKED usb_string_descriptor_t; 270 #define USB_MAX_STRING_LEN 128 271 #define USB_LANGUAGE_TABLE 0 /* # of the string language id table */ 272 273 /* Hub specific request */ 274 #define UR_GET_BUS_STATE 0x02 275 #define UR_CLEAR_TT_BUFFER 0x08 276 #define UR_RESET_TT 0x09 277 #define UR_GET_TT_STATE 0x0a 278 #define UR_STOP_TT 0x0b 279 280 /* Hub features */ 281 #define UHF_C_HUB_LOCAL_POWER 0 282 #define UHF_C_HUB_OVER_CURRENT 1 283 #define UHF_PORT_CONNECTION 0 284 #define UHF_PORT_ENABLE 1 285 #define UHF_PORT_SUSPEND 2 286 #define UHF_PORT_OVER_CURRENT 3 287 #define UHF_PORT_RESET 4 288 #define UHF_PORT_POWER 8 289 #define UHF_PORT_LOW_SPEED 9 290 #define UHF_C_PORT_CONNECTION 16 291 #define UHF_C_PORT_ENABLE 17 292 #define UHF_C_PORT_SUSPEND 18 293 #define UHF_C_PORT_OVER_CURRENT 19 294 #define UHF_C_PORT_RESET 20 295 #define UHF_PORT_TEST 21 296 #define UHF_PORT_INDICATOR 22 297 298 typedef struct { 299 uByte bDescLength; 300 uByte bDescriptorType; 301 uByte bNbrPorts; 302 uWord wHubCharacteristics; 303 #define UHD_PWR 0x0003 304 #define UHD_PWR_GANGED 0x0000 305 #define UHD_PWR_INDIVIDUAL 0x0001 306 #define UHD_PWR_NO_SWITCH 0x0002 307 #define UHD_COMPOUND 0x0004 308 #define UHD_OC 0x0018 309 #define UHD_OC_GLOBAL 0x0000 310 #define UHD_OC_INDIVIDUAL 0x0008 311 #define UHD_OC_NONE 0x0010 312 #define UHD_TT_THINK 0x0060 313 #define UHD_TT_THINK_8 0x0000 314 #define UHD_TT_THINK_16 0x0020 315 #define UHD_TT_THINK_24 0x0040 316 #define UHD_TT_THINK_32 0x0060 317 #define UHD_PORT_IND 0x0080 318 uByte bPwrOn2PwrGood; /* delay in 2 ms units */ 319 #define UHD_PWRON_FACTOR 2 320 uByte bHubContrCurrent; 321 uByte DeviceRemovable[32]; /* max 255 ports */ 322 #define UHD_NOT_REMOV(desc, i) \ 323 (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) 324 /* deprecated */ uByte PortPowerCtrlMask[1]; 325 } UPACKED usb_hub_descriptor_t; 326 #define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */ 327 328 typedef struct { 329 uByte bLength; 330 uByte bDescriptorType; 331 uWord bcdUSB; 332 uByte bDeviceClass; 333 uByte bDeviceSubClass; 334 uByte bDeviceProtocol; 335 uByte bMaxPacketSize0; 336 uByte bNumConfigurations; 337 uByte bReserved; 338 } UPACKED usb_device_qualifier_t; 339 #define USB_DEVICE_QUALIFIER_SIZE 10 340 341 typedef struct { 342 uByte bLength; 343 uByte bDescriptorType; 344 uByte bmAttributes; 345 #define UOTG_SRP 0x01 346 #define UOTG_HNP 0x02 347 } UPACKED usb_otg_descriptor_t; 348 349 /* OTG feature selectors */ 350 #define UOTG_B_HNP_ENABLE 3 351 #define UOTG_A_HNP_SUPPORT 4 352 #define UOTG_A_ALT_HNP_SUPPORT 5 353 354 typedef struct { 355 uWord wStatus; 356 /* Device status flags */ 357 #define UDS_SELF_POWERED 0x0001 358 #define UDS_REMOTE_WAKEUP 0x0002 359 /* Endpoint status flags */ 360 #define UES_HALT 0x0001 361 } UPACKED usb_status_t; 362 363 typedef struct { 364 uWord wHubStatus; 365 #define UHS_LOCAL_POWER 0x0001 366 #define UHS_OVER_CURRENT 0x0002 367 uWord wHubChange; 368 } UPACKED usb_hub_status_t; 369 370 typedef struct { 371 uWord wPortStatus; 372 #define UPS_CURRENT_CONNECT_STATUS 0x0001 373 #define UPS_PORT_ENABLED 0x0002 374 #define UPS_SUSPEND 0x0004 375 #define UPS_OVERCURRENT_INDICATOR 0x0008 376 #define UPS_RESET 0x0010 377 #define UPS_PORT_POWER 0x0100 378 #define UPS_LOW_SPEED 0x0200 379 #define UPS_HIGH_SPEED 0x0400 380 #define UPS_PORT_TEST 0x0800 381 #define UPS_PORT_INDICATOR 0x1000 382 uWord wPortChange; 383 #define UPS_C_CONNECT_STATUS 0x0001 384 #define UPS_C_PORT_ENABLED 0x0002 385 #define UPS_C_SUSPEND 0x0004 386 #define UPS_C_OVERCURRENT_INDICATOR 0x0008 387 #define UPS_C_PORT_RESET 0x0010 388 } UPACKED usb_port_status_t; 389 390 /* Device class codes */ 391 #define UDCLASS_AUDIO 0x00 392 #define UDCLASS_COMM 0x02 393 #define UDCLASS_HID 0x00 394 #define UDCLASS_HUB 0x09 395 #define UDSUBCLASS_HUB 0 396 #define UDPROTO_FSHUB 0 397 #define UDPROTO_HSHUBSTT 1 398 #define UDPROTO_HSHUBMTT 2 399 #define UDCLASS_MASS 0x00 400 401 /* Interface class codes */ 402 #define UICLASS_UNSPEC 0x00 403 404 #define UICLASS_AUDIO 0x01 405 #define UISUBCLASS_AUDIOCONTROL 1 406 #define UISUBCLASS_AUDIOSTREAM 2 407 #define UISUBCLASS_MIDISTREAM 3 408 409 #define UICLASS_CDC 0x02 /* communication */ 410 #define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 411 #define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 412 #define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 413 #define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 414 #define UISUBCLASS_CAPI_CONTROLMODEL 5 415 #define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 416 #define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 417 #define UIPROTO_CDC_AT 1 418 419 #define UICLASS_HID 0x03 420 #define UISUBCLASS_BOOT 1 421 #define UIPROTO_BOOT_KEYBOARD 1 422 423 #define UICLASS_PHYSICAL 0x05 424 425 #define UICLASS_PRINTER 0x07 426 #define UISUBCLASS_PRINTER 1 427 #define UIPROTO_PRINTER_UNI 1 428 #define UIPROTO_PRINTER_BI 2 429 #define UIPROTO_PRINTER_1284 3 430 431 #define UICLASS_MASS 0x08 432 #define UISUBCLASS_RBC 1 433 #define UISUBCLASS_SFF8020I 2 434 #define UISUBCLASS_QIC157 3 435 #define UISUBCLASS_UFI 4 436 #define UISUBCLASS_SFF8070I 5 437 #define UISUBCLASS_SCSI 6 438 #define UIPROTO_MASS_CBI_I 0 439 #define UIPROTO_MASS_CBI 1 440 #define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ 441 #define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ 442 443 #define UICLASS_HUB 0x09 444 #define UISUBCLASS_HUB 0 445 #define UIPROTO_FSHUB 0 446 #define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ 447 #define UIPROTO_HSHUBMTT 1 448 449 #define UICLASS_CDC_DATA 0x0a 450 #define UISUBCLASS_DATA 0 451 #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ 452 #define UIPROTO_DATA_HDLC 0x31 /* HDLC */ 453 #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ 454 #define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ 455 #define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ 456 #define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ 457 #define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ 458 #define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ 459 #define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ 460 #define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ 461 #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ 462 #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc.*/ 463 #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ 464 465 #define UICLASS_FIRM_UPD 0x0c 466 467 #define UICLASS_APPL_SPEC 0xfe 468 #define UISUBCLASS_FIRMWARE_DOWNLOAD 1 469 #define UISUBCLASS_IRDA 2 470 #define UIPROTO_IRDA 0 471 472 #define UICLASS_VENDOR 0xff 473 474 475 #define USB_HUB_MAX_DEPTH 5 476 477 /* 478 * Minimum time a device needs to be powered down to go through 479 * a power cycle. XXX Are these time in the spec? 480 */ 481 #define USB_POWER_DOWN_TIME 200 /* ms */ 482 #define USB_PORT_POWER_DOWN_TIME 100 /* ms */ 483 484 #if 0 485 /* These are the values from the spec. */ 486 #define USB_PORT_RESET_DELAY 10 /* ms */ 487 #define USB_PORT_ROOT_RESET_DELAY 50 /* ms */ 488 #define USB_PORT_RESET_SETTLE 10 /* ms */ 489 #define USB_PORT_POWERUP_DELAY 100 /* ms */ 490 #define USB_SET_ADDRESS_SETTLE 2 /* ms */ 491 #define USB_RESUME_DELAY (20*5) /* ms */ 492 #define USB_RESUME_WAIT 10 /* ms */ 493 #define USB_RESUME_RECOVERY 10 /* ms */ 494 #define USB_EXTRA_POWER_UP_TIME 0 /* ms */ 495 #else 496 /* Allow for marginal (i.e. non-conforming) devices. */ 497 #define USB_PORT_RESET_DELAY 50 /* ms */ 498 #define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ 499 #define USB_PORT_RESET_RECOVERY 50 /* ms */ 500 #define USB_PORT_POWERUP_DELAY 300 /* ms */ 501 #define USB_SET_ADDRESS_SETTLE 10 /* ms */ 502 #define USB_RESUME_DELAY (50*5) /* ms */ 503 #define USB_RESUME_WAIT 50 /* ms */ 504 #define USB_RESUME_RECOVERY 50 /* ms */ 505 #define USB_EXTRA_POWER_UP_TIME 20 /* ms */ 506 #endif 507 508 #define USB_MIN_POWER 100 /* mA */ 509 #define USB_MAX_POWER 500 /* mA */ 510 511 #define USB_BUS_RESET_DELAY 100 /* ms XXX?*/ 512 513 514 #define USB_UNCONFIG_NO 0 515 #define USB_UNCONFIG_INDEX (-1) 516 517 /*** ioctl() related stuff ***/ 518 519 struct usb_ctl_request { 520 int ucr_addr; 521 usb_device_request_t ucr_request; 522 void *ucr_data; 523 int ucr_flags; 524 #define USBD_SHORT_XFER_OK 0x04 /* allow short reads */ 525 int ucr_actlen; /* actual length transferred */ 526 }; 527 528 struct usb_alt_interface { 529 int uai_config_index; 530 int uai_interface_index; 531 int uai_alt_no; 532 }; 533 534 #define USB_CURRENT_CONFIG_INDEX (-1) 535 #define USB_CURRENT_ALT_INDEX (-1) 536 537 struct usb_config_desc { 538 int ucd_config_index; 539 usb_config_descriptor_t ucd_desc; 540 }; 541 542 struct usb_interface_desc { 543 int uid_config_index; 544 int uid_interface_index; 545 int uid_alt_index; 546 usb_interface_descriptor_t uid_desc; 547 }; 548 549 struct usb_endpoint_desc { 550 int ued_config_index; 551 int ued_interface_index; 552 int ued_alt_index; 553 int ued_endpoint_index; 554 usb_endpoint_descriptor_t ued_desc; 555 }; 556 557 struct usb_full_desc { 558 int ufd_config_index; 559 u_int ufd_size; 560 u_char *ufd_data; 561 }; 562 563 struct usb_string_desc { 564 int usd_string_index; 565 int usd_language_id; 566 usb_string_descriptor_t usd_desc; 567 }; 568 569 struct usb_ctl_report_desc { 570 int ucrd_size; 571 u_char ucrd_data[1024]; /* filled data size will vary */ 572 }; 573 574 typedef struct { u_int32_t cookie; } usb_event_cookie_t; 575 576 #define USB_MAX_DEVNAMES 4 577 #define USB_MAX_DEVNAMELEN 16 578 struct usb_device_info { 579 u_int8_t udi_bus; 580 u_int8_t udi_addr; /* device address */ 581 usb_event_cookie_t udi_cookie; 582 char udi_product[USB_MAX_STRING_LEN]; 583 char udi_vendor[USB_MAX_STRING_LEN]; 584 char udi_release[8]; 585 u_int16_t udi_productNo; 586 u_int16_t udi_vendorNo; 587 u_int16_t udi_releaseNo; 588 u_int8_t udi_class; 589 u_int8_t udi_subclass; 590 u_int8_t udi_protocol; 591 u_int8_t udi_config; 592 u_int8_t udi_speed; 593 #define USB_SPEED_LOW 1 594 #define USB_SPEED_FULL 2 595 #define USB_SPEED_HIGH 3 596 int udi_power; /* power consumption in mA, 0 if selfpowered */ 597 int udi_nports; 598 char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; 599 u_int8_t udi_ports[16];/* hub only: addresses of devices on ports */ 600 #define USB_PORT_ENABLED 0xff 601 #define USB_PORT_SUSPENDED 0xfe 602 #define USB_PORT_POWERED 0xfd 603 #define USB_PORT_DISABLED 0xfc 604 }; 605 606 struct usb_ctl_report { 607 int ucr_report; 608 u_char ucr_data[1024]; /* filled data size will vary */ 609 }; 610 611 struct usb_device_stats { 612 u_long uds_requests[4]; /* indexed by transfer type UE_* */ 613 }; 614 615 /* Events that can be read from /dev/usb */ 616 struct usb_event { 617 int ue_type; 618 #define USB_EVENT_CTRLR_ATTACH 1 619 #define USB_EVENT_CTRLR_DETACH 2 620 #define USB_EVENT_DEVICE_ATTACH 3 621 #define USB_EVENT_DEVICE_DETACH 4 622 #define USB_EVENT_DRIVER_ATTACH 5 623 #define USB_EVENT_DRIVER_DETACH 6 624 #define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH) 625 #define USB_EVENT_IS_DETACH(n) ((n) == USB_EVENT_CTRLR_DETACH || (n) == USB_EVENT_DEVICE_DETACH || (n) == USB_EVENT_DRIVER_DETACH) 626 struct timespec ue_time; 627 union { 628 struct { 629 int ue_bus; 630 } ue_ctrlr; 631 struct usb_device_info ue_device; 632 struct { 633 usb_event_cookie_t ue_cookie; 634 char ue_devname[16]; 635 } ue_driver; 636 } u; 637 }; 638 639 /* USB controller */ 640 #define USB_REQUEST _IOWR('U', 1, struct usb_ctl_request) 641 #define USB_SETDEBUG _IOW ('U', 2, int) 642 #define USB_DISCOVER _IO ('U', 3) 643 #define USB_DEVICEINFO _IOWR('U', 4, struct usb_device_info) 644 #define USB_DEVICESTATS _IOR ('U', 5, struct usb_device_stats) 645 646 /* Generic HID device */ 647 #define USB_GET_REPORT_DESC _IOR ('U', 21, struct usb_ctl_report_desc) 648 #define USB_SET_IMMED _IOW ('U', 22, int) 649 #define USB_GET_REPORT _IOWR('U', 23, struct usb_ctl_report) 650 #define USB_SET_REPORT _IOW ('U', 24, struct usb_ctl_report) 651 #define USB_GET_REPORT_ID _IOR ('U', 25, int) 652 653 /* Generic USB device */ 654 #define USB_GET_CONFIG _IOR ('U', 100, int) 655 #define USB_SET_CONFIG _IOW ('U', 101, int) 656 #define USB_GET_ALTINTERFACE _IOWR('U', 102, struct usb_alt_interface) 657 #define USB_SET_ALTINTERFACE _IOWR('U', 103, struct usb_alt_interface) 658 #define USB_GET_NO_ALT _IOWR('U', 104, struct usb_alt_interface) 659 #define USB_GET_DEVICE_DESC _IOR ('U', 105, usb_device_descriptor_t) 660 #define USB_GET_CONFIG_DESC _IOWR('U', 106, struct usb_config_desc) 661 #define USB_GET_INTERFACE_DESC _IOWR('U', 107, struct usb_interface_desc) 662 #define USB_GET_ENDPOINT_DESC _IOWR('U', 108, struct usb_endpoint_desc) 663 #define USB_GET_FULL_DESC _IOWR('U', 109, struct usb_full_desc) 664 #define USB_GET_STRING_DESC _IOWR('U', 110, struct usb_string_desc) 665 #define USB_DO_REQUEST _IOWR('U', 111, struct usb_ctl_request) 666 #define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info) 667 #define USB_SET_SHORT_XFER _IOW ('U', 113, int) 668 #define USB_SET_TIMEOUT _IOW ('U', 114, int) 669 670 /* Modem device */ 671 #define USB_GET_CM_OVER_DATA _IOR ('U', 130, int) 672 #define USB_SET_CM_OVER_DATA _IOW ('U', 131, int) 673 674 #endif /* _USB_H_ */ 675