Mauro Carvalho Chehab | e463c06 | 2017-04-05 10:23:10 -0300 | [diff] [blame] | 1 | .. _usb-hostside-api: |
| 2 | |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 3 | =========================== |
| 4 | The Linux-USB Host Side API |
| 5 | =========================== |
| 6 | |
| 7 | Introduction to USB on Linux |
| 8 | ============================ |
| 9 | |
| 10 | A Universal Serial Bus (USB) is used to connect a host, such as a PC or |
| 11 | workstation, to a number of peripheral devices. USB uses a tree |
| 12 | structure, with the host as the root (the system's master), hubs as |
| 13 | interior nodes, and peripherals as leaves (and slaves). Modern PCs |
| 14 | support several such trees of USB devices, usually |
| 15 | a few USB 3.0 (5 GBit/s) or USB 3.1 (10 GBit/s) and some legacy |
| 16 | USB 2.0 (480 MBit/s) busses just in case. |
| 17 | |
| 18 | That master/slave asymmetry was designed-in for a number of reasons, one |
| 19 | being ease of use. It is not physically possible to mistake upstream and |
| 20 | downstream or it does not matter with a type C plug (or they are built into the |
| 21 | peripheral). Also, the host software doesn't need to deal with |
| 22 | distributed auto-configuration since the pre-designated master node |
| 23 | manages all that. |
| 24 | |
| 25 | Kernel developers added USB support to Linux early in the 2.2 kernel |
| 26 | series and have been developing it further since then. Besides support |
| 27 | for each new generation of USB, various host controllers gained support, |
| 28 | new drivers for peripherals have been added and advanced features for latency |
| 29 | measurement and improved power management introduced. |
| 30 | |
| 31 | Linux can run inside USB devices as well as on the hosts that control |
| 32 | the devices. But USB device drivers running inside those peripherals |
| 33 | don't do the same things as the ones running inside hosts, so they've |
| 34 | been given a different name: *gadget drivers*. This document does not |
| 35 | cover gadget drivers. |
| 36 | |
| 37 | USB Host-Side API Model |
| 38 | ======================= |
| 39 | |
| 40 | Host-side drivers for USB devices talk to the "usbcore" APIs. There are |
| 41 | two. One is intended for *general-purpose* drivers (exposed through |
| 42 | driver frameworks), and the other is for drivers that are *part of the |
| 43 | core*. Such core drivers include the *hub* driver (which manages trees |
| 44 | of USB devices) and several different kinds of *host controller |
| 45 | drivers*, which control individual busses. |
| 46 | |
| 47 | The device model seen by USB drivers is relatively complex. |
| 48 | |
| 49 | - USB supports four kinds of data transfers (control, bulk, interrupt, |
| 50 | and isochronous). Two of them (control and bulk) use bandwidth as |
| 51 | it's available, while the other two (interrupt and isochronous) are |
| 52 | scheduled to provide guaranteed bandwidth. |
| 53 | |
| 54 | - The device description model includes one or more "configurations" |
| 55 | per device, only one of which is active at a time. Devices are supposed |
| 56 | to be capable of operating at lower than their top |
| 57 | speeds and may provide a BOS descriptor showing the lowest speed they |
| 58 | remain fully operational at. |
| 59 | |
| 60 | - From USB 3.0 on configurations have one or more "functions", which |
| 61 | provide a common functionality and are grouped together for purposes |
| 62 | of power management. |
| 63 | |
| 64 | - Configurations or functions have one or more "interfaces", each of which may have |
| 65 | "alternate settings". Interfaces may be standardized by USB "Class" |
| 66 | specifications, or may be specific to a vendor or device. |
| 67 | |
| 68 | USB device drivers actually bind to interfaces, not devices. Think of |
| 69 | them as "interface drivers", though you may not see many devices |
| 70 | where the distinction is important. *Most USB devices are simple, |
| 71 | with only one function, one configuration, one interface, and one alternate |
| 72 | setting.* |
| 73 | |
| 74 | - Interfaces have one or more "endpoints", each of which supports one |
| 75 | type and direction of data transfer such as "bulk out" or "interrupt |
| 76 | in". The entire configuration may have up to sixteen endpoints in |
| 77 | each direction, allocated as needed among all the interfaces. |
| 78 | |
| 79 | - Data transfer on USB is packetized; each endpoint has a maximum |
| 80 | packet size. Drivers must often be aware of conventions such as |
| 81 | flagging the end of bulk transfers using "short" (including zero |
| 82 | length) packets. |
| 83 | |
| 84 | - The Linux USB API supports synchronous calls for control and bulk |
| 85 | messages. It also supports asynchronous calls for all kinds of data |
| 86 | transfer, using request structures called "URBs" (USB Request |
| 87 | Blocks). |
| 88 | |
| 89 | Accordingly, the USB Core API exposed to device drivers covers quite a |
| 90 | lot of territory. You'll probably need to consult the USB 3.0 |
| 91 | specification, available online from www.usb.org at no cost, as well as |
| 92 | class or device specifications. |
| 93 | |
| 94 | The only host-side drivers that actually touch hardware (reading/writing |
| 95 | registers, handling IRQs, and so on) are the HCDs. In theory, all HCDs |
| 96 | provide the same functionality through the same API. In practice, that's |
| 97 | becoming more true, but there are still differences |
| 98 | that crop up especially with fault handling on the less common controllers. |
| 99 | Different controllers don't |
| 100 | necessarily report the same aspects of failures, and recovery from |
| 101 | faults (including software-induced ones like unlinking an URB) isn't yet |
| 102 | fully consistent. Device driver authors should make a point of doing |
| 103 | disconnect testing (while the device is active) with each different host |
| 104 | controller driver, to make sure drivers don't have bugs of their own as |
| 105 | well as to make sure they aren't relying on some HCD-specific behavior. |
| 106 | |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 107 | .. _usb_chapter9: |
| 108 | |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 109 | USB-Standard Types |
| 110 | ================== |
| 111 | |
| 112 | In ``<linux/usb/ch9.h>`` you will find the USB data types defined in |
| 113 | chapter 9 of the USB specification. These data types are used throughout |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 114 | USB, and in APIs including this host side API, gadget APIs, usb character |
| 115 | devices and debugfs interfaces. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 116 | |
| 117 | .. kernel-doc:: include/linux/usb/ch9.h |
| 118 | :internal: |
| 119 | |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 120 | .. _usb_header: |
| 121 | |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 122 | Host-Side Data Types and Macros |
| 123 | =============================== |
| 124 | |
| 125 | The host side API exposes several layers to drivers, some of which are |
| 126 | more necessary than others. These support lifecycle models for host side |
| 127 | drivers and devices, and support passing buffers through usbcore to some |
| 128 | HCD that performs the I/O for the device driver. |
| 129 | |
| 130 | .. kernel-doc:: include/linux/usb.h |
| 131 | :internal: |
| 132 | |
| 133 | USB Core APIs |
| 134 | ============= |
| 135 | |
| 136 | There are two basic I/O models in the USB API. The most elemental one is |
| 137 | asynchronous: drivers submit requests in the form of an URB, and the |
| 138 | URB's completion callback handles the next step. All USB transfer types |
| 139 | support that model, although there are special cases for control URBs |
| 140 | (which always have setup and status stages, but may not have a data |
| 141 | stage) and isochronous URBs (which allow large packets and include |
| 142 | per-packet fault reports). Built on top of that is synchronous API |
| 143 | support, where a driver calls a routine that allocates one or more URBs, |
| 144 | submits them, and waits until they complete. There are synchronous |
| 145 | wrappers for single-buffer control and bulk transfers (which are awkward |
| 146 | to use in some driver disconnect scenarios), and for scatterlist based |
| 147 | streaming i/o (bulk or interrupt). |
| 148 | |
| 149 | USB drivers need to provide buffers that can be used for DMA, although |
| 150 | they don't necessarily need to provide the DMA mapping themselves. There |
| 151 | are APIs to use used when allocating DMA buffers, which can prevent use |
| 152 | of bounce buffers on some systems. In some cases, drivers may be able to |
| 153 | rely on 64bit DMA to eliminate another kind of bounce buffer. |
| 154 | |
| 155 | .. kernel-doc:: drivers/usb/core/urb.c |
| 156 | :export: |
| 157 | |
| 158 | .. kernel-doc:: drivers/usb/core/message.c |
| 159 | :export: |
| 160 | |
| 161 | .. kernel-doc:: drivers/usb/core/file.c |
| 162 | :export: |
| 163 | |
| 164 | .. kernel-doc:: drivers/usb/core/driver.c |
| 165 | :export: |
| 166 | |
| 167 | .. kernel-doc:: drivers/usb/core/usb.c |
| 168 | :export: |
| 169 | |
| 170 | .. kernel-doc:: drivers/usb/core/hub.c |
| 171 | :export: |
| 172 | |
| 173 | Host Controller APIs |
| 174 | ==================== |
| 175 | |
| 176 | These APIs are only for use by host controller drivers, most of which |
| 177 | implement standard register interfaces such as XHCI, EHCI, OHCI, or UHCI. UHCI |
| 178 | was one of the first interfaces, designed by Intel and also used by VIA; |
| 179 | it doesn't do much in hardware. OHCI was designed later, to have the |
| 180 | hardware do more work (bigger transfers, tracking protocol state, and so |
| 181 | on). EHCI was designed with USB 2.0; its design has features that |
| 182 | resemble OHCI (hardware does much more work) as well as UHCI (some parts |
| 183 | of ISO support, TD list processing). XHCI was designed with USB 3.0. It |
| 184 | continues to shift support for functionality into hardware. |
| 185 | |
| 186 | There are host controllers other than the "big three", although most PCI |
| 187 | based controllers (and a few non-PCI based ones) use one of those |
| 188 | interfaces. Not all host controllers use DMA; some use PIO, and there is |
| 189 | also a simulator and a virtual host controller to pipe USB over the network. |
| 190 | |
| 191 | The same basic APIs are available to drivers for all those controllers. |
| 192 | For historical reasons they are in two layers: :c:type:`struct |
| 193 | usb_bus <usb_bus>` is a rather thin layer that became available |
| 194 | in the 2.2 kernels, while :c:type:`struct usb_hcd <usb_hcd>` |
| 195 | is a more featureful layer |
| 196 | that lets HCDs share common code, to shrink driver size and |
| 197 | significantly reduce hcd-specific behaviors. |
| 198 | |
| 199 | .. kernel-doc:: drivers/usb/core/hcd.c |
| 200 | :export: |
| 201 | |
| 202 | .. kernel-doc:: drivers/usb/core/hcd-pci.c |
| 203 | :export: |
| 204 | |
| 205 | .. kernel-doc:: drivers/usb/core/buffer.c |
| 206 | :internal: |
| 207 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 208 | The USB character device nodes |
| 209 | ============================== |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 210 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 211 | This chapter presents the Linux character device nodes. You may prefer |
| 212 | to avoid writing new kernel code for your USB driver. User mode device |
| 213 | drivers are usually packaged as applications or libraries, and may use |
| 214 | character devices through some programming library that wraps it. |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 215 | Such libraries include: |
| 216 | |
| 217 | - `libusb <http://libusb.sourceforge.net>`__ for C/C++, and |
| 218 | - `jUSB <http://jUSB.sourceforge.net>`__ for Java. |
| 219 | |
| 220 | Some old information about it can be seen at the "USB Device Filesystem" |
| 221 | section of the USB Guide. The latest copy of the USB Guide can be found |
| 222 | at http://www.linux-usb.org/ |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 223 | |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 224 | .. note:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 225 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 226 | - They were used to be implemented via *usbfs*, but this is not part of |
| 227 | the sysfs debug interface. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 228 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 229 | - This particular documentation is incomplete, especially with respect |
| 230 | to the asynchronous mode. As of kernel 2.5.66 the code and this |
| 231 | (new) documentation need to be cross-reviewed. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 232 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 233 | What files are in "devtmpfs"? |
| 234 | ----------------------------- |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 235 | |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 236 | Conventionally mounted at ``/dev/bus/usb/``, usbfs features include: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 237 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 238 | - ``/dev/bus/usb/BBB/DDD`` ... magic files exposing the each device's |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 239 | configuration descriptors, and supporting a series of ioctls for |
| 240 | making device requests, including I/O to devices. (Purely for access |
| 241 | by programs.) |
| 242 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 243 | Each bus is given a number (``BBB``) based on when it was enumerated; within |
| 244 | each bus, each device is given a similar number (``DDD``). Those ``BBB/DDD`` |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 245 | paths are not "stable" identifiers; expect them to change even if you |
| 246 | always leave the devices plugged in to the same hub port. *Don't even |
| 247 | think of saving these in application configuration files.* Stable |
| 248 | identifiers are available, for user mode applications that want to use |
| 249 | them. HID and networking devices expose these stable IDs, so that for |
| 250 | example you can be sure that you told the right UPS to power down its |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 251 | second server. Pleast note that it doesn't (yet) expose those IDs. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 252 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 253 | /dev/bus/usb/BBB/DDD |
| 254 | -------------------- |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 255 | |
| 256 | Use these files in one of these basic ways: |
| 257 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 258 | - *They can be read,* producing first the device descriptor (18 bytes) and |
| 259 | then the descriptors for the current configuration. See the USB 2.0 spec |
| 260 | for details about those binary data formats. You'll need to convert most |
| 261 | multibyte values from little endian format to your native host byte |
| 262 | order, although a few of the fields in the device descriptor (both of |
| 263 | the BCD-encoded fields, and the vendor and product IDs) will be |
| 264 | byteswapped for you. Note that configuration descriptors include |
| 265 | descriptors for interfaces, altsettings, endpoints, and maybe additional |
| 266 | class descriptors. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 267 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 268 | - *Perform USB operations* using *ioctl()* requests to make endpoint I/O |
| 269 | requests (synchronously or asynchronously) or manage the device. These |
| 270 | requests need the ``CAP_SYS_RAWIO`` capability, as well as filesystem |
| 271 | access permissions. Only one ioctl request can be made on one of these |
| 272 | device files at a time. This means that if you are synchronously reading |
| 273 | an endpoint from one thread, you won't be able to write to a different |
| 274 | endpoint from another thread until the read completes. This works for |
| 275 | *half duplex* protocols, but otherwise you'd use asynchronous i/o |
| 276 | requests. |
| 277 | |
| 278 | Each connected USB device has one file. The ``BBB`` indicates the bus |
| 279 | number. The ``DDD`` indicates the device address on that bus. Both |
| 280 | of these numbers are assigned sequentially, and can be reused, so |
| 281 | you can't rely on them for stable access to devices. For example, |
| 282 | it's relatively common for devices to re-enumerate while they are |
| 283 | still connected (perhaps someone jostled their power supply, hub, |
| 284 | or USB cable), so a device might be ``002/027`` when you first connect |
| 285 | it and ``002/048`` sometime later. |
| 286 | |
| 287 | These files can be read as binary data. The binary data consists |
| 288 | of first the device descriptor, then the descriptors for each |
| 289 | configuration of the device. Multi-byte fields in the device descriptor |
| 290 | are converted to host endianness by the kernel. The configuration |
| 291 | descriptors are in bus endian format! The configuration descriptor |
| 292 | are wTotalLength bytes apart. If a device returns less configuration |
| 293 | descriptor data than indicated by wTotalLength there will be a hole in |
| 294 | the file for the missing bytes. This information is also shown |
| 295 | in text form by the ``/sys/kernel/debug/usb/devices`` file, described later. |
| 296 | |
| 297 | These files may also be used to write user-level drivers for the USB |
| 298 | devices. You would open the ``/dev/bus/usb/BBB/DDD`` file read/write, |
| 299 | read its descriptors to make sure it's the device you expect, and then |
| 300 | bind to an interface (or perhaps several) using an ioctl call. You |
| 301 | would issue more ioctls to the device to communicate to it using |
| 302 | control, bulk, or other kinds of USB transfers. The IOCTLs are |
| 303 | listed in the ``<linux/usbdevice_fs.h>`` file, and at this writing the |
| 304 | source code (``linux/drivers/usb/core/devio.c``) is the primary reference |
| 305 | for how to access devices through those files. |
| 306 | |
| 307 | Note that since by default these ``BBB/DDD`` files are writable only by |
| 308 | root, only root can write such user mode drivers. You can selectively |
| 309 | grant read/write permissions to other users by using ``chmod``. Also, |
| 310 | usbfs mount options such as ``devmode=0666`` may be helpful. |
| 311 | |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 312 | |
| 313 | Life Cycle of User Mode Drivers |
| 314 | ------------------------------- |
| 315 | |
| 316 | Such a driver first needs to find a device file for a device it knows |
| 317 | how to handle. Maybe it was told about it because a ``/sbin/hotplug`` |
| 318 | event handling agent chose that driver to handle the new device. Or |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 319 | maybe it's an application that scans all the ``/dev/bus/usb`` device files, |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 320 | and ignores most devices. In either case, it should :c:func:`read()` |
| 321 | all the descriptors from the device file, and check them against what it |
| 322 | knows how to handle. It might just reject everything except a particular |
| 323 | vendor and product ID, or need a more complex policy. |
| 324 | |
| 325 | Never assume there will only be one such device on the system at a time! |
| 326 | If your code can't handle more than one device at a time, at least |
| 327 | detect when there's more than one, and have your users choose which |
| 328 | device to use. |
| 329 | |
| 330 | Once your user mode driver knows what device to use, it interacts with |
| 331 | it in either of two styles. The simple style is to make only control |
| 332 | requests; some devices don't need more complex interactions than those. |
| 333 | (An example might be software using vendor-specific control requests for |
| 334 | some initialization or configuration tasks, with a kernel driver for the |
| 335 | rest.) |
| 336 | |
| 337 | More likely, you need a more complex style driver: one using non-control |
| 338 | endpoints, reading or writing data and claiming exclusive use of an |
| 339 | interface. *Bulk* transfers are easiest to use, but only their sibling |
| 340 | *interrupt* transfers work with low speed devices. Both interrupt and |
| 341 | *isochronous* transfers offer service guarantees because their bandwidth |
| 342 | is reserved. Such "periodic" transfers are awkward to use through usbfs, |
| 343 | unless you're using the asynchronous calls. However, interrupt transfers |
| 344 | can also be used in a synchronous "one shot" style. |
| 345 | |
| 346 | Your user-mode driver should never need to worry about cleaning up |
| 347 | request state when the device is disconnected, although it should close |
| 348 | its open file descriptors as soon as it starts seeing the ENODEV errors. |
| 349 | |
| 350 | The ioctl() Requests |
| 351 | -------------------- |
| 352 | |
| 353 | To use these ioctls, you need to include the following headers in your |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 354 | userspace program:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 355 | |
| 356 | #include <linux/usb.h> |
| 357 | #include <linux/usbdevice_fs.h> |
| 358 | #include <asm/byteorder.h> |
| 359 | |
| 360 | The standard USB device model requests, from "Chapter 9" of the USB 2.0 |
| 361 | specification, are automatically included from the ``<linux/usb/ch9.h>`` |
| 362 | header. |
| 363 | |
| 364 | Unless noted otherwise, the ioctl requests described here will update |
| 365 | the modification time on the usbfs file to which they are applied |
| 366 | (unless they fail). A return of zero indicates success; otherwise, a |
Mauro Carvalho Chehab | e1c3e6e | 2017-04-05 10:23:15 -0300 | [diff] [blame] | 367 | standard USB error code is returned (These are documented in |
| 368 | :ref:`usb-error-codes`). |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 369 | |
| 370 | Each of these files multiplexes access to several I/O streams, one per |
| 371 | endpoint. Each device has one control endpoint (endpoint zero) which |
| 372 | supports a limited RPC style RPC access. Devices are configured by |
| 373 | hub_wq (in the kernel) setting a device-wide *configuration* that |
| 374 | affects things like power consumption and basic functionality. The |
| 375 | endpoints are part of USB *interfaces*, which may have *altsettings* |
| 376 | affecting things like which endpoints are available. Many devices only |
| 377 | have a single configuration and interface, so drivers for them will |
| 378 | ignore configurations and altsettings. |
| 379 | |
| 380 | Management/Status Requests |
| 381 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 382 | |
| 383 | A number of usbfs requests don't deal very directly with device I/O. |
| 384 | They mostly relate to device management and status. These are all |
| 385 | synchronous requests. |
| 386 | |
| 387 | USBDEVFS_CLAIMINTERFACE |
| 388 | This is used to force usbfs to claim a specific interface, which has |
| 389 | not previously been claimed by usbfs or any other kernel driver. The |
| 390 | ioctl parameter is an integer holding the number of the interface |
| 391 | (bInterfaceNumber from descriptor). |
| 392 | |
| 393 | Note that if your driver doesn't claim an interface before trying to |
| 394 | use one of its endpoints, and no other driver has bound to it, then |
| 395 | the interface is automatically claimed by usbfs. |
| 396 | |
| 397 | This claim will be released by a RELEASEINTERFACE ioctl, or by |
| 398 | closing the file descriptor. File modification time is not updated |
| 399 | by this request. |
| 400 | |
| 401 | USBDEVFS_CONNECTINFO |
| 402 | Says whether the device is lowspeed. The ioctl parameter points to a |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 403 | structure like this:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 404 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 405 | struct usbdevfs_connectinfo { |
| 406 | unsigned int devnum; |
| 407 | unsigned char slow; |
| 408 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 409 | |
| 410 | File modification time is not updated by this request. |
| 411 | |
| 412 | *You can't tell whether a "not slow" device is connected at high |
| 413 | speed (480 MBit/sec) or just full speed (12 MBit/sec).* You should |
| 414 | know the devnum value already, it's the DDD value of the device file |
| 415 | name. |
| 416 | |
| 417 | USBDEVFS_GETDRIVER |
| 418 | Returns the name of the kernel driver bound to a given interface (a |
| 419 | string). Parameter is a pointer to this structure, which is |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 420 | modified:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 421 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 422 | struct usbdevfs_getdriver { |
| 423 | unsigned int interface; |
| 424 | char driver[USBDEVFS_MAXDRIVERNAME + 1]; |
| 425 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 426 | |
| 427 | File modification time is not updated by this request. |
| 428 | |
| 429 | USBDEVFS_IOCTL |
| 430 | Passes a request from userspace through to a kernel driver that has |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 431 | an ioctl entry in the *struct usb_driver* it registered:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 432 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 433 | struct usbdevfs_ioctl { |
| 434 | int ifno; |
| 435 | int ioctl_code; |
| 436 | void *data; |
| 437 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 438 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 439 | /* user mode call looks like this. |
| 440 | * 'request' becomes the driver->ioctl() 'code' parameter. |
| 441 | * the size of 'param' is encoded in 'request', and that data |
| 442 | * is copied to or from the driver->ioctl() 'buf' parameter. |
| 443 | */ |
| 444 | static int |
| 445 | usbdev_ioctl (int fd, int ifno, unsigned request, void *param) |
| 446 | { |
| 447 | struct usbdevfs_ioctl wrapper; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 448 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 449 | wrapper.ifno = ifno; |
| 450 | wrapper.ioctl_code = request; |
| 451 | wrapper.data = param; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 452 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 453 | return ioctl (fd, USBDEVFS_IOCTL, &wrapper); |
| 454 | } |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 455 | |
| 456 | File modification time is not updated by this request. |
| 457 | |
| 458 | This request lets kernel drivers talk to user mode code through |
| 459 | filesystem operations even when they don't create a character or |
| 460 | block special device. It's also been used to do things like ask |
| 461 | devices what device special file should be used. Two pre-defined |
| 462 | ioctls are used to disconnect and reconnect kernel drivers, so that |
| 463 | user mode code can completely manage binding and configuration of |
| 464 | devices. |
| 465 | |
| 466 | USBDEVFS_RELEASEINTERFACE |
| 467 | This is used to release the claim usbfs made on interface, either |
| 468 | implicitly or because of a USBDEVFS_CLAIMINTERFACE call, before the |
| 469 | file descriptor is closed. The ioctl parameter is an integer holding |
| 470 | the number of the interface (bInterfaceNumber from descriptor); File |
| 471 | modification time is not updated by this request. |
| 472 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 473 | .. warning:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 474 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 475 | *No security check is made to ensure that the task which made |
| 476 | the claim is the one which is releasing it. This means that user |
| 477 | mode driver may interfere other ones.* |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 478 | |
| 479 | USBDEVFS_RESETEP |
| 480 | Resets the data toggle value for an endpoint (bulk or interrupt) to |
| 481 | DATA0. The ioctl parameter is an integer endpoint number (1 to 15, |
| 482 | as identified in the endpoint descriptor), with USB_DIR_IN added |
| 483 | if the device's endpoint sends data to the host. |
| 484 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 485 | .. Warning:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 486 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 487 | *Avoid using this request. It should probably be removed.* Using |
| 488 | it typically means the device and driver will lose toggle |
| 489 | synchronization. If you really lost synchronization, you likely |
| 490 | need to completely handshake with the device, using a request |
| 491 | like CLEAR_HALT or SET_INTERFACE. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 492 | |
| 493 | USBDEVFS_DROP_PRIVILEGES |
| 494 | This is used to relinquish the ability to do certain operations |
| 495 | which are considered to be privileged on a usbfs file descriptor. |
| 496 | This includes claiming arbitrary interfaces, resetting a device on |
| 497 | which there are currently claimed interfaces from other users, and |
| 498 | issuing USBDEVFS_IOCTL calls. The ioctl parameter is a 32 bit mask |
| 499 | of interfaces the user is allowed to claim on this file descriptor. |
| 500 | You may issue this ioctl more than one time to narrow said mask. |
| 501 | |
| 502 | Synchronous I/O Support |
| 503 | ~~~~~~~~~~~~~~~~~~~~~~~ |
| 504 | |
| 505 | Synchronous requests involve the kernel blocking until the user mode |
| 506 | request completes, either by finishing successfully or by reporting an |
| 507 | error. In most cases this is the simplest way to use usbfs, although as |
| 508 | noted above it does prevent performing I/O to more than one endpoint at |
| 509 | a time. |
| 510 | |
| 511 | USBDEVFS_BULK |
| 512 | Issues a bulk read or write request to the device. The ioctl |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 513 | parameter is a pointer to this structure:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 514 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 515 | struct usbdevfs_bulktransfer { |
| 516 | unsigned int ep; |
| 517 | unsigned int len; |
| 518 | unsigned int timeout; /* in milliseconds */ |
| 519 | void *data; |
| 520 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 521 | |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 522 | The ``ep`` value identifies a bulk endpoint number (1 to 15, as |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 523 | identified in an endpoint descriptor), masked with USB_DIR_IN when |
| 524 | referring to an endpoint which sends data to the host from the |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 525 | device. The length of the data buffer is identified by ``len``; Recent |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 526 | kernels support requests up to about 128KBytes. *FIXME say how read |
| 527 | length is returned, and how short reads are handled.*. |
| 528 | |
| 529 | USBDEVFS_CLEAR_HALT |
| 530 | Clears endpoint halt (stall) and resets the endpoint toggle. This is |
| 531 | only meaningful for bulk or interrupt endpoints. The ioctl parameter |
| 532 | is an integer endpoint number (1 to 15, as identified in an endpoint |
| 533 | descriptor), masked with USB_DIR_IN when referring to an endpoint |
| 534 | which sends data to the host from the device. |
| 535 | |
| 536 | Use this on bulk or interrupt endpoints which have stalled, |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 537 | returning ``-EPIPE`` status to a data transfer request. Do not issue |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 538 | the control request directly, since that could invalidate the host's |
| 539 | record of the data toggle. |
| 540 | |
| 541 | USBDEVFS_CONTROL |
| 542 | Issues a control request to the device. The ioctl parameter points |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 543 | to a structure like this:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 544 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 545 | struct usbdevfs_ctrltransfer { |
| 546 | __u8 bRequestType; |
| 547 | __u8 bRequest; |
| 548 | __u16 wValue; |
| 549 | __u16 wIndex; |
| 550 | __u16 wLength; |
| 551 | __u32 timeout; /* in milliseconds */ |
| 552 | void *data; |
| 553 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 554 | |
| 555 | The first eight bytes of this structure are the contents of the |
| 556 | SETUP packet to be sent to the device; see the USB 2.0 specification |
| 557 | for details. The bRequestType value is composed by combining a |
Mauro Carvalho Chehab | 69966c9 | 2017-04-05 10:23:11 -0300 | [diff] [blame] | 558 | ``USB_TYPE_*`` value, a ``USB_DIR_*`` value, and a ``USB_RECIP_*`` |
| 559 | value (from ``linux/usb.h``). If wLength is nonzero, it describes |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 560 | the length of the data buffer, which is either written to the device |
| 561 | (USB_DIR_OUT) or read from the device (USB_DIR_IN). |
| 562 | |
| 563 | At this writing, you can't transfer more than 4 KBytes of data to or |
| 564 | from a device; usbfs has a limit, and some host controller drivers |
| 565 | have a limit. (That's not usually a problem.) *Also* there's no way |
| 566 | to say it's not OK to get a short read back from the device. |
| 567 | |
| 568 | USBDEVFS_RESET |
| 569 | Does a USB level device reset. The ioctl parameter is ignored. After |
| 570 | the reset, this rebinds all device interfaces. File modification |
| 571 | time is not updated by this request. |
| 572 | |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 573 | .. warning:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 574 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 575 | *Avoid using this call* until some usbcore bugs get fixed, since |
| 576 | it does not fully synchronize device, interface, and driver (not |
| 577 | just usbfs) state. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 578 | |
| 579 | USBDEVFS_SETINTERFACE |
| 580 | Sets the alternate setting for an interface. The ioctl parameter is |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 581 | a pointer to a structure like this:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 582 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 583 | struct usbdevfs_setinterface { |
| 584 | unsigned int interface; |
| 585 | unsigned int altsetting; |
| 586 | }; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 587 | |
| 588 | File modification time is not updated by this request. |
| 589 | |
| 590 | Those struct members are from some interface descriptor applying to |
| 591 | the current configuration. The interface number is the |
| 592 | bInterfaceNumber value, and the altsetting number is the |
| 593 | bAlternateSetting value. (This resets each endpoint in the |
| 594 | interface.) |
| 595 | |
| 596 | USBDEVFS_SETCONFIGURATION |
| 597 | Issues the :c:func:`usb_set_configuration()` call for the |
| 598 | device. The parameter is an integer holding the number of a |
| 599 | configuration (bConfigurationValue from descriptor). File |
| 600 | modification time is not updated by this request. |
| 601 | |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 602 | .. warning:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 603 | |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 604 | *Avoid using this call* until some usbcore bugs get fixed, since |
| 605 | it does not fully synchronize device, interface, and driver (not |
| 606 | just usbfs) state. |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 607 | |
| 608 | Asynchronous I/O Support |
| 609 | ~~~~~~~~~~~~~~~~~~~~~~~~ |
| 610 | |
| 611 | As mentioned above, there are situations where it may be important to |
| 612 | initiate concurrent operations from user mode code. This is particularly |
| 613 | important for periodic transfers (interrupt and isochronous), but it can |
| 614 | be used for other kinds of USB requests too. In such cases, the |
| 615 | asynchronous requests described here are essential. Rather than |
| 616 | submitting one request and having the kernel block until it completes, |
| 617 | the blocking is separate. |
| 618 | |
| 619 | These requests are packaged into a structure that resembles the URB used |
| 620 | by kernel device drivers. (No POSIX Async I/O support here, sorry.) It |
Mauro Carvalho Chehab | 69966c9 | 2017-04-05 10:23:11 -0300 | [diff] [blame] | 621 | identifies the endpoint type (``USBDEVFS_URB_TYPE_*``), endpoint |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 622 | (number, masked with USB_DIR_IN as appropriate), buffer and length, |
| 623 | and a user "context" value serving to uniquely identify each request. |
| 624 | (It's usually a pointer to per-request data.) Flags can modify requests |
| 625 | (not as many as supported for kernel drivers). |
| 626 | |
| 627 | Each request can specify a realtime signal number (between SIGRTMIN and |
| 628 | SIGRTMAX, inclusive) to request a signal be sent when the request |
| 629 | completes. |
| 630 | |
| 631 | When usbfs returns these urbs, the status value is updated, and the |
| 632 | buffer may have been modified. Except for isochronous transfers, the |
| 633 | actual_length is updated to say how many bytes were transferred; if the |
| 634 | USBDEVFS_URB_DISABLE_SPD flag is set ("short packets are not OK"), if |
Mauro Carvalho Chehab | 9a3c8b3 | 2017-04-05 10:22:58 -0300 | [diff] [blame] | 635 | fewer bytes were read than were requested then you get an error report:: |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 636 | |
| 637 | struct usbdevfs_iso_packet_desc { |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 638 | unsigned int length; |
| 639 | unsigned int actual_length; |
| 640 | unsigned int status; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 641 | }; |
| 642 | |
| 643 | struct usbdevfs_urb { |
Mauro Carvalho Chehab | 4ad4b21 | 2017-04-05 10:22:57 -0300 | [diff] [blame] | 644 | unsigned char type; |
| 645 | unsigned char endpoint; |
| 646 | int status; |
| 647 | unsigned int flags; |
| 648 | void *buffer; |
| 649 | int buffer_length; |
| 650 | int actual_length; |
| 651 | int start_frame; |
| 652 | int number_of_packets; |
| 653 | int error_count; |
| 654 | unsigned int signr; |
| 655 | void *usercontext; |
| 656 | struct usbdevfs_iso_packet_desc iso_frame_desc[]; |
Oliver Neukum | dd0b38d | 2016-11-14 15:52:43 +0100 | [diff] [blame] | 657 | }; |
| 658 | |
| 659 | For these asynchronous requests, the file modification time reflects |
| 660 | when the request was initiated. This contrasts with their use with the |
| 661 | synchronous requests, where it reflects when requests complete. |
| 662 | |
| 663 | USBDEVFS_DISCARDURB |
| 664 | *TBS* File modification time is not updated by this request. |
| 665 | |
| 666 | USBDEVFS_DISCSIGNAL |
| 667 | *TBS* File modification time is not updated by this request. |
| 668 | |
| 669 | USBDEVFS_REAPURB |
| 670 | *TBS* File modification time is not updated by this request. |
| 671 | |
| 672 | USBDEVFS_REAPURBNDELAY |
| 673 | *TBS* File modification time is not updated by this request. |
| 674 | |
| 675 | USBDEVFS_SUBMITURB |
| 676 | *TBS* |
Mauro Carvalho Chehab | 8a6a285 | 2017-04-16 21:51:06 -0300 | [diff] [blame] | 677 | |
| 678 | The USB devices |
| 679 | =============== |
| 680 | |
| 681 | The USB devices are now exported via debugfs: |
| 682 | |
| 683 | - ``/sys/kernel/debug/usb/devices`` ... a text file showing each of the USB |
| 684 | devices on known to the kernel, and their configuration descriptors. |
| 685 | You can also poll() this to learn about new devices. |
| 686 | |
| 687 | /sys/kernel/debug/usb/devices |
| 688 | ----------------------------- |
| 689 | |
| 690 | This file is handy for status viewing tools in user mode, which can scan |
| 691 | the text format and ignore most of it. More detailed device status |
| 692 | (including class and vendor status) is available from device-specific |
| 693 | files. For information about the current format of this file, see the |
| 694 | ``Documentation/usb/proc_usb_info.txt`` file in your Linux kernel |
| 695 | sources. |
| 696 | |
| 697 | This file, in combination with the poll() system call, can also be used |
| 698 | to detect when devices are added or removed:: |
| 699 | |
| 700 | int fd; |
| 701 | struct pollfd pfd; |
| 702 | |
| 703 | fd = open("/sys/kernel/debug/usb/devices", O_RDONLY); |
| 704 | pfd = { fd, POLLIN, 0 }; |
| 705 | for (;;) { |
| 706 | /* The first time through, this call will return immediately. */ |
| 707 | poll(&pfd, 1, -1); |
| 708 | |
| 709 | /* To see what's changed, compare the file's previous and current |
| 710 | contents or scan the filesystem. (Scanning is more precise.) */ |
| 711 | } |
| 712 | |
| 713 | Note that this behavior is intended to be used for informational and |
| 714 | debug purposes. It would be more appropriate to use programs such as |
| 715 | udev or HAL to initialize a device or start a user-mode helper program, |
| 716 | for instance. |
Mauro Carvalho Chehab | 96801b3 | 2017-04-16 21:51:09 -0300 | [diff] [blame^] | 717 | |
| 718 | In this file, each device's output has multiple lines of ASCII output. |
| 719 | |
| 720 | I made it ASCII instead of binary on purpose, so that someone |
| 721 | can obtain some useful data from it without the use of an |
| 722 | auxiliary program. However, with an auxiliary program, the numbers |
| 723 | in the first 4 columns of each ``T:`` line (topology info: |
| 724 | Lev, Prnt, Port, Cnt) can be used to build a USB topology diagram. |
| 725 | |
| 726 | Each line is tagged with a one-character ID for that line:: |
| 727 | |
| 728 | T = Topology (etc.) |
| 729 | B = Bandwidth (applies only to USB host controllers, which are |
| 730 | virtualized as root hubs) |
| 731 | D = Device descriptor info. |
| 732 | P = Product ID info. (from Device descriptor, but they won't fit |
| 733 | together on one line) |
| 734 | S = String descriptors. |
| 735 | C = Configuration descriptor info. (* = active configuration) |
| 736 | I = Interface descriptor info. |
| 737 | E = Endpoint descriptor info. |
| 738 | |
| 739 | /sys/kernel/debug/usb/devices output format |
| 740 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 741 | |
| 742 | Legend:: |
| 743 | d = decimal number (may have leading spaces or 0's) |
| 744 | x = hexadecimal number (may have leading spaces or 0's) |
| 745 | s = string |
| 746 | |
| 747 | |
| 748 | |
| 749 | Topology info |
| 750 | ^^^^^^^^^^^^^ |
| 751 | |
| 752 | :: |
| 753 | |
| 754 | T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd |
| 755 | | | | | | | | | |__MaxChildren |
| 756 | | | | | | | | |__Device Speed in Mbps |
| 757 | | | | | | | |__DeviceNumber |
| 758 | | | | | | |__Count of devices at this level |
| 759 | | | | | |__Connector/Port on Parent for this device |
| 760 | | | | |__Parent DeviceNumber |
| 761 | | | |__Level in topology for this bus |
| 762 | | |__Bus number |
| 763 | |__Topology info tag |
| 764 | |
| 765 | Speed may be: |
| 766 | |
| 767 | ======= ====================================================== |
| 768 | 1.5 Mbit/s for low speed USB |
| 769 | 12 Mbit/s for full speed USB |
| 770 | 480 Mbit/s for high speed USB (added for USB 2.0); |
| 771 | also used for Wireless USB, which has no fixed speed |
| 772 | 5000 Mbit/s for SuperSpeed USB (added for USB 3.0) |
| 773 | ======= ====================================================== |
| 774 | |
| 775 | For reasons lost in the mists of time, the Port number is always |
| 776 | too low by 1. For example, a device plugged into port 4 will |
| 777 | show up with ``Port=03``. |
| 778 | |
| 779 | Bandwidth info |
| 780 | ^^^^^^^^^^^^^^ |
| 781 | |
| 782 | :: |
| 783 | |
| 784 | B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd |
| 785 | | | | |__Number of isochronous requests |
| 786 | | | |__Number of interrupt requests |
| 787 | | |__Total Bandwidth allocated to this bus |
| 788 | |__Bandwidth info tag |
| 789 | |
| 790 | Bandwidth allocation is an approximation of how much of one frame |
| 791 | (millisecond) is in use. It reflects only periodic transfers, which |
| 792 | are the only transfers that reserve bandwidth. Control and bulk |
| 793 | transfers use all other bandwidth, including reserved bandwidth that |
| 794 | is not used for transfers (such as for short packets). |
| 795 | |
| 796 | The percentage is how much of the "reserved" bandwidth is scheduled by |
| 797 | those transfers. For a low or full speed bus (loosely, "USB 1.1"), |
| 798 | 90% of the bus bandwidth is reserved. For a high speed bus (loosely, |
| 799 | "USB 2.0") 80% is reserved. |
| 800 | |
| 801 | |
| 802 | Device descriptor info & Product ID info |
| 803 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 804 | |
| 805 | :: |
| 806 | |
| 807 | D: Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd |
| 808 | P: Vendor=xxxx ProdID=xxxx Rev=xx.xx |
| 809 | |
| 810 | where:: |
| 811 | |
| 812 | D: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd |
| 813 | | | | | | | |__NumberConfigurations |
| 814 | | | | | | |__MaxPacketSize of Default Endpoint |
| 815 | | | | | |__DeviceProtocol |
| 816 | | | | |__DeviceSubClass |
| 817 | | | |__DeviceClass |
| 818 | | |__Device USB version |
| 819 | |__Device info tag #1 |
| 820 | |
| 821 | where:: |
| 822 | |
| 823 | P: Vendor=xxxx ProdID=xxxx Rev=xx.xx |
| 824 | | | | |__Product revision number |
| 825 | | | |__Product ID code |
| 826 | | |__Vendor ID code |
| 827 | |__Device info tag #2 |
| 828 | |
| 829 | |
| 830 | String descriptor info |
| 831 | ^^^^^^^^^^^^^^^^^^^^^^ |
| 832 | :: |
| 833 | |
| 834 | S: Manufacturer=ssss |
| 835 | | |__Manufacturer of this device as read from the device. |
| 836 | | For USB host controller drivers (virtual root hubs) this may |
| 837 | | be omitted, or (for newer drivers) will identify the kernel |
| 838 | | version and the driver which provides this hub emulation. |
| 839 | |__String info tag |
| 840 | |
| 841 | S: Product=ssss |
| 842 | | |__Product description of this device as read from the device. |
| 843 | | For older USB host controller drivers (virtual root hubs) this |
| 844 | | indicates the driver; for newer ones, it's a product (and vendor) |
| 845 | | description that often comes from the kernel's PCI ID database. |
| 846 | |__String info tag |
| 847 | |
| 848 | S: SerialNumber=ssss |
| 849 | | |__Serial Number of this device as read from the device. |
| 850 | | For USB host controller drivers (virtual root hubs) this is |
| 851 | | some unique ID, normally a bus ID (address or slot name) that |
| 852 | | can't be shared with any other device. |
| 853 | |__String info tag |
| 854 | |
| 855 | |
| 856 | |
| 857 | Configuration descriptor info |
| 858 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 859 | :: |
| 860 | |
| 861 | C:* #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA |
| 862 | | | | | | |__MaxPower in mA |
| 863 | | | | | |__Attributes |
| 864 | | | | |__ConfiguratioNumber |
| 865 | | | |__NumberOfInterfaces |
| 866 | | |__ "*" indicates the active configuration (others are " ") |
| 867 | |__Config info tag |
| 868 | |
| 869 | USB devices may have multiple configurations, each of which act |
| 870 | rather differently. For example, a bus-powered configuration |
| 871 | might be much less capable than one that is self-powered. Only |
| 872 | one device configuration can be active at a time; most devices |
| 873 | have only one configuration. |
| 874 | |
| 875 | Each configuration consists of one or more interfaces. Each |
| 876 | interface serves a distinct "function", which is typically bound |
| 877 | to a different USB device driver. One common example is a USB |
| 878 | speaker with an audio interface for playback, and a HID interface |
| 879 | for use with software volume control. |
| 880 | |
| 881 | Interface descriptor info (can be multiple per Config) |
| 882 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 883 | :: |
| 884 | |
| 885 | I:* If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss |
| 886 | | | | | | | | | |__Driver name |
| 887 | | | | | | | | | or "(none)" |
| 888 | | | | | | | | |__InterfaceProtocol |
| 889 | | | | | | | |__InterfaceSubClass |
| 890 | | | | | | |__InterfaceClass |
| 891 | | | | | |__NumberOfEndpoints |
| 892 | | | | |__AlternateSettingNumber |
| 893 | | | |__InterfaceNumber |
| 894 | | |__ "*" indicates the active altsetting (others are " ") |
| 895 | |__Interface info tag |
| 896 | |
| 897 | A given interface may have one or more "alternate" settings. |
| 898 | For example, default settings may not use more than a small |
| 899 | amount of periodic bandwidth. To use significant fractions |
| 900 | of bus bandwidth, drivers must select a non-default altsetting. |
| 901 | |
| 902 | Only one setting for an interface may be active at a time, and |
| 903 | only one driver may bind to an interface at a time. Most devices |
| 904 | have only one alternate setting per interface. |
| 905 | |
| 906 | |
| 907 | Endpoint descriptor info (can be multiple per Interface) |
| 908 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 909 | |
| 910 | :: |
| 911 | |
| 912 | E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddss |
| 913 | | | | | |__Interval (max) between transfers |
| 914 | | | | |__EndpointMaxPacketSize |
| 915 | | | |__Attributes(EndpointType) |
| 916 | | |__EndpointAddress(I=In,O=Out) |
| 917 | |__Endpoint info tag |
| 918 | |
| 919 | The interval is nonzero for all periodic (interrupt or isochronous) |
| 920 | endpoints. For high speed endpoints the transfer interval may be |
| 921 | measured in microseconds rather than milliseconds. |
| 922 | |
| 923 | For high speed periodic endpoints, the ``EndpointMaxPacketSize`` reflects |
| 924 | the per-microframe data transfer size. For "high bandwidth" |
| 925 | endpoints, that can reflect two or three packets (for up to |
| 926 | 3KBytes every 125 usec) per endpoint. |
| 927 | |
| 928 | With the Linux-USB stack, periodic bandwidth reservations use the |
| 929 | transfer intervals and sizes provided by URBs, which can be less |
| 930 | than those found in endpoint descriptor. |
| 931 | |
| 932 | Usage examples |
| 933 | ~~~~~~~~~~~~~~ |
| 934 | |
| 935 | If a user or script is interested only in Topology info, for |
| 936 | example, use something like ``grep ^T: /sys/kernel/debug/usb/devices`` |
| 937 | for only the Topology lines. A command like |
| 938 | ``grep -i ^[tdp]: /sys/kernel/debug/usb/devices`` can be used to list |
| 939 | only the lines that begin with the characters in square brackets, |
| 940 | where the valid characters are TDPCIE. With a slightly more able |
| 941 | script, it can display any selected lines (for example, only T, D, |
| 942 | and P lines) and change their output format. (The ``procusb`` |
| 943 | Perl script is the beginning of this idea. It will list only |
| 944 | selected lines [selected from TBDPSCIE] or "All" lines from |
| 945 | ``/sys/kernel/debug/usb/devices``.) |
| 946 | |
| 947 | The Topology lines can be used to generate a graphic/pictorial |
| 948 | of the USB devices on a system's root hub. (See more below |
| 949 | on how to do this.) |
| 950 | |
| 951 | The Interface lines can be used to determine what driver is |
| 952 | being used for each device, and which altsetting it activated. |
| 953 | |
| 954 | The Configuration lines could be used to list maximum power |
| 955 | (in milliamps) that a system's USB devices are using. |
| 956 | For example, ``grep ^C: /sys/kernel/debug/usb/devices``. |
| 957 | |
| 958 | |
| 959 | Here's an example, from a system which has a UHCI root hub, |
| 960 | an external hub connected to the root hub, and a mouse and |
| 961 | a serial converter connected to the external hub. |
| 962 | |
| 963 | :: |
| 964 | |
| 965 | T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 |
| 966 | B: Alloc= 28/900 us ( 3%), #Int= 2, #Iso= 0 |
| 967 | D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 |
| 968 | P: Vendor=0000 ProdID=0000 Rev= 0.00 |
| 969 | S: Product=USB UHCI Root Hub |
| 970 | S: SerialNumber=dce0 |
| 971 | C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA |
| 972 | I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub |
| 973 | E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms |
| 974 | |
| 975 | T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 |
| 976 | D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 |
| 977 | P: Vendor=0451 ProdID=1446 Rev= 1.00 |
| 978 | C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA |
| 979 | I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub |
| 980 | E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms |
| 981 | |
| 982 | T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 |
| 983 | D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 |
| 984 | P: Vendor=04b4 ProdID=0001 Rev= 0.00 |
| 985 | C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA |
| 986 | I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse |
| 987 | E: Ad=81(I) Atr=03(Int.) MxPS= 3 Ivl= 10ms |
| 988 | |
| 989 | T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 |
| 990 | D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 |
| 991 | P: Vendor=0565 ProdID=0001 Rev= 1.08 |
| 992 | S: Manufacturer=Peracom Networks, Inc. |
| 993 | S: Product=Peracom USB to Serial Converter |
| 994 | C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA |
| 995 | I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial |
| 996 | E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl= 16ms |
| 997 | E: Ad=01(O) Atr=02(Bulk) MxPS= 16 Ivl= 16ms |
| 998 | E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl= 8ms |
| 999 | |
| 1000 | |
| 1001 | Selecting only the ``T:`` and ``I:`` lines from this (for example, by using |
| 1002 | ``procusb ti``), we have |
| 1003 | |
| 1004 | :: |
| 1005 | |
| 1006 | T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 |
| 1007 | T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4 |
| 1008 | I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub |
| 1009 | T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0 |
| 1010 | I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse |
| 1011 | T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 |
| 1012 | I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial |
| 1013 | |
| 1014 | |
| 1015 | Physically this looks like (or could be converted to):: |
| 1016 | |
| 1017 | +------------------+ |
| 1018 | | PC/root_hub (12)| Dev# = 1 |
| 1019 | +------------------+ (nn) is Mbps. |
| 1020 | Level 0 | CN.0 | CN.1 | [CN = connector/port #] |
| 1021 | +------------------+ |
| 1022 | / |
| 1023 | / |
| 1024 | +-----------------------+ |
| 1025 | Level 1 | Dev#2: 4-port hub (12)| |
| 1026 | +-----------------------+ |
| 1027 | |CN.0 |CN.1 |CN.2 |CN.3 | |
| 1028 | +-----------------------+ |
| 1029 | \ \____________________ |
| 1030 | \_____ \ |
| 1031 | \ \ |
| 1032 | +--------------------+ +--------------------+ |
| 1033 | Level 2 | Dev# 3: mouse (1.5)| | Dev# 4: serial (12)| |
| 1034 | +--------------------+ +--------------------+ |
| 1035 | |
| 1036 | |
| 1037 | |
| 1038 | Or, in a more tree-like structure (ports [Connectors] without |
| 1039 | connections could be omitted):: |
| 1040 | |
| 1041 | PC: Dev# 1, root hub, 2 ports, 12 Mbps |
| 1042 | |_ CN.0: Dev# 2, hub, 4 ports, 12 Mbps |
| 1043 | |_ CN.0: Dev #3, mouse, 1.5 Mbps |
| 1044 | |_ CN.1: |
| 1045 | |_ CN.2: Dev #4, serial, 12 Mbps |
| 1046 | |_ CN.3: |
| 1047 | |_ CN.1: |