| .. _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. |