|  |  | 
|  | USB 2.0 Quick Start | 
|  | =================== | 
|  |  | 
|  | The QEMU EHCI Adapter can be used with and without companion | 
|  | controllers.  See below for the companion controller mode. | 
|  |  | 
|  | When not running in companion controller mode there are two completely | 
|  | separate USB busses: 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 '-usb' switch will make qemu create the UHCI controller as part of | 
|  | the PIIX3 chipset.  The USB 1.1 bus will carry the name "usb.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 a individual name, for example | 
|  | '-device usb-ehci,id=ehci".  This will give you a USB 2.0 bus named | 
|  | "ehci.0". | 
|  |  | 
|  | I strongly recomment to also use -device to attach usb devices because | 
|  | you can specify the bus they should be attached to this way.  Here is | 
|  | a complete example: | 
|  |  | 
|  | qemu -M pc ${otheroptions}                           \ | 
|  | -drive if=none,id=usbstick,file=/path/to/image   \ | 
|  | -usb                                             \ | 
|  | -device usb-ehci,id=ehci                         \ | 
|  | -device usb-tablet,bus=usb.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 | 
|  | ---------------------------- | 
|  |  | 
|  | Companion controller support has been added recently.  The operational | 
|  | model described above with two completely separate busses still works | 
|  | fine.  Additionally the UHCI and OHCI controllers got the ability to | 
|  | 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, just | 
|  | try ... | 
|  |  | 
|  | qemu -readconfig docs/ich9-ehci-uhci.cfg | 
|  |  | 
|  | ... then use "bus=ehci.0" to assign your usb devices to that bus. | 
|  |  | 
|  |  | 
|  | More USB tips & tricks | 
|  | ====================== | 
|  |  | 
|  | Recently the usb pass through driver (also known as usb-host) and the | 
|  | qemu usb subsystem gained a few capabilities which are available only | 
|  | via qdev properties, i,e. when using '-device'. | 
|  |  | 
|  |  | 
|  | physical port addressing | 
|  | ------------------------ | 
|  |  | 
|  | First you can (for all usb devices) 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 four root | 
|  | ports (1-4), the emulated (1.1) USB hub has eight ports. | 
|  |  | 
|  | Plugging a tablet into UHCI port 1 works like this: | 
|  |  | 
|  | -device usb-tablet,bus=usb.0,port=1 | 
|  |  | 
|  | Plugging a hub into UHCI port 2 works like this: | 
|  |  | 
|  | -device usb-hub,bus=usb.0,port=2 | 
|  |  | 
|  | Plugging a virtual usb stick into port 4 of the hub just plugged works | 
|  | this way: | 
|  |  | 
|  | -device usb-storage,bus=usb.0,port=2.4,drive=... | 
|  |  | 
|  | You can do basically the same in the monitor using the device_add | 
|  | command.  If you want to unplug devices too you should specify some | 
|  | unique id which you can use to refer to the device ... | 
|  |  | 
|  | (qemu) device_add usb-tablet,bus=usb.0,port=1,id=my-tablet | 
|  | (qemu) device_del my-tablet | 
|  |  | 
|  | ... when unplugging it with device_del. | 
|  |  | 
|  |  | 
|  | USB pass through hints | 
|  | ---------------------- | 
|  |  | 
|  | The usb-host driver has a bunch of properties to specify the device | 
|  | which should be passed to the guest: | 
|  |  | 
|  | 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: | 
|  |  | 
|  | (1) vendorid+productid -- match for a specific device, pass it to | 
|  | the guest when it shows up somewhere in the host. | 
|  |  | 
|  | (2) hostbus+hostport -- match for a specific physical port in the | 
|  | host, any device which is plugged in there gets passed to the | 
|  | guest. | 
|  |  | 
|  | (3) hostbus+hostaddr -- most useful for ad-hoc pass through as the | 
|  | hostaddr isn't stable, the next time you plug in the device it | 
|  | gets a new one ... | 
|  |  | 
|  | Note that USB 1.1 devices are handled by UHCI/OHCI and USB 2.0 by | 
|  | EHCI.  That means a device plugged into the very same physical port | 
|  | may show up on different busses depending on the speed.  The port I'm | 
|  | using for testing is bus 1 + port 1 for 2.0 devices and bus 3 + port 1 | 
|  | for 1.1 devices.  Passing through any device plugged into that port | 
|  | and also assign them to the correct bus can be done this way: | 
|  |  | 
|  | qemu -M pc ${otheroptions}                           \ | 
|  | -usb                                             \ | 
|  | -device usb-ehci,id=ehci                         \ | 
|  | -device usb-host,bus=usb.0,hostbus=3,hostport=1  \ | 
|  | -device usb-host,bus=ehci.0,hostbus=1,hostport=1 | 
|  |  | 
|  | enjoy, | 
|  | Gerd | 
|  |  | 
|  | -- | 
|  | Gerd Hoffmann <kraxel@redhat.com> |