|  | .. _pcsys_005fusb: | 
|  |  | 
|  | USB emulation | 
|  | ------------- | 
|  |  | 
|  | QEMU can emulate a PCI UHCI, OHCI, EHCI or XHCI USB controller. You can | 
|  | plug virtual USB devices or real host USB devices (only works with | 
|  | certain host operating systems). QEMU will automatically create and | 
|  | connect virtual USB hubs as necessary to connect multiple USB devices. | 
|  |  | 
|  | USB controllers | 
|  | ~~~~~~~~~~~~~~~ | 
|  |  | 
|  | XHCI controller support | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | QEMU has XHCI host adapter support.  The XHCI hardware design is much | 
|  | more virtualization-friendly when compared to EHCI and UHCI, thus XHCI | 
|  | emulation uses less resources (especially CPU).  So if your guest | 
|  | supports XHCI (which should be the case for any operating system | 
|  | released around 2010 or later) we recommend using it: | 
|  |  | 
|  | qemu -device qemu-xhci | 
|  |  | 
|  | XHCI supports USB 1.1, USB 2.0 and USB 3.0 devices, so this is the | 
|  | only controller you need.  With only a single USB controller (and | 
|  | therefore only a single USB bus) present in the system there is no | 
|  | need to use the bus= parameter when adding USB devices. | 
|  |  | 
|  |  | 
|  | EHCI controller support | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The QEMU EHCI Adapter supports USB 2.0 devices.  It can be used either | 
|  | standalone or with companion controllers (UHCI, OHCI) for USB 1.1 | 
|  | devices.  The companion controller setup is more convenient to use | 
|  | because it provides a single USB bus supporting both USB 2.0 and USB | 
|  | 1.1 devices.  See next section for details. | 
|  |  | 
|  | When running EHCI in standalone mode you can add UHCI or OHCI | 
|  | controllers for USB 1.1 devices too.  Each controller creates its own | 
|  | bus though, so there are two completely separate USB buses: One USB | 
|  | 1.1 bus driven by the UHCI controller and one USB 2.0 bus driven by | 
|  | the EHCI controller.  Devices must be attached to the correct | 
|  | controller manually. | 
|  |  | 
|  | The easiest way to add a UHCI controller to a ``pc`` machine is the | 
|  | ``-usb`` switch.  QEMU will create the UHCI controller as function of | 
|  | the PIIX3 chipset.  The USB 1.1 bus will carry the name ``usb-bus.0``. | 
|  |  | 
|  | You can use the standard ``-device`` switch to add a EHCI controller to | 
|  | your virtual machine.  It is strongly recommended to specify an ID for | 
|  | the controller so the USB 2.0 bus gets an individual name, for example | 
|  | ``-device usb-ehci,id=ehci``.  This will give you a USB 2.0 bus named | 
|  | ``ehci.0``. | 
|  |  | 
|  | When adding USB devices using the ``-device`` switch you can specify the | 
|  | bus they should be attached to.  Here is a complete example: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| -M pc ${otheroptions}                        \\ | 
|  | -drive if=none,id=usbstick,format=raw,file=/path/to/image   \\ | 
|  | -usb                                                        \\ | 
|  | -device usb-ehci,id=ehci                                    \\ | 
|  | -device usb-tablet,bus=usb-bus.0                            \\ | 
|  | -device usb-storage,bus=ehci.0,drive=usbstick | 
|  |  | 
|  | This attaches a USB tablet to the UHCI adapter and a USB mass storage | 
|  | device to the EHCI adapter. | 
|  |  | 
|  |  | 
|  | Companion controller support | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The UHCI and OHCI controllers can attach to a USB bus created by EHCI | 
|  | as companion controllers.  This is done by specifying the ``masterbus`` | 
|  | and ``firstport`` properties.  ``masterbus`` specifies the bus name the | 
|  | controller should attach to.  ``firstport`` specifies the first port the | 
|  | controller should attach to, which is needed as usually one EHCI | 
|  | controller with six ports has three UHCI companion controllers with | 
|  | two ports each. | 
|  |  | 
|  | There is a config file in docs which will do all this for | 
|  | you, which you can use like this: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| -readconfig docs/config/ich9-ehci-uhci.cfg | 
|  |  | 
|  | Then use ``bus=ehci.0`` to assign your USB devices to that bus. | 
|  |  | 
|  | Using the ``-usb`` switch for ``q35`` machines will create a similar | 
|  | USB controller configuration. | 
|  |  | 
|  |  | 
|  | .. _Connecting USB devices: | 
|  |  | 
|  | Connecting USB devices | 
|  | ~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | USB devices can be connected with the ``-device usb-...`` command line | 
|  | option or the ``device_add`` monitor command. Available devices are: | 
|  |  | 
|  | ``usb-mouse`` | 
|  | Virtual Mouse. This will override the PS/2 mouse emulation when | 
|  | activated. | 
|  |  | 
|  | ``usb-tablet`` | 
|  | Pointer device that uses absolute coordinates (like a touchscreen). | 
|  | This means QEMU is able to report the mouse position without having | 
|  | to grab the mouse. Also overrides the PS/2 mouse emulation when | 
|  | activated. | 
|  |  | 
|  | ``usb-storage,drive=drive_id`` | 
|  | Mass storage device backed by drive_id (see the :ref:`disk images` | 
|  | chapter in the System Emulation Users Guide). This is the classic | 
|  | bulk-only transport protocol used by 99% of USB sticks. This | 
|  | example shows it connected to an XHCI USB controller and with | 
|  | a drive backed by a raw format disk image: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...]                                   \\ | 
|  | -drive if=none,id=stick,format=raw,file=/path/to/file.img \\ | 
|  | -device nec-usb-xhci,id=xhci                              \\ | 
|  | -device usb-storage,bus=xhci.0,drive=stick | 
|  |  | 
|  | ``usb-uas`` | 
|  | USB attached SCSI device. This does not create a SCSI disk, so | 
|  | you need to explicitly create a ``scsi-hd`` or ``scsi-cd`` device | 
|  | on the command line, as well as using the ``-drive`` option to | 
|  | specify what those disks are backed by. One ``usb-uas`` device can | 
|  | handle multiple logical units (disks). This example creates three | 
|  | logical units: two disks and one cdrom drive: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...]                                         \\ | 
|  | -drive if=none,id=uas-disk1,format=raw,file=/path/to/file1.img  \\ | 
|  | -drive if=none,id=uas-disk2,format=raw,file=/path/to/file2.img  \\ | 
|  | -drive if=none,id=uas-cdrom,media=cdrom,format=raw,file=/path/to/image.iso \\ | 
|  | -device nec-usb-xhci,id=xhci                                    \\ | 
|  | -device usb-uas,id=uas,bus=xhci.0                               \\ | 
|  | -device scsi-hd,bus=uas.0,scsi-id=0,lun=0,drive=uas-disk1       \\ | 
|  | -device scsi-hd,bus=uas.0,scsi-id=0,lun=1,drive=uas-disk2       \\ | 
|  | -device scsi-cd,bus=uas.0,scsi-id=0,lun=5,drive=uas-cdrom | 
|  |  | 
|  | ``usb-bot`` | 
|  | Bulk-only transport storage device. This presents the guest with the | 
|  | same USB bulk-only transport protocol interface as ``usb-storage``, but | 
|  | the QEMU command line option works like ``usb-uas`` and does not | 
|  | automatically create SCSI disks for you. ``usb-bot`` supports up to | 
|  | 16 LUNs. Unlike ``usb-uas``, the LUN numbers must be continuous, | 
|  | i.e. for three devices you must use 0+1+2. The 0+1+5 numbering from the | 
|  | ``usb-uas`` example above won't work with ``usb-bot``. | 
|  |  | 
|  | ``usb-mtp,rootdir=dir`` | 
|  | Media transfer protocol device, using dir as root of the file tree | 
|  | that is presented to the guest. | 
|  |  | 
|  | ``usb-host,hostbus=bus,hostaddr=addr`` | 
|  | Pass through the host device identified by bus and addr | 
|  |  | 
|  | ``usb-host,vendorid=vendor,productid=product`` | 
|  | Pass through the host device identified by vendor and product ID | 
|  |  | 
|  | ``usb-wacom-tablet`` | 
|  | Virtual Wacom PenPartner tablet. This device is similar to the | 
|  | ``tablet`` above but it can be used with the tslib library because in | 
|  | addition to touch coordinates it reports touch pressure. | 
|  |  | 
|  | ``usb-kbd`` | 
|  | Standard USB keyboard. Will override the PS/2 keyboard (if present). | 
|  |  | 
|  | ``usb-serial,chardev=id`` | 
|  | Serial converter. This emulates an FTDI FT232BM chip connected to | 
|  | host character device id. | 
|  |  | 
|  | ``usb-braille,chardev=id`` | 
|  | Braille device. This emulates a Baum Braille device USB port. id has to | 
|  | specify a character device defined with ``-chardev …,id=id``.  One will | 
|  | normally use BrlAPI to display the braille output on a BRLTTY-supported | 
|  | device with | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...] -chardev braille,id=brl -device usb-braille,chardev=brl | 
|  |  | 
|  | or alternatively, use the following equivalent shortcut: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...] -usbdevice braille | 
|  |  | 
|  | ``usb-net[,netdev=id]`` | 
|  | Network adapter that supports CDC ethernet and RNDIS protocols. id | 
|  | specifies a netdev defined with ``-netdev …,id=id``. For instance, | 
|  | user-mode networking can be used with | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...] -netdev user,id=net0 -device usb-net,netdev=net0 | 
|  |  | 
|  | ``usb-ccid`` | 
|  | Smartcard reader device | 
|  |  | 
|  | ``usb-audio`` | 
|  | USB audio device | 
|  |  | 
|  | ``u2f-{emulated,passthru}`` | 
|  | Universal Second Factor device | 
|  |  | 
|  | ``canokey`` | 
|  | An Open-source Secure Key implementing FIDO2, OpenPGP, PIV and more. | 
|  | For more information, see :ref:`canokey`. | 
|  |  | 
|  | Physical port addressing | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | For all the above USB devices, by default QEMU will plug the device | 
|  | into the next available port on the specified USB bus, or onto | 
|  | some available USB bus if you didn't specify one explicitly. | 
|  | If you need to, you can also specify the physical port where | 
|  | the device will show up in the guest.  This can be done using the | 
|  | ``port`` property.  UHCI has two root ports (1,2).  EHCI has six root | 
|  | ports (1-6), and the emulated (1.1) USB hub has eight ports. | 
|  |  | 
|  | Plugging a tablet into UHCI port 1 works like this:: | 
|  |  | 
|  | -device usb-tablet,bus=usb-bus.0,port=1 | 
|  |  | 
|  | Plugging a hub into UHCI port 2 works like this:: | 
|  |  | 
|  | -device usb-hub,bus=usb-bus.0,port=2 | 
|  |  | 
|  | Plugging a virtual USB stick into port 4 of the hub just plugged works | 
|  | this way:: | 
|  |  | 
|  | -device usb-storage,bus=usb-bus.0,port=2.4,drive=... | 
|  |  | 
|  | In the monitor, the ``device_add` command also accepts a ``port`` | 
|  | property specification. If you want to unplug devices too you should | 
|  | specify some unique id which you can use to refer to the device. | 
|  | You can then use ``device_del`` to unplug the device later. | 
|  | For example:: | 
|  |  | 
|  | (qemu) device_add usb-tablet,bus=usb-bus.0,port=1,id=my-tablet | 
|  | (qemu) device_del my-tablet | 
|  |  | 
|  | Hotplugging USB storage | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The ``usb-bot`` and ``usb-uas`` devices can be hotplugged.  In the hotplug | 
|  | case they are added with ``attached = false`` so the guest will not see | 
|  | the device until the ``attached`` property is explicitly set to true. | 
|  | That allows you to attach one or more scsi devices before making the | 
|  | device visible to the guest. The workflow looks like this: | 
|  |  | 
|  | #. ``device-add usb-bot,id=foo`` | 
|  | #. ``device-add scsi-{hd,cd},bus=foo.0,lun=0`` | 
|  | #. optionally add more devices (luns 1 ... 15) | 
|  | #. ``scripts/qmp/qom-set foo.attached = true`` | 
|  |  | 
|  | .. _host_005fusb_005fdevices: | 
|  |  | 
|  | Using host USB devices on a Linux host | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | WARNING: this is an experimental feature. QEMU will slow down when using | 
|  | it. USB devices requiring real time streaming (i.e. USB Video Cameras) | 
|  | are not supported yet. | 
|  |  | 
|  | 1. If you use an early Linux 2.4 kernel, verify that no Linux driver is | 
|  | actually using the USB device. A simple way to do that is simply to | 
|  | disable the corresponding kernel module by renaming it from | 
|  | ``mydriver.o`` to ``mydriver.o.disabled``. | 
|  |  | 
|  | 2. Verify that ``/proc/bus/usb`` is working (most Linux distributions | 
|  | should enable it by default). You should see something like that: | 
|  |  | 
|  | :: | 
|  |  | 
|  | ls /proc/bus/usb | 
|  | 001  devices  drivers | 
|  |  | 
|  | 3. Since only root can access to the USB devices directly, you can | 
|  | either launch QEMU as root or change the permissions of the USB | 
|  | devices you want to use. For testing, the following suffices: | 
|  |  | 
|  | :: | 
|  |  | 
|  | chown -R myuid /proc/bus/usb | 
|  |  | 
|  | 4. Launch QEMU and do in the monitor: | 
|  |  | 
|  | :: | 
|  |  | 
|  | info usbhost | 
|  | Device 1.2, speed 480 Mb/s | 
|  | Class 00: USB device 1234:5678, USB DISK | 
|  |  | 
|  | You should see the list of the devices you can use (Never try to use | 
|  | hubs, it won't work). | 
|  |  | 
|  | 5. Add the device in QEMU by using: | 
|  |  | 
|  | :: | 
|  |  | 
|  | device_add usb-host,vendorid=0x1234,productid=0x5678 | 
|  |  | 
|  | Normally the guest OS should report that a new USB device is plugged. | 
|  | You can use the option ``-device usb-host,...`` to do the same. | 
|  |  | 
|  | 6. Now you can try to use the host USB device in QEMU. | 
|  |  | 
|  | When relaunching QEMU, you may have to unplug and plug again the USB | 
|  | device to make it work again (this is a bug). | 
|  |  | 
|  | ``usb-host`` properties for specifying the host device | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The example above uses the ``vendorid`` and ``productid`` to | 
|  | specify which host device to pass through, but this is not | 
|  | the only way to specify the host device. ``usb-host`` supports | 
|  | the following properties: | 
|  |  | 
|  | ``hostbus=<nr>`` | 
|  | Specifies the bus number the device must be attached to | 
|  | ``hostaddr=<nr>`` | 
|  | Specifies the device address the device got assigned by the guest os | 
|  | ``hostport=<str>`` | 
|  | Specifies the physical port the device is attached to | 
|  | ``vendorid=<hexnr>`` | 
|  | Specifies the vendor ID of the device | 
|  | ``productid=<hexnr>`` | 
|  | Specifies the product ID of the device. | 
|  |  | 
|  | In theory you can combine all these properties as you like.  In | 
|  | practice only a few combinations are useful: | 
|  |  | 
|  | - ``vendorid`` and ``productid`` -- match for a specific device, pass it to | 
|  | the guest when it shows up somewhere in the host. | 
|  |  | 
|  | - ``hostbus`` and ``hostport`` -- match for a specific physical port in the | 
|  | host, any device which is plugged in there gets passed to the | 
|  | guest. | 
|  |  | 
|  | - ``hostbus`` and ``hostaddr`` -- most useful for ad-hoc pass through as the | 
|  | hostaddr isn't stable. The next time you plug the device into the host it | 
|  | will get a new hostaddr. | 
|  |  | 
|  | Note that on the host USB 1.1 devices are handled by UHCI/OHCI and USB | 
|  | 2.0 by EHCI.  That means different USB devices plugged into the very | 
|  | same physical port on the host may show up on different host buses | 
|  | depending on the speed. Supposing that devices plugged into a given | 
|  | physical port appear as bus 1 + port 1 for 2.0 devices and bus 3 + port 1 | 
|  | for 1.1 devices, you can pass through any device plugged into that port | 
|  | and also assign it to the correct USB bus in QEMU like this: | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| -M pc [...]                            \\ | 
|  | -usb                                                 \\ | 
|  | -device usb-ehci,id=ehci                             \\ | 
|  | -device usb-host,bus=usb-bus.0,hostbus=3,hostport=1  \\ | 
|  | -device usb-host,bus=ehci.0,hostbus=1,hostport=1 | 
|  |  | 
|  | ``usb-host`` properties for reset behavior | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The ``guest-reset`` and ``guest-reset-all`` properties control | 
|  | whenever the guest is allowed to reset the physical usb device on the | 
|  | host.  There are three cases: | 
|  |  | 
|  | ``guest-reset=false`` | 
|  | The guest is not allowed to reset the (physical) usb device. | 
|  |  | 
|  | ``guest-reset=true,guest-resets-all=false`` | 
|  | The guest is allowed to reset the device when it is not yet | 
|  | initialized (aka no usb bus address assigned).  Usually this results | 
|  | in one guest reset being allowed.  This is the default behavior. | 
|  |  | 
|  | ``guest-reset=true,guest-resets-all=true`` | 
|  | The guest is allowed to reset the device as it pleases. | 
|  |  | 
|  | The reason for this existing are broken usb devices.  In theory one | 
|  | should be able to reset (and re-initialize) usb devices at any time. | 
|  | In practice that may result in shitty usb device firmware crashing and | 
|  | the device not responding any more until you power-cycle (aka un-plug | 
|  | and re-plug) it. | 
|  |  | 
|  | What works best pretty much depends on the behavior of the specific | 
|  | usb device at hand, so it's a trial-and-error game.  If the default | 
|  | doesn't work, try another option and see whenever the situation | 
|  | improves. | 
|  |  | 
|  | record usb transfers | 
|  | ^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | All usb devices have support for recording the usb traffic.  This can | 
|  | be enabled using the ``pcap=<file>`` property, for example: | 
|  |  | 
|  | ``-device usb-mouse,pcap=mouse.pcap`` | 
|  |  | 
|  | The pcap files are compatible with the linux kernels usbmon.  Many | 
|  | tools, including ``wireshark``, can decode and inspect these trace | 
|  | files. |