1 '\" te 2 .\" Copyright (c) 2007, Sun Microsystems, Inc. All Rights Reserved 3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. 4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License. 5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner] 6 .TH UGEN 7D "Sep 10, 2013" 7 .SH NAME 8 ugen \- USB generic driver 9 .SH SYNOPSIS 10 .LP 11 .nf 12 \fBNode Name@unit-address\fR 13 .fi 14 15 .LP 16 .nf 17 \fB#include <sys/usb/clients/ugen/usb_ugen.h>\fR 18 .fi 19 20 .SH DESCRIPTION 21 .sp 22 .LP 23 \fBugen\fR is a generic USBA (Solaris USB Architecture) compliant client 24 character driver that presents USB devices to applications through a standard 25 \fBopen\fR(2), \fBclose\fR(2), \fBread\fR(2), \fBwrite\fR(2), 26 \fBaioread\fR(3C), \fBaiowrite\fR(3C) Unix interface. Uninterpreted raw data 27 are transfered to and from the device via file descriptors created for each USB 28 endpoint. Status is obtained by reading file descriptors created for endpoint 29 and full device status. 30 .sp 31 .LP 32 \fBugen\fR supports control, bulk, isochronous and interrupt (in and out) 33 transfers. \fBlibusb\fR(3LIB) uses \fBugen\fR to access devices that do not 34 contain drivers (such as digital cameras and PDAs). Refer to 35 \fB/usr/sfw/share/doc/libusb/libusb.txt\fR for details. 36 .SH BINDING 37 .sp 38 .LP 39 In general, no explicit binding of the \fBugen\fR driver is necessary because 40 \fBusb_mid\fR(7D) is the default driver for devices without a class or vendor 41 unique driver. \fBusb_mid\fR(7D) creates the same logical device names as 42 \fBugen\fR, but only if no child interfaces are explicitly bound to \fBugen\fR. 43 If it is necessary to bind \fBugen\fR explicitly to a device or interface, the 44 following section explains the necessary steps. 45 .sp 46 .LP 47 \fBugen\fR can bind to a device with one or more interfaces in its entirety, or 48 to a single interface of that device. The binding type depends on information 49 that is passed to \fBadd_drv\fR(1M) or \fBupdate_drv\fR(1M). 50 .sp 51 .LP 52 An \fBadd_drv\fR(1M) command binds \fBugen\fR to a list of device types it is 53 to control. \fBupdate_drv\fR(1M) adds an additional device type to the list of 54 device types being managed by the driver. 55 .sp 56 .LP 57 Names used to bind drivers can be found in \fB/var/adm/messages\fR. When a 58 device is on-lined after hot insertion, and no driver is found, there will be 59 an entry containing: 60 .sp 61 .in +2 62 .nf 63 USB 2.0 device (usb<vid>,<pid>)... 64 .fi 65 .in -2 66 67 .sp 68 .LP 69 where vid is the USB vendor identifier in hex and pid is the product 70 identifier in hex supplied by the device descriptor \fBusb_dev_descr\fR(9S). 71 .sp 72 .LP 73 When using ugen for the first time, you must add the driver utilizing 74 \fBadd_drv\fR(1M), using a command of the following form: 75 .sp 76 .in +2 77 .nf 78 Assuming that the vid is 472 and pid is b0b0: 79 80 add_drv -n -m '* <device perms> <owner> <group>' 81 -i '"usb472,b0b0"' ugen 82 .fi 83 .in -2 84 85 .sp 86 .LP 87 If the command fails with: 88 .sp 89 .in +2 90 .nf 91 (ugen) already in use as a driver or alias. 92 .fi 93 .in -2 94 95 .sp 96 .LP 97 \&...add the device using \fBupdate_drv\fR(1M): 98 .sp 99 .in +2 100 .nf 101 update_drv -a -m '* <device perms> <owner> <group>' 102 -i '"usb472,b0b0"' ugen 103 .fi 104 .in -2 105 106 .sp 107 .LP 108 This binds \fBugen\fR to the entire device. 109 .sp 110 .LP 111 If ugen only binds to one interface of the device, use the following 112 driver_alias instead of usb<vid>,<pid>: 113 .sp 114 .in +2 115 .nf 116 usbif<vid>,<pid>.config<cfg value>.<interface number> 117 .fi 118 .in -2 119 120 .sp 121 .LP 122 where cfg value is the value of bConfigurationValue in the configuration 123 descriptor (\fBusb_cfg_descr\fR(9S)). For example "usbif1234,4567.config1.0." 124 .sp 125 .LP 126 Note that you can use update_drv to also remove bindings. Please see 127 \fBupdate_drv\fR(1M) for more information. 128 .sp 129 .LP 130 After a successful add_drv or update_drv, remove the device and reinsert. Check 131 with the \fBprtconf\fR(1M) -D option to determine if \fBugen\fR is successfully 132 bound to the device and the nodes created in /dev/usb/<vid>.<pid> (see below). 133 .sp 134 .LP 135 An example showing how to bind a child device representing interface 0 of 136 configuration 1 of a composite device follows: 137 .sp 138 .in +2 139 .nf 140 update_drv -a -m '* 0666 root sys' 141 -i '"usbif472,b0b0.config1.0"' ugen 142 .fi 143 .in -2 144 145 .sp 146 .LP 147 Note that you can completely uninstall the \fBugen\fR driver and delete it from 148 the system by doing: 149 .sp 150 .in +2 151 .nf 152 pkgrm SUNWugen 153 .fi 154 .in -2 155 156 .sp 157 .LP 158 Any \fBpkgadd\fR of SUNWugen after the \fBpkgrm\fR reactivates any pre-existing 159 ugen driver device-bindings. 160 .sp 161 .LP 162 Any pre-existing ugen driver device-bindings are preserved across operating 163 system upgrades. 164 .SH LOGICAL DEVICE NAME FORMAT 165 .sp 166 .LP 167 For each device or child device it manages, \fBugen\fR creates one logical 168 device name for device-wide status and one logical device name for endpoint 0. 169 \fBugen\fR also creates logical device names for all other endpoints within the 170 device node's binding scope (interface or device), plus logical device names 171 for their status. 172 .sp 173 .LP 174 If separate \fBugen\fR instances control different interfaces of the same 175 device, the device-wide status and endpoint logical device names created for 176 each instance will share access to the same source or endpoint pipes. For 177 example, a device with two interfaces, each operated by their own \fBugen\fR 178 instance, will show \fBendpoint0\fR as \fBif0cntrl0\fR to the first interface, 179 and will show it as \fBif1cntrl0\fR to the second interface. Both of these 180 logical device names share \fBendpoint0\fR. Likewise for the same device, 181 \fBugen\fR makes the device-wide status available as \fBif0devstat\fR to the 182 first interface and as \fBif1devstat\fR to the second interface. 183 \fBif0devstat\fR and \fBif1devstat\fR both return the same data. 184 .sp 185 .LP 186 Any \fBugen\fR logical device name can be held open by only one user at a time, 187 regardless of whether the\fB O_EXCL\fR flag passed to \fBopen\fR(2). When a 188 single pipe or data source is shared by multiple logical device names, such as 189 if[0,1]cntrl0 or if[0,1]devstat above, more than one logical device name 190 sharing the pipe or data source can be open at a time. However, only one user 191 may access the shared pipe or data source at a time, regardless of the logical 192 device name used for access. 193 .sp 194 .LP 195 When \fBugen\fR is bound to an entire device, the following logical device 196 names are created (each on a single line). \fIN\fR represents the instance 197 number of the device type. 198 .sp 199 .in +2 200 .nf 201 Endpoint 0 (default endpoint): 202 203 /dev/usb/<vid>.<pid>/<N>/cntrl0 204 /dev/usb/<vid>.<pid>/<N>/cntrl0stat 205 206 For example: 207 208 /dev/usb/472.b0b0/0/cntrl0 209 /dev/usb/472.b0b0/0/cntrl0stat 210 211 Configuration index 1, Endpoints > 0, alternate 0: 212 213 /dev/usb/<vid>.<pid>/<N>/if<interface#> 214 <in|out|cntrl><endpoint#> 215 /dev/usb/<vid>.<pid>/<N>/if<interface#> 216 <in|out|cntrl><endpoint#>stat 217 218 For example: 219 220 /dev/usb/472.b0b0/0/if0in1 221 /dev/usb/472.b0b0/0/if0in1stat 222 223 Configuration index 1, Endpoints > 0, alternate > 0: 224 225 /dev/usb/<vid>.<pid>/<N>/if<interface#>. 226 <alternate><in|out|cntrl><endpoint#> 227 /dev/usb/<vid>.<pid>/<N>/if<interface#>. 228 <alternate<in|out|cntrl><endpoint#>stat 229 230 For example: 231 232 /dev/usb/472.b0b0/0/if0.1in3 233 /dev/usb/472.b0b0/0/if0.1in3stat 234 235 Configuration index> 1, Endpoints > 0, alternate 0: 236 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#> 237 <in|out|cntrl><endpoint#> 238 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#> 239 <in|out|cntrl><endpoint#>stat 240 241 For example: 242 243 /dev/usb/472.b0b0/0/cfg2if0in1 244 /dev/usb/472.b0b0/0/cfg2if0in1stat 245 246 Note that the configuration value from the configuration 247 descriptor indexed by the configuration index is used in 248 the node name and not the configuration index itself. 249 250 Configuration index> 1, Endpoints > 0, alternate > 0: 251 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#>. 252 <alternate<in|out|cntrl><endpoint#> 253 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#>. 254 <alternate<in|out|cntrl><endpoint#>stat 255 256 For example: 257 258 /dev/usb/472.b0b0/0/cfg2if0.1in1 259 /dev/usb/472.b0b0/0/cfg2if0.1in1stat 260 261 Device status: 262 263 /dev/usb/<vid>.<pid>/<N>/devstat 264 265 For example: 266 267 /dev/usb/472.b0b0/0/devstat 268 .fi 269 .in -2 270 271 .sp 272 .LP 273 When \fBugen\fR is bound to a single device interface, the following logical 274 device nodes are created: 275 .sp 276 .in +2 277 .nf 278 Endpoint 0 (default endpoint): 279 280 /dev/usb/<vid>.<pid>/<N>/if<interface#>cntrl0 281 /dev/usb/<vid>.<pid>/<N>/if<interface#>cntrl0stat 282 283 For example: 284 285 /dev/usb/472.b0b0/0/if0cntrl0 286 /dev/usb/472.b0b0/0/if0cntrl0stat 287 288 Device status: 289 /dev/usb/<vid>.<pid>/<N>/if<interface#>devstat 290 291 For example: 292 /dev/usb/472.b0b0/0/if0devstat 293 .fi 294 .in -2 295 296 .sp 297 .LP 298 The format for all other logical device names is identical to the format used 299 when \fBugen\fR is bound to the entire device. 300 .sp 301 .LP 302 Opening the endpoint of a different configuration or different alternate 303 interface will cause an implicit change of configuration or a switch to an 304 alternate interface. A configuration change is prohibited when any non-zero 305 endpoint device nodes are open. An alternate interface switch is prohibited if 306 any endpoint in the same interface is open. 307 .SH HOT-PLUGGING 308 .sp 309 .LP 310 A device may be hot-removed at any time. Following hot-removal, the device 311 status changes to USB_DEV_STAT_DISCONNECTED, the status of open endpoints 312 change to USB_LC_STAT_DISCONNECTED upon their access, and all subsequent 313 transfer requests fail. Endpoints are reactivated by first reinserting the 314 device and then closing and reopening all endpoints that were open when the 315 device was disconnected. 316 .SH CPR (CHECKPOINT/RESUME) 317 .sp 318 .LP 319 CPR (Checkpoint/Resume) may be initiated at any time and is treated similarly 320 to a hot-removal. Upon successful suspend and resume, all subsequent transfer 321 requests fail as an indication to the application to reinitialize. Applications 322 should close and reopen all endpoints to reinstate them. All endpoint and 323 device status on Resume (before close and reopen) is USB_LC_STAT_SUSPENDED. A 324 system suspend will fail while \fBugen\fR is performing a transfer. 325 .SH DEVICE POWER MANAGEMENT 326 .sp 327 .LP 328 Devices which support remote wakeup can be power managed when they have no open 329 logical device nodes. When an application opens the first logical device node 330 of a device, that application should assume that a reinitialization of device 331 state is required. 332 .SH DEVICE STATUS MANAGEMENT 333 .sp 334 .LP 335 Applications can monitor device status changes by reading the device status 336 from the device status logical name. When opened without O_NONBLOCK and 337 O_NDELAY, all reads from that file descriptor (with the exception of the the 338 intial read that follows the open) block until a device status change occurs. 339 Calls to read will always return immediately if opened with \fBO_NONBLOCK\fR or 340 \fBO_NDELAY\fR. Nonblocking calls to read which have no data to return, return 341 no error and zero bytes read. 342 .sp 343 .LP 344 Device statuses are: 345 .sp 346 .ne 2 347 .na 348 \fBUSB_DEV_STAT_ONLINE\fR 349 .ad 350 .RS 29n 351 Device is available. 352 .RE 353 354 .sp 355 .ne 2 356 .na 357 \fBUSB_DEV_STAT_DISCONNECTED\fR 358 .ad 359 .RS 29n 360 Device has been disconnected. 361 .RE 362 363 .sp 364 .ne 2 365 .na 366 \fBUSB_DEV_STAT_RESUMED\fR 367 .ad 368 .RS 29n 369 Device has been resumed, however, endpoints which were open on suspend have not 370 yet been closed and reopened. 371 .RE 372 373 .sp 374 .ne 2 375 .na 376 \fBUSB_DEV_STAT_UNAVAILABLE\fR 377 .ad 378 .RS 29n 379 Device has been reconnected, however, endpoints which were open on disconnect 380 have not yet been closed and reopened. 381 .RE 382 383 .sp 384 .LP 385 The following code reads the device status device logical name: 386 .sp 387 .in +2 388 .nf 389 int fd; 390 int status; 391 392 if ((fd = open("/dev/usb/472.b0b0/0/devstat", 393 O_RDONLY)) < 0) { 394 /* handle error */ 395 } 396 397 if (read(fd, &status, sizeof(status)) != sizeof(status)) { 398 /* handle error */ 399 } 400 401 switch (status) { 402 case USB_DEV_STAT_DISCONNECTED: 403 printf ("Terminating as device has been disconnected.\en"); 404 exit (0); 405 406 case USB_DEV_STAT_RESUMED: 407 case USB_DEV_STAT_UNAVAILABLE: 408 /* 409 * Close and reopen endpoints to reestablish device access, 410 * then reset device. 411 */ 412 break; 413 414 case USB_DEV_STAT_ONLINE: 415 default: 416 break; 417 } 418 .fi 419 .in -2 420 421 .sp 422 .LP 423 Use \fBpoll\fR(2) to block on several logical names simultaneously, including 424 device status logical names. Poll indicates when reading a logical name would 425 return data. See \fBpoll\fR(2) for details. Calls to read may be done whether 426 or not they follow calls to poll. 427 .SH ENDPOINT STATUS MANAGEMENT 428 .sp 429 .LP 430 Each data endpoint has a corresponding status logical name. Use the status 431 logical name to retrieve the state of the data endpoint, including detail on 432 how its most recent transfer failed. Reads of the status file descriptors 433 always return immediately. See the ERRORS section for more information on 434 endpoint status values. All logical device name files created for returning 435 status must be opened with \fBO_RDONLY\fR. 436 .sp 437 .LP 438 The following code illustrates reading the status file descriptor of an 439 endpoint which just failed a data transfer in order to get more information on 440 the failure. 441 .sp 442 .in +2 443 .nf 444 int data_xfered, status; 445 int ep1_data_fd, ep1_stat_fd; 446 uchar_t request[8]; 447 448 ep1_data_fd = open ("/dev/usb/472.b0b0/0/if0out1", O_WRONLY); 449 450 if (ep1_data_fd < 0) { 451 /* Handle open error. */ 452 } 453 454 ep1_stat_fd = open ("/dev/usb/472.b0b0/0/if0out1stat", 455 O_RDONLY); 456 if (ep1_stat_fd < 0) { 457 /* Handle open error. */ 458 } 459 460 data_xfered = write(ep1_data_fd, request, sizeof (request)); 461 462 /* An error occured during the data transfer. */ 463 if (data_xfered != sizeof (request)) { 464 465 /* Read status file descriptor for details on failure. */ 466 if (read(ep1_stat_fd, (int *)&status, sizeof (status)) != 467 sizeof (status)) { 468 status = USB_LC_STAT_UNSPECIFIED_ERR; 469 } 470 471 /* Take appropriate action. */ 472 switch (status) { 473 case USB_LC_STAT_STALL: 474 printf ("Endpoint stalled.\en"); 475 break; 476 case ... 477 ... 478 } 479 480 } 481 .fi 482 .in -2 483 484 .SH CONTROL TRANSFERS 485 .sp 486 .LP 487 The control endpoint is typically used to set up the device and to query device 488 status or configuration. 489 .sp 490 .LP 491 Applications requiring I/O on a control endpoint should open the corresponding 492 logical device name and use regular UNIX I/O system calls. For example: 493 \fBread\fR(2), \fBwrite\fR(2), \fBaioread\fR(3C) and \fBaiowrite\fR(3C). 494 \fBpoll\fR(2) is not supported on control endpoints. 495 .sp 496 .LP 497 A control endpoint must be opened with \fBO_RDWR\fR since it is bidirectional. 498 It cannot be opened with \fBO_NONBLOCK\fR or \fBO_NDELAY\fR. 499 .sp 500 .LP 501 For example: 502 .sp 503 .in +2 504 .nf 505 fd = open("/dev/usb/472.b0b0/0/cntrl0", O_RDWR); 506 507 .fi 508 .in -2 509 510 .sp 511 .in +2 512 .nf 513 fdstat = open("/dev/usb/472.b0b0/0/cntrl0stat", O_RDONLY); 514 .fi 515 .in -2 516 517 .sp 518 .LP 519 Control endpoints can be read and written. A \fBread\fR operation receives data 520 \fBfrom\fR the device and a \fBwrite\fR operation sends data \fBto\fR the 521 device. 522 .sp 523 .LP 524 To perform a control-IN transfer, perform a \fBwrite\fR(2) of USB setup data 525 (see section 9.3 of the \fIUSB 1.1\fR or \fI2.0\fR specifications) followed by 526 a \fBread\fR(2) on the same control endpoint to fetch the desired data. For 527 example: 528 .sp 529 .in +2 530 .nf 531 void init_cntrl_req( 532 uchar_t *req, uchar_t bmRequestType, uchar_t bRequest, 533 ushort_t wValue, ushort_t wIndex, ushort_t wLength) { 534 req[0] = bmRequestType; 535 req[1] = bRequest; 536 req[2] = 0xFF & wValue; 537 req[3] = 0xFF & (wValue >> 8); 538 req[4] = 0xFF & wIndex; 539 req[5] = 0xFF & (wIndex >> 8); 540 req[6] = 0xFF & wLength; 541 req[7] = 0xFF & (wLength >> 8); 542 } 543 544 .... 545 546 547 uchar_t dev_descr_req[8]; 548 usb_dev_descr_t descr; 549 550 init_cntrl_req(dev_descr_req, 551 USB_DEV_REQ_DEV_TO_HOST, USB_REQ_GET_DESCR, 552 USB_DESCR_TYPE_SETUP_DEV, 0, sizeof (descr)); 553 554 count = write(fd, dev_descr_req, sizeof (dev_descr_req)); 555 if (count != sizeof (dev_descr_req)) { 556 /* do some error recovery */ 557 ... 558 } 559 560 count = read(fd, &descr, sizeof (descr)); 561 if (count != sizeof (descr)) { 562 /* do some error recovery */ 563 } 564 .fi 565 .in -2 566 567 .sp 568 .LP 569 The application can issue any number of reads to read data received on a 570 control endpoint. \fBugen\fR successfully completes all reads, returning the 571 number of bytes transferred. Zero is returned when there is no data to 572 transfer. 573 .sp 574 .LP 575 If the \fBread\fR/\fBwrite\fR fails and returns \fB-1\fR, you can access the 576 endpoint's status device logical name for precise error information: 577 .sp 578 .in +2 579 .nf 580 int status; 581 582 count = read(fdstat, &status, sizeof (status)); 583 if (count == sizeof (status)) { 584 switch (status) { 585 case USB_LC_STAT_SUSPENDED: 586 case USB_LC_STAT_DISCONNECTED: 587 /* close all endpoints */ 588 ... 589 break; 590 default: 591 ... 592 break; 593 } 594 } 595 .fi 596 .in -2 597 598 .sp 599 .LP 600 Refer to the ERRORS section for all possible error values. 601 .sp 602 .LP 603 To perform a control-OUT transfer, send in a single transfer, the USB setup 604 data followed by any accompanying data bytes. 605 .sp 606 .in +2 607 .nf 608 /* 1st 8 bytes of wbuf are setup. */ 609 init_cntrl_req(wbuf, .......); 610 611 /* Data bytes begin at byte 8 of wbuf. */ 612 bcopy(data, &wuf[8], sizeof (data)); 613 614 /* Send it all in a single transfer. */ 615 count = write(fd, wbuf, sizeof (wbuf)); 616 .fi 617 .in -2 618 619 .sp 620 .LP 621 A \fBwrite\fR(2) returns the number of bytes (both setup and data) actually 622 transferred, (whether or not the \fBwrite\fR is completely successful), 623 provided that some data is actually transferred. When no data is transferred, 624 \fBwrite\fR(2) returns \fB-1\fR. Applications can read the corresponding 625 endpoint status to retrieve detailed error information. Note that it is an 626 error to specify a size different than: 627 .sp 628 .LP 629 (number of data bytes + number of setup bytes). 630 .sp 631 .LP 632 Here is a more extensive example which gets all descriptors of a device 633 configuration. For sake of brevity, uninteresting parts are omitted. 634 .sp 635 .in +2 636 .nf 637 #include <sys/usb/usba.h> 638 #include <sys/usb/clients/ugen/usb_ugen.h> 639 640 uchar_t *config_cloud; 641 uchar_t *curr_descr; 642 643 uchar_t *bytes; 644 645 int curr_descr_len; 646 int curr_descr_type; 647 648 usb_cfg_descr_t cfg_descr; 649 usb_if_descr_t if_descr; 650 usb_ep_descr_t ep_descr; 651 652 /* See 9.13 of USB 2.0 spec for ordering. */ 653 static char *pipetypes[] = { 654 "Control", "Isochronous", "Bulk", "Interrupt" 655 }; 656 657 /* 658 * Setup to send a request to read just the config descriptor. The 659 * size of the whole cloud, containing all cfg, interface, endpoint, 660 * class and vendor-specific descriptors, will be returned as part of 661 * the config descriptor. 662 */ 663 init_cntrl_req(&setup_data, USB_DEV_REQ_DEV_TO_HOST, USB_REQ_GET_DESCR, 664 USB_DESCR_TYPE_SETUP_CFG, 0, USB_CFG_DESCR_SIZE); 665 666 /* 667 * Write setup data. USB device will prepare to return the whole 668 * config cloud as a response to this. We will read this separately. 669 */ 670 count = write(ctrl_fd, &setup_data, sizeof (setup_data)); 671 if (count != sizeof (setup_data)) { 672 /* Error recovery. */ 673 } else { 674 count = read(ctrl_fd, &cfg_descr, USB_CFG_DESCR_SIZE); 675 if (count != USB_CFG_DESCR_SIZE) { 676 /* Error recovery. */ 677 } 678 } 679 680 /* USB data is little endian. */ 681 bytes = (uchar_t *)(&cfg_descr.wTotalLength); 682 totalLength = bytes[0] + (bytes[1] << 8); 683 684 /* 685 * The size of the whole cloud is in the bLength field. Set up 686 * to read this amount of data, to get the whole cloud. 687 */ 688 config_cloud = malloc(totalLength); 689 690 init_cntrl_req(&setup_data, USB_DEV_REQ_DEV_TO_HOST, USB_REQ_GET_DESCR, 691 USB_DESCR_TYPE_SETUP_CFG, 0, totalLength); 692 693 count = write(ctrl_fd, &setup_data, sizeof (setup_data)); 694 if (count != sizeof (setup_data)) { 695 /* Error recovery. */ 696 } else { 697 count = read(ctrl_fd, config_cloud, totalLength); 698 if (count != totalLength) { 699 /* Error recovery. */ 700 } 701 } 702 703 /* Got the data. Now loop, dumping out the descriptors found. */ 704 705 curr_descr = config_cloud; 706 offset = 0; 707 while (offset < totalLength) { 708 709 /* All descr have length and type at offset 0 and 1 */ 710 curr_descr_len = curr_descr[0]; 711 curr_descr_type = curr_descr[1]; 712 713 switch (curr_descr_type) { 714 case USB_DESCR_TYPE_CFG: 715 716 /* 717 * Copy data into separate structure, needed for 718 * proper alignment of all non char fields. Note: 719 * non-char fields of all descriptors begin on aligned 720 * boundaries. The issue is that some structures may 721 * be adjacent to others which have an odd-numbered 722 * byte size, and may thus start on an odd-numbered 723 * boundary. */ 724 bcopy(curr_descr, &cfg_descr, curr_descr_len); 725 726 /* Remember to read any words in endian-neutral way. */ 727 728 (void) printf("\enConfig %d found.\en", 729 cfg_descr.bConfigurationValue); 730 break; 731 732 case USB_DESCR_TYPE_IF: 733 bcopy(curr_descr, &if_descr, curr_descr_len); 734 (void) printf("\en\etInterface %d, Alt %d found.\en", 735 if_descr.bInterfaceNumber, 736 if_descr.bAlternateSetting); 737 break; 738 739 case USB_DESCR_TYPE_EP: 740 bcopy(curr_descr, &ep_descr, curr_descr_len); 741 (void) printf("\en\et\etEndpoint %d (%s-%s) found.\en", 742 (ep_descr.bEndpointAddress & USB_EP_NUM_MASK), 743 (pipetypes[ 744 ep_descr.bmAttributes & USB_EP_ATTR_MASK]), 745 ((ep_descr.bEndpointAddress & 746 USB_EP_DIR_IN) ? "IN" : "OUT")); 747 break; 748 749 default: 750 (void) printf( 751 "\en\et\et\etOther descriptor found. Type:%d\en", 752 curr_descr_type); 753 break; 754 } 755 756 offset += curr_descr_len; 757 curr_descr = &config_cloud[offset]; 758 } 759 .fi 760 .in -2 761 762 .SH INTERRUPT-IN TRANSFERS 763 .sp 764 .LP 765 Applications requiring data from an interrupt-IN endpoint should open the 766 corresponding logical device name and use \fBread\fR(2), \fBaioread\fR(3C) and 767 \fBpoll\fR(2) system calls. 768 .sp 769 .LP 770 An interrupt-IN endpoint must be opened with \fBO_RDONLY\fR. It can also be 771 opened using \fBO_NONBLOCK\fR or \fBO_NDELAY\fR if desired. 772 .sp 773 .in +2 774 .nf 775 fd = open("/dev/usb/472.b0b0/0/if0in1", O_RDONLY); 776 .fi 777 .in -2 778 779 .sp 780 .in +2 781 .nf 782 fdstat = open("/dev/usb/472.b0b0/0/if0in1stat", O_RDONLY); 783 784 .fi 785 .in -2 786 787 .sp 788 .LP 789 \fBugen\fR starts polling interrupt\(emIN endpoints immediately upon opening 790 them and stops polling them upon closure. (Polling refers to interrogation of 791 the device by the driver and should not be confused with \fBpoll\fR(2), which 792 is an interrogation of the driver by the application.) 793 .sp 794 .LP 795 A \fBread\fR(2) of an endpoint opened with the \fBO_NONBLOCK\fR or 796 \fBO_NDELAY\fR flags set will not block when there is insufficient data 797 available to satisfy the request. The \fBread\fR simply returns what it can 798 without signifying any error. 799 .sp 800 .LP 801 Applications should continuously check for and consume interrupt data. 802 \fBugen\fR enables buffering of up to one second of incoming data. In case of 803 buffer overflow, \fBugen\fR stops polling the interrupt-IN endpoint until the 804 application consumes all the data. In this case, a \fBread\fR(2) of an empty 805 buffer returns \fB-1\fR, sets the endpoint status to 806 \fBUSB_LC_STAT_INTR_BUF_FULL\fR (to indicate that the buffer had been full and 807 polling had been stopped) and causes \fBugen\fR to start polling the endpoint 808 again. To retrieve the status, the application can open and read the 809 corresponding endpoint's status device logical name. 810 .sp 811 .in +2 812 .nf 813 for (;;) { 814 count = read(fd, buf, sizeof(buf)); 815 if (count == -1) { 816 int cnt, status; 817 818 cnt = read(fdstat, &status, sizeof (status)); 819 if (cnt == -1) { 820 /* more error recovery here */ 821 } else { 822 switch (status) { 823 case USB_LC_STAT_INTR_BUF_FULL: 824 ... 825 break; 826 default: 827 ... 828 break; 829 } 830 } 831 } 832 /* process the data */ 833 .... 834 } 835 .fi 836 .in -2 837 838 .sp 839 .LP 840 \fBugen\fR will never drop data. However, the device may drop data if the 841 application cannot read it at the rate that it is produced. 842 .sp 843 .LP 844 Applications requiring unbuffered data from an interrupt-IN endpoint should 845 open the associated status endpoint with O_RDWR before opening the associated 846 interrupt-IN endpoint and write a control byte with USB_EP_INTR_ONE_XFER set. 847 All other bits are reserved and should be 0. 848 .sp 849 .LP 850 "One transfer" mode will persist until disabled explicitly after the associated 851 interrupt-IN endpoint has been closed by writing a control byte with 852 USB_EP_INTR_ONE_XFER cleared. 853 .sp 854 .LP 855 "One transfer" mode is implicitly disabled when the status/control endpoint is 856 closed. 857 .sp 858 .LP 859 Attempts to change the "one transfer" mode while the endpoint is open will 860 result in \fBEINVAL\fR. 861 .sp 862 .LP 863 An application can open multiple interrupt-IN endpoints and can call 864 \fBpoll\fR(2) to monitor the availability of new data. (Note: poll works with 865 interrupt-IN data endpoints, not their status endpoints.) 866 .sp 867 .in +2 868 .nf 869 struct pollfd pfd[2]; 870 871 bzero(pfd, sizeof (pfd)); 872 pfd[0].fd = fd1; /* fd1 is one interrupt-IN endpoint. */ 873 pfd[0].events = POLLIN; 874 pfd[1].fd = fd2; /* fd2 is another interrupt-IN endpoint. */ 875 pfd[1].events = POLLIN; 876 877 for (;;) { 878 poll(pfd, 2, -1); 879 880 if (pfd[0].revents & POLLIN) { 881 count = read(fd1, buf, sizeof (buf)); 882 .... 883 } 884 if (pfd[1].revents & POLLIN) { 885 count = read(fd2, buf, sizeof (buf)); 886 .... 887 } 888 } 889 .fi 890 .in -2 891 892 .sp 893 .LP 894 You can monitor the device status endpoint via \fBpoll\fR(2) concurrently with 895 the multiple interrupt-IN endpoints. Simply add another pollfd element to the 896 pfd array in the previous code example, and initialize the new element's 897 \fBfd\fR field with the file descriptor of the device status endpoint (opened 898 without O_NONBLOCK or O_NDELAY). Set the new element's event field to POLLIN 899 like the other elements. Note that only interrupt-IN endpoints and the device 900 status endpoint can be monitored using \fBpoll\fR(2). 901 .SH INTERRUPT-OUT TRANSFERS 902 .sp 903 .LP 904 Applications requiring output on an interrupt-OUT endpoint can open the 905 corresponding logical device name and perform regular UNIX I/O system calls 906 such as \fBwrite\fR(2) and \fBaiowrite\fR(3C). 907 .sp 908 .LP 909 An interrupt-OUT endpoint must be opened with O_WRONLY. 910 .sp 911 .in +2 912 .nf 913 fd = open("/dev/usb/472.b0b0/0/if0out3", O_WRONLY); 914 915 fdstat = open("/dev/usb/472.b0b0/0/if0out3stat", O_RDONLY); 916 917 918 .fi 919 .in -2 920 921 .sp 922 .LP 923 Data can be written to an interrupt-OUT endpoint as follows: 924 .sp 925 .in +2 926 .nf 927 count = write(fd, buf, sizeof (buf)): 928 if (count == -1) { 929 /* error recovery */ 930 } 931 .fi 932 .in -2 933 934 .SH BULK TRANSFERS 935 .sp 936 .LP 937 Applications requiring I/O on a bulk endpoint can open the corresponding 938 logical device name and perform regular UNIX I/O system calls. For example: 939 \fBread\fR(2), \fBwrite\fR(2), \fBaioread\fR(3C) and \fBaiowrite\fR(3C). 940 \fBpoll\fR(2) is not supported on bulk endpoints. 941 .sp 942 .LP 943 A bulk endpoint must be opened with \fBO_RDONLY\fR or \fBO_WRONLY\fR and cannot 944 be opened with \fBO_NONBLOCK\fR or \fBO_NDELAY:\fR 945 .sp 946 .in +2 947 .nf 948 fd = open("/dev/usb/472.b0b0/0/if0in2", O_RDONLY); 949 .fi 950 .in -2 951 952 .sp 953 .in +2 954 .nf 955 fdstat = open("/dev/usb/472.b0b0/0/if0in2stat", O_RDONLY); 956 .fi 957 .in -2 958 959 .sp 960 .LP 961 Data can be read from a bulk-IN endpoint as follows: 962 .sp 963 .in +2 964 .nf 965 count = read(fd, buf, sizeof (buf)): 966 if (count == -1) { 967 /* error recovery */ 968 } 969 970 Data can be written to a bulk-OUT endpoint as follows: 971 972 count = write(fd, buf, sizeof (buf)): 973 if (count == -1) { 974 /* error recovery */ 975 } 976 .fi 977 .in -2 978 979 .SH ISOCHRONOUS TRANSFERS 980 .sp 981 .LP 982 Applications requiring I/O on an isochronous endpoint can open the 983 corresponding logical device name and perform regular UNIX I/O system calls 984 such as \fBread\fR(2), \fBwrite\fR(2), \fBpoll\fR(2), \fBaioread\fR(3C) and 985 \fBaiowrite\fR(3C). An isochronous endpoint must be opened with \fBO_RDWR\fR. 986 .sp 987 .in +2 988 .nf 989 fd = open("/dev/usb/472.b0b0/0/if0.3in2", O_RDWR); 990 991 fdstat = open("/dev/usb/472.b0b0/0/if0.3in2stat", O_RDONLY); 992 .fi 993 .in -2 994 995 .sp 996 .LP 997 Applications can use the status logical name to retrieve the state of the 998 isochronous data endpoint, including details on why the most recent transfer 999 failed. 1000 .sp 1001 .LP 1002 Applications have the flexibility to specify the number of isochronous packets 1003 and the size of individual packets they want to transfer. Applications should 1004 use the following data structures to exchange isochronous packet information 1005 with the \fBugen\fR driver: 1006 .sp 1007 .in +2 1008 .nf 1009 typedef struct ugen_isoc_pkt_descr { 1010 /* 1011 * Set by the application, for all isochro. 1012 * requests, to the num. of bytes to xfer 1013 * in a packet. 1014 */ 1015 ushort_t dsc_isoc_pkt_len; 1016 1017 /* 1018 * Set by ugen to actual num. of bytes sent/received 1019 * in a packet. 1020 */ 1021 ushort_t dsc_isoc_pkt_actual_len; 1022 1023 /* 1024 * Per pkt. status set by ugen driver both for the 1025 * isochronous IN and OUT requests. Application can 1026 * use USB_LC_STAT_* to parse the status. 1027 */ 1028 int dsc_isoc_pkt_status; 1029 } ugen_isoc_pkt_descr_t; 1030 1031 typedef struct ugen_isoc_req_head { 1032 /* pkt count of the isoc request */ 1033 int req_isoc_pkts_count; 1034 1035 /* pkt descriptors */ 1036 ugen_isoc_pkt_descr_t req_isoc_pkt_descrs[1]; 1037 } ugen_isoc_req_head_t; 1038 .fi 1039 .in -2 1040 1041 .sp 1042 .LP 1043 \fBreq_isoc_pkts_count\fR is limited by the capability of the USB host 1044 controller driver. The current upper bound for the \fBuhci\fR and \fBohci\fR 1045 drivers is 512. The upper bound for the \fBehci\fR driver is 1024. 1046 .sp 1047 .LP 1048 For an isochronous-IN endpoint, applications must first use the 1049 \fBugen_isoc_req_head_t\fR structure followed by \fBugen_isoc_pkt_descr_t\fR to 1050 write packet request information to the \fBugen\fR node. The \fBugen\fR driver 1051 then checks the validity of the request. If it is valid, the driver immediately 1052 begins isochronous polling on the IN endpoint and applications can proceed with 1053 \fBread\fR(2) of the data on the isochronous-IN endpoint. Upon successful 1054 return of \fBread\fR(2), isochronous packet descriptors (whose 1055 \fBdsc_isoc_pkt_actual_len\fR and \fBdsc_isoc_pkt_status\fR fields were filled 1056 by the driver) are returned, followed by the request's device payload data. 1057 .sp 1058 .LP 1059 Applications should continuously check for and consume isochronous data. The 1060 \fBugen\fR driver enables buffering of up to eight seconds of incoming data for 1061 full-speed isochronous endpoint, one second of data for high-speed isochronous 1062 endpoints who request one transaction per microframe and 1/3 of a second of 1063 incoming data for high-speed high-bandwidth isochronous endpoints who request 1064 three transactions per microframe. In case of buffer overflow, \fBugen\fR 1065 discards the oldest data. 1066 .sp 1067 .LP 1068 The isochronous-IN polling can only be stopped by a \fBclose\fR(2) associated 1069 file descriptor. If applications want to change packet information, they must 1070 first \fBclose\fR(2) the endpoint to stop the isochronous-IN polling, then 1071 \fBopen\fR(2) the endpoint and \fBwrite\fR(2) new packets request. 1072 .sp 1073 .LP 1074 The following example shows how to read an isochronous-IN endpoint: 1075 .sp 1076 .in +2 1077 .nf 1078 #include <sys/usb/clients/ugen/usb_ugen.h> 1079 1080 char *buf, *p; 1081 ushort_t pktlen; 1082 int pktcnt, i; 1083 int len; 1084 ugen_isoc_req_head_t *req; 1085 ugen_isoc_pkt_descr_t *pktdesc; 1086 char rdbuf[5000]; 1087 1088 pktcnt = 4; /* 4 packets in this request */ 1089 1090 len = sizeof(int) + 1091 sizeof(ugen_isoc_pkt_descr_t) * pktcount; 1092 1093 buf = malloc(len); 1094 if (!buf) { 1095 /* Error recovery. */ 1096 } 1097 1098 req = (ugen_isoc_req_head_t *)buf; 1099 req->req_isoc_pkts_count = pktcnt; 1100 1101 pktdesc = (ugen_isoc_pkt_descr_t *) 1102 (req->req_isoc_pkt_descrs); 1103 1104 for (i = 0; i < pktcnt; i++) { 1105 /* 1106 * pktlen should not exceed xfer 1107 * capability of an endpoint 1108 */ 1109 pktdesc[i].dsc_isoc_pkt_len = pktlen; 1110 1111 pktdesc[i].dsc_isoc_pkt_actual_len = 0; 1112 pktdesc[i].dsc_isoc_pkt_status = 0; 1113 } 1114 1115 /* 1116 * write request info to driver and len must 1117 * be exactly the sum of 1118 * sizeof(int) + sizeof(ugen_isoc_pkt_descr_t) * pktcnt. 1119 * Otherwise, an error is returned. 1120 */ 1121 if (write(fd, buf, len) < 0) { 1122 /* Error recovery. */ 1123 } 1124 1125 /* 1126 * Read length should be sum of all pkt descriptors 1127 * length + payload data length of all pkts 1128 * (sizeof(ugen_isoc_pkt_descr_t) + pktlen) * pktcnt 1129 */ 1130 if (read(fd, rdbuf, (sizeof(ugen_isoc_pkt_descr_t) + 1131 pktlen) * pktcnt) < 0) { 1132 /* Error recovery. */ 1133 } 1134 1135 pktdesc = (ugen_isoc_pkt_descr_t *) rdbuf; 1136 1137 /* points to payload beginning */ 1138 p = rdbuf + pktcnt * sizeof(ugen_isoc_pkt_descr_t); 1139 1140 for (i = 0; i < pktcnt; i++) { 1141 printf("packet %d len = %d," 1142 " actual_len = %d, status = 0x%x\en", 1143 i, pktdesc->dsc_isoc_pkt_len, 1144 pktdesc->dsc_isoc_pkt_actual_len, 1145 pktdesc->dsc_isoc_pkt_status); 1146 1147 /* Processing data */ 1148 1149 /* 1150 * next packet data payload, do NOT use 1151 * dsc_isoc_pkt_actual_len 1152 */ 1153 p += pktdesc->dsc_isoc_pkt_len; 1154 1155 pktdesc++; 1156 } 1157 .fi 1158 .in -2 1159 1160 .sp 1161 .LP 1162 For an isochronous-OUT endpoint, applications use the same packet descriptor 1163 and request structures to write request information to the \fBugen\fR node. 1164 Following the packet request head information is the packet payload data. Upon 1165 successful return of \fBwrite\fR(2), applications can \fBread\fR(2) the same 1166 \fBugen\fR file immediately to retrieve the individual packet transfer status 1167 of the last request. If the application isn't concerned about the status, it 1168 can omit it. 1169 .sp 1170 .LP 1171 In the following example, an application transfers data on an isochronous-OUT 1172 endpoint: 1173 .sp 1174 .in +2 1175 .nf 1176 #include <sys/usb/clients/ugen/usb_ugen.h> 1177 char *buf, *p; 1178 ushort_t i, pktlen; 1179 int len, pktcnt; 1180 ugen_isoc_req_head_t *req; 1181 ugen_isoc_pkt_descr_t *pktdesc; 1182 char rdbuf[4096]; 1183 1184 pktcnt = 4; 1185 1186 /* 1187 * set packet length to a proper value, don't 1188 * exceed endpoint's capability 1189 */ 1190 pktlen = 1024; 1191 1192 len = sizeof(int) + 1193 sizeof(ugen_isoc_pkt_descr_t) * pktcount; 1194 1195 len += pktlen * pktcnt; 1196 1197 buf = malloc(len); 1198 if (!buf) { 1199 /* Error recovery. */ 1200 } 1201 1202 req = (ugen_isoc_req_head_t *)buf; 1203 req->req_isoc_pkts_count = pktcnt; 1204 1205 pktdesc = 1206 (ugen_isoc_pkt_descr_t *)(req->req_isoc_pkt_descrs); 1207 1208 for (i = 0; i < pktcnt; i++) { 1209 pktdesc[i].dsc_isoc_pkt_len = pktlen; 1210 pktdesc[i].dsc_isoc_pkt_actual_len = 0; 1211 pktdesc[i].dsc_isoc_pkt_status = 0; 1212 } 1213 1214 /* moving to beginning of payload data */ 1215 p = buf + sizeof(int) + sizeof(*pktdesc) * pktcnt; 1216 for (i = 0; i < pktcnt; i++) { 1217 1218 /* fill in the data buffer */ 1219 1220 p += pktlen; 1221 } 1222 1223 /* 1224 * write packet request information and data to ugen driver 1225 * 1226 * len should be the exact value of sizeof(int) + 1227 * sizeof(ugen_isoc_pkt_descr_t) * pktcnt + payload length 1228 */ 1229 if (write(fd, buf, len) < 0) { 1230 /* Error recovery. */ 1231 } 1232 1233 /* read packet status */ 1234 if (read(fd, rdbuf, sizeof(*pktdesc) * pktcnt) < 0) { 1235 1236 /* Error recovery. */ 1237 1238 } else { 1239 1240 /* Parse every packet's transfer status */ 1241 1242 } 1243 .fi 1244 .in -2 1245 1246 .SH ERRORS 1247 .sp 1248 .LP 1249 The following statuses are returned by endpoint status device logical names: 1250 .sp 1251 .ne 2 1252 .na 1253 \fBUSB_LC_STAT_NOERROR\fR 1254 .ad 1255 .sp .6 1256 .RS 4n 1257 No error. 1258 .RE 1259 1260 .sp 1261 .ne 2 1262 .na 1263 \fBUSB_LC_STAT_CRC\fR 1264 .ad 1265 .sp .6 1266 .RS 4n 1267 CRC error detected. 1268 .RE 1269 1270 .sp 1271 .ne 2 1272 .na 1273 \fBUSB_LC_STAT_BITSTUFFING\fR 1274 .ad 1275 .sp .6 1276 .RS 4n 1277 Bit stuffing error. 1278 .RE 1279 1280 .sp 1281 .ne 2 1282 .na 1283 \fBUSB_LC_STAT_DATA_TOGGLE_MM\fR 1284 .ad 1285 .sp .6 1286 .RS 4n 1287 Data toggle did not match. 1288 .RE 1289 1290 .sp 1291 .ne 2 1292 .na 1293 \fBUSB_LC_STAT_STALL\fR 1294 .ad 1295 .sp .6 1296 .RS 4n 1297 Endpoint returned stall. 1298 .RE 1299 1300 .sp 1301 .ne 2 1302 .na 1303 \fBUSB_LC_STAT_DEV_NOT_RESP\fR 1304 .ad 1305 .sp .6 1306 .RS 4n 1307 Device not responding. 1308 .RE 1309 1310 .sp 1311 .ne 2 1312 .na 1313 \fBUSB_LC_STAT_UNEXP_PID\fR 1314 .ad 1315 .sp .6 1316 .RS 4n 1317 Unexpected Packet Identifier (PID). 1318 .RE 1319 1320 .sp 1321 .ne 2 1322 .na 1323 \fBUSB_LC_STAT_PID_CHECKFAILURE\fR 1324 .ad 1325 .sp .6 1326 .RS 4n 1327 Check bits on PID failed. 1328 .RE 1329 1330 .sp 1331 .ne 2 1332 .na 1333 \fBUSB_LC_STAT_DATA_OVERRUN\fR 1334 .ad 1335 .sp .6 1336 .RS 4n 1337 Data overrun. 1338 .RE 1339 1340 .sp 1341 .ne 2 1342 .na 1343 \fBUSB_LC_STAT_DATA_UNDERRUN\fR 1344 .ad 1345 .sp .6 1346 .RS 4n 1347 Data underrun. 1348 .RE 1349 1350 .sp 1351 .ne 2 1352 .na 1353 \fBUSB_LC_STAT_BUFFER_OVERRUN\fR 1354 .ad 1355 .sp .6 1356 .RS 4n 1357 Buffer overrun. 1358 .RE 1359 1360 .sp 1361 .ne 2 1362 .na 1363 \fBUSB_LC_STAT_BUFFER_UNDERRUN\fR 1364 .ad 1365 .sp .6 1366 .RS 4n 1367 Buffer underrun. 1368 .RE 1369 1370 .sp 1371 .ne 2 1372 .na 1373 \fBUSB_LC_STAT_TIMEOUT\fR 1374 .ad 1375 .sp .6 1376 .RS 4n 1377 Command timed out. 1378 .RE 1379 1380 .sp 1381 .ne 2 1382 .na 1383 \fBUSB_LC_STAT_NOT_ACCESSED\fR 1384 .ad 1385 .sp .6 1386 .RS 4n 1387 Not accessed by the hardware. 1388 .RE 1389 1390 .sp 1391 .ne 2 1392 .na 1393 \fBUSB_LC_STAT_UNSPECIFIED_ERR\fR 1394 .ad 1395 .sp .6 1396 .RS 4n 1397 Unspecified USBA or HCD error. 1398 .RE 1399 1400 .sp 1401 .ne 2 1402 .na 1403 \fBUSB_LC_STAT_NO_BANDWIDTH\fR 1404 .ad 1405 .sp .6 1406 .RS 4n 1407 No bandwidth available. 1408 .RE 1409 1410 .sp 1411 .ne 2 1412 .na 1413 \fBUSB_LC_STAT_HW_ERR\fR 1414 .ad 1415 .sp .6 1416 .RS 4n 1417 Host Controller h/w error. 1418 .RE 1419 1420 .sp 1421 .ne 2 1422 .na 1423 \fBUSB_LC_STAT_SUSPENDED\fR 1424 .ad 1425 .sp .6 1426 .RS 4n 1427 Device was suspended. 1428 .RE 1429 1430 .sp 1431 .ne 2 1432 .na 1433 \fBUSB_LC_STAT_DISCONNECTED\fR 1434 .ad 1435 .sp .6 1436 .RS 4n 1437 Device was disconnected. 1438 .RE 1439 1440 .sp 1441 .ne 2 1442 .na 1443 \fBUSB_LC_STAT_INTR_BUF_FULL\fR 1444 .ad 1445 .sp .6 1446 .RS 4n 1447 Polling was stopped as the interrupt-IN data buffer was full. Buffer is now 1448 empty and polling has been resumed. 1449 .RE 1450 1451 .sp 1452 .ne 2 1453 .na 1454 \fBUSB_LC_STAT_INTERRUPTED\fR 1455 .ad 1456 .sp .6 1457 .RS 4n 1458 Request was interrupted. 1459 .RE 1460 1461 .sp 1462 .ne 2 1463 .na 1464 \fBUSB_LC_STAT_NO_RESOURCES\fR 1465 .ad 1466 .sp .6 1467 .RS 4n 1468 No resources available for request. 1469 .RE 1470 1471 .sp 1472 .ne 2 1473 .na 1474 \fBUSB_LC_STAT_INTR_POLLING_FAILED\fR 1475 .ad 1476 .sp .6 1477 .RS 4n 1478 Failed to restart polling. 1479 .RE 1480 1481 .sp 1482 .ne 2 1483 .na 1484 \fBUSB_LC_STAT_ISOC_POLLING_FAILED\fR 1485 .ad 1486 .sp .6 1487 .RS 4n 1488 Failed to start isochronous polling. 1489 .RE 1490 1491 .sp 1492 .ne 2 1493 .na 1494 \fBUSB_LC_STAT_ISOC_UNINITIALIZED\fR 1495 .ad 1496 .sp .6 1497 .RS 4n 1498 Isochronous packet information not initialized. 1499 .RE 1500 1501 .sp 1502 .ne 2 1503 .na 1504 \fBUSB_LC_STAT_ISOC_PKT_ERROR\fR 1505 .ad 1506 .sp .6 1507 .RS 4n 1508 All packets in this isochronous request have errors. The polling on this 1509 isochronous-IN endpoint is suspended and can be resumed on next \fBread\fR(2). 1510 .RE 1511 1512 .sp 1513 .LP 1514 The following system call \fBerrno\fR values are returned: 1515 .sp 1516 .ne 2 1517 .na 1518 \fB\fBEINVAL\fR\fR 1519 .ad 1520 .RS 11n 1521 An attempt was made to enable or disable "one transfer" mode while the 1522 associated endpoint was open. 1523 .RE 1524 1525 .sp 1526 .ne 2 1527 .na 1528 \fB\fBEBUSY\fR\fR 1529 .ad 1530 .RS 11n 1531 The endpoint has been opened and another open is attempted. 1532 .RE 1533 1534 .sp 1535 .ne 2 1536 .na 1537 \fB\fBEACCES\fR\fR 1538 .ad 1539 .RS 11n 1540 An endpoint open was attempted with incorrect flags. 1541 .RE 1542 1543 .sp 1544 .ne 2 1545 .na 1546 \fB\fBENOTSUP\fR\fR 1547 .ad 1548 .RS 11n 1549 Operation not supported. 1550 .RE 1551 1552 .sp 1553 .ne 2 1554 .na 1555 \fB\fBENXIO\fR\fR 1556 .ad 1557 .RS 11n 1558 Device associated with the file descriptor does not exist. 1559 .RE 1560 1561 .sp 1562 .ne 2 1563 .na 1564 \fBENODEV\fR 1565 .ad 1566 .RS 11n 1567 Device has been hot-removed or a suspend/resume happened before this command. 1568 .RE 1569 1570 .sp 1571 .ne 2 1572 .na 1573 \fBEIO\fR 1574 .ad 1575 .RS 11n 1576 An I/O error occurred. Send a read on the endpoint status minor node to get the 1577 exact error information. 1578 .RE 1579 1580 .sp 1581 .ne 2 1582 .na 1583 \fBEINTR\fR 1584 .ad 1585 .RS 11n 1586 Interrupted system call. 1587 .RE 1588 1589 .sp 1590 .ne 2 1591 .na 1592 \fBENOMEM\fR 1593 .ad 1594 .RS 11n 1595 No memory for the allocation of internal structures. 1596 .RE 1597 1598 .SH FILES 1599 .sp 1600 .in +2 1601 .nf 1602 /kernel/drv/ugen 32 bit ELF kernel module (x86 platform only) 1603 /kernel/drv/sparcv9/ugen 64 bit ELF kernel module 1604 1605 /dev/usb/<vid>.<pid>/<N>/cntrl0 1606 /dev/usb/<vid>.<pid>/<N>/cntrl0stat 1607 1608 /dev/usb/<vid>.<pid>/<N>/if<interface#> 1609 <in|out|cntrl><endpoint#> 1610 /dev/usb/<vid>.<pid>/<N>/if<interface#> 1611 <in|out|cntrl><endpoint#>stat 1612 1613 /dev/usb/<vid>.<pid>/<N>/if<interface#>. 1614 <alternate><in|out|cntrl<endpoint#> 1615 /dev/usb/<vid>.<pid>/<N>/if<interface#>. 1616 <alternate><in|out|cntrl><endpoint#>stat 1617 1618 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#> 1619 <in|out|cntrl><endpoint#> 1620 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#> 1621 <in|out|cntrl<endpoint#stat> 1622 1623 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#>. 1624 <alternate><in|out|cntrl><endpoint#> 1625 /dev/usb/<vid>.<pid>/<N>/cfg<value>if<interface#>. 1626 <alternate><in|out|cntrl><endpoint#>stat 1627 1628 1629 /dev/usb/<vid>.<pid>/<N>/devstat 1630 1631 /dev/usb/<vid>.<pid>/<N>/if<interface#>cntrl0 1632 /dev/usb/<vid>.<pid>/<N>/if<interface#>cntrl0stat 1633 .fi 1634 .in -2 1635 1636 .sp 1637 .LP 1638 where \fIN\fR is an integer representing the instance number of this type of 1639 device. (All logical device names for a single device share the same \fIN\fR.) 1640 .SH ATTRIBUTES 1641 .sp 1642 .LP 1643 See \fBattributes\fR(5) for descriptions of the following attributes: 1644 .sp 1645 1646 .sp 1647 .TS 1648 box; 1649 c | c 1650 l | l . 1651 ATTRIBUTE TYPE ATTRIBUTE VALUE 1652 _ 1653 Architecture PCI-based SPARC 1654 .TE 1655 1656 .SH SEE ALSO 1657 .sp 1658 .LP 1659 \fBlibusb\fR(3LIB), \fBclose\fR(2), \fBpoll\fR(2), \fBread\fR(2), 1660 \fBwrite\fR(2), \fBaioread\fR(3C), \fBaiowrite\fR(3C), \fBusba\fR(7D), 1661 \fBusb_dev_descr\fR(9S). 1662 .SH DIAGNOSTICS 1663 .sp 1664 .LP 1665 In addition to being logged, the following messages may appear on the system 1666 console. All messages are formatted in the following manner: 1667 .sp 1668 .in +2 1669 .nf 1670 Warning: <device path> (ugen<instance num>): Error Message... 1671 .fi 1672 .in -2 1673 .sp 1674 1675 .sp 1676 .ne 2 1677 .na 1678 \fBToo many minor nodes. \fR 1679 .ad 1680 .sp .6 1681 .RS 4n 1682 Device has too many minor nodes. Not all are available. 1683 .RE 1684 1685 .sp 1686 .ne 2 1687 .na 1688 \fBInstance number too high (<\fInumber\fR>).\fR 1689 .ad 1690 .sp .6 1691 .RS 4n 1692 Too many devices are using this driver. 1693 .RE 1694 1695 .sp 1696 .ne 2 1697 .na 1698 \fBCannot access <device>. Please reconnect.\fR 1699 .ad 1700 .sp .6 1701 .RS 4n 1702 This device has been disconnected because a device other than the original one 1703 has been inserted. The driver informs you of this fact by displaying the name 1704 of the original device. 1705 .RE 1706 1707 .sp 1708 .ne 2 1709 .na 1710 \fBDevice is not identical to the previous one on this port. Please disconnect 1711 and reconnect.\fR 1712 .ad 1713 .sp .6 1714 .RS 4n 1715 Same condition as described above; however in this case, the driver is unable 1716 to identify the original device with a name string. 1717 .RE 1718 1719 .SH NOTES 1720 .sp 1721 .LP 1722 \fBugen\fR returns \fB-1\fR for all commands and sets \fBerrno\fR to 1723 \fBENODEV\fR when device has been hot-removed or resumed from a suspend. The 1724 application must close and reopen all open minor nodes to reinstate successful 1725 communication.