mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 12:07:31 +00:00 
			
		
		
		
	 30a20f2c5a
			
		
	
	
		30a20f2c5a
		
	
	
	
	
		
			
			Fold the usb2.txt information on device passthrough into usb.rst; since this is the last part of the .txt file we can delete it now. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20210728141457.14825-5-peter.maydell@linaro.org> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
		
			
				
	
	
		
			352 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. _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 will use BrlAPI to display the braille output on
 | |
|    a real or fake device referenced by id.
 | |
| 
 | |
| ``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
 | |
| 
 | |
| 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
 |