HID USB peripherals

This topic describes the three power states that are required for internal and external HID USB devices.

HID USB Peripheral Power States

State Mandatory /Optional Description Power Consumption (Recommendation)
ACTIVE Mandatory The fully active state of the device. 0.1 x Active Power Consumption + 0.9 x Idle Power Consumption <= 37 mW
IDLE Mandatory

The internal state of the device when the host has suspended the device. This is referred to as USB selective suspend.

Transitions into this state are Host Initiated (via Suspend) and the transition out of this state is Device Initiated.

Device Fundamentals Reference: Device.Connectivity.UsbDevices.MustSupportSuspend All USB connected Windows Touch Screen controllers shall support selective suspend and report this capability via a Microsoft OS descriptor. For more information, see Microsoft OS Descriptors.

A device can elect to reduce scan rate in this mode to reduce overall power consumption while still adhering to the contact down latency requirement for this mode.

0.1 x Active Power Consumption + 0.9 x Idle Power Consumption <= 37 mW

Note If bus powered, the device must not consume more than 2.5mA from VBUS. It is therefore recommended to have side-band power.
OFF Mandatory he device will have no power applied in this state. There is no transition latency requirement from OFF to ACTIVE for Windows 8. Transitions in and out of this state are Host Initiated. 0mW

Idle state

To ensure no data is lost while the device is resuming from Selective suspend, the touch device manufacturer has two options:

  • OPTION 1 (Ideal Solution): Buffering: After the device has detected contact activity, it shall signal remote wake. From that event, the device shall buffer at least 100 ms worth of contact reports to ensure that little to no input is lost while the USB host controller is resuming. This option works in Windows 8.1 and in Windows 8.

  • OPTION 2 (Backup Solution): Registry Key: This solution should be used only if Option 1 is not feasible (for example, with older touchscreens). If buffering is not feasible, HID USB touch controllers should not be selectively suspended by the Host after 5 seconds of IDLE time; instead, they should be suspended by the Host only on screen off. To ensure that this happens, the following registry values must be set by the OEM for a given device instance:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\<VID>\<Device Instance>\Device Parameters


    <VID> refers to the vendor ID (or vendor ID/product ID combination) of the HID USB touch controller, and <Device Instance> refers to the instance of the device to which these settings should apply.

    If the following values do not exist, they must be added:

    Value name Type Value
    EnhancedPowerManagementUseMonitor DWORD 1
    SelectiveSuspendEnabled DWORD 0

    For the registry keys to be preserved across OS upgrades, they should be set via third party device INF. This device INF should only be setting the registry value and the third party should not install a driver by using the INF.

    The following is a sample INF:

    ; INF File for USB HID devices
    ; This inf is for devices that cannot support SelSusp but need
    ; to be idled using monitor off notifications
    ; Class Section
    Signature   ="$WINDOWS NT$"
    Class       =HIDClass
    ClassGuid   ={745a17a0-74d3-11d0-b6fe-00a0c90f57da}
    Provider    =%VendorName%
    DriverVer   =9/19/2008,
    CatalogFile =VendorXYZ.cat
    ; Install Section
    %VendorName% = VendorXYZDevice,NTx86,NTamd64,NTarm
    %VendorXYZ.DeviceDesc% = VendorXYZDevice_Install, USB\VID_xxxx&PID_yyyy
    %VendorXYZ.DeviceDesc% = VendorXYZDevice_Install, USB\VID_xxxx&PID_yyyy
    %VendorXYZ.DeviceDesc% = VendorXYZDevice_Install, USB\VID_xxxx&PID_yyyy
    include     = input.inf
    needs       = HID_Inst.NT
    include     = input.inf
    needs       = HID_Inst.NT.HW
    AddReg      = VendorXYZDevice_AddReg
    include     = input.inf
    needs       = HID_Inst.NT.Services
    VendorName = "Vendor XYZ"
    VendorXYZ.DeviceDesc = "Vendor XYZ Device"

Send comments about this topic to Microsoft