USB Host Controller Driver Registry Settings (Compact 2013)


This topic contains information on the following registry settings:

  • Host Controller Driver (HCD) module
  • USB host controller driver
  • HCD memory

Registry keys control how USB device drivers are loaded. When a USB device is attached, the USB driver module loads the appropriate USB device driver to control that device, based on the device's configuration and interface descriptor information. The USB driver module locates the correct driver by using a set of registry keys, which track both the drivers and the devices. The registry keys are stored as subkeys of the HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients key.

This loading method provides a flexible framework that allows drivers to be loaded in different contexts, depending on the range of devices that they are able to control. For example, you might decide to include a generic class driver that can control a broad range of USB devices. However, you might have a driver for a specific USB device within that class that is more efficient or works better than the generic class driver. In this case, your driver could control a subset of the devices that the generic class driver controls, while allowing other devices to continue to be controlled by the generic driver. The structure of the LoadClients key defines a framework in which programmers can specify driver precedence in great detail.

The following table shows examples of the contexts that can cause specific USB device drivers to load.



To match every device that is connected to the bus.

A driver that displays an icon in the system's taskbar is loaded to control each USB device that is connected to the system. The driver purposely fails the USBDeviceAttach call after obtaining the device information, and the USB driver module continues looking for a driver to control the device.

Only one driver of this type can be registered in the system.

To match a vendor-specific identifier.

A vendor-specific identifier matches USB devices that do not fall into any currently defined class or provides an enhanced driver for a particular USB device.

Microsoft does not recommend that you do this for general-purpose drivers that might be able to control devices from multiple developers.

To control devices of a specific device class.

You write a USB device driver to control all HID class devices.

The USB Implementers Forum has defined other device classes, including communications, audio, and mass storage.

To control each interface on a device.

A USB CD-ROM drive with an audio interface has separate drivers for each interface, which is common with CD-ROM drives that can play audio CD-ROMs.

This context is the best for loading USB device drivers because it allows compound devices that require multiple drivers to operate without additional reconfiguration.

The registry key for a USB device driver should either be part of your Platform.reg file or be created when a USB device driver is installed. At installation time, the key can be created either by a setup application or by the driver's USBInstallDriver function. USBInstallDriver should create the keys indirectly, by calling the LPREGISTER_CLIENT_SETTINGS function, rather than by invoking the registry APIs. Installation by USBInstallDriver occurs when an unrecognized USB device is connected to the bus and the USB driver module queries a user for the name of the device driver DLL. The USB driver module then loads the driver and calls its USBInstallDriver function.

Subkeys for each driver have the form Group1_ID\Group2_ID\Group3_ID\DriverName. Each of the group identifier subkeys can be named Default to indicate that the USB device driver should be loaded if the remaining group identifier subkey names match the USB device. Otherwise, the group identifier subkey names are formed from combinations of vendor, device class, and protocol information, separated by underscores. This information comes from the USB device descriptor. The following table shows the allowable combinations.

Group key

Allowable forms


DeviceVendorID, DeviceVendorID_DeviceProductID, DeviceVendorID_DeviceProductID_DeviceReleaseNumber


DeviceClassCode, DeviceClassCode_DeviceSubclassCode, DeviceClassCode_DeviceSubclassCode_DeviceProtocolCode


InterfaceClassCode, InterfaceClassCode_InterfaceSubclassCode, InterfaceClassCode_InterfaceSubclassCode_InterfaceProtocolCode

If your hardware platform contains UHCI–compliant host controllers, you will have a migrating task similar to a hardware platform with OHCI-complaint host controllers. OEMs need to include the following registry values under the HKEY_LOCAL_MACHINE\Drivers\Builtin\UHCI registry key so that the UHC driver will be loaded when the system boots.

    "Irq"=dword:<hardware platform dependent>
    "MemBase"=dword:<hardware platform dependent>
    "Priority"=dword:<hardware platform dependent>

The UseExistingSettings key controls whether the values for Irq, MemBase, and Priority come from the system's BIOS settings or whether they come from the registry. A value of 0 causes the BIOS setting to be used. Any other value causes the BIOS settings to be ignored in favor of the values specified in the Irq, MemBase, and Priority keys.

When the UHC driver is loaded at boot time, it attempts to detect the presence of a UHCI-compliant USB host controller. The sample UHC driver is only capable of detecting the Intel PIIX4 controller because of PCI bus values that are hard-coded into the UHC driver. However, the detection function is available as source code. You can change the function to detect other UHCI-compliant USB host controllers.

The following table lists the values that the sample UHC driver uses to identify the Intel PIIX4 controller.

PCI field





Serial Bus Controller



USB subclass



Intel Vendor ID



PIIX4 Device ID

The HCD module obtains the host controller interface settings dynamically according to the UseExistingSettings key as described above. The default value of the UseExistingSettings key can also be controlled on your development computer through the environment variable CEPC_USB_USE_EXISTING. If you set this variable to a new value, you do not have to rebuild the HCD module. You only have to run the Makeimg utility to cause the new value to be incorporated into your operating system image.

Fundamentally, Windows Embedded Compact cannot reconfigure PCI devices dynamically. Thefore, if UseExistingSettings is set to 0, the USB host controller interface settings must match those in the hardware platform's registry or the HCD module will not load. If the two do not match, you can check the hardware platform's resource settings, and then update your Platform.reg file with the correct addresses and IRQ information. Alternately, you can watch the debug output while your hardware platform boots, which should report an error that contains these resource settings.

The following code example shows debug output.

!OHCD: Configuration different from registry: IRQ %u, PortBase: 0x%X (reg: %u, 0x%X)

The following registry keys show USB host controller registry keys.

The registry key PhysicalPageSize can be used to change the common buffer size used by the OHCI2 USB driver.