WinUSB power management
WinUSB uses the KMDF state machines for power management. Power policies are managed through calls to WinUsb_SetPowerPolicy.
In order to modify the power behavior of WinUSB, default registry settings can be modified in the device's INF. These values must be written to the device specific location in the registry by adding the values in the HW.AddReg section of the INF.
The registry values described in the following list can be specified in the device's INF to modify the power behavior.
System Wake
This feature is controlled by the SystemWakeEnabled DWORD registry setting. This value indicates whether the device should be allowed to wake the system from a low power state.
HKR,,SystemWakeEnabled,0x00010001,1
- A value of zero, or the absence of this value indicates that the device isn't allowed to wake the system.
- To allow a device to wake the system, set SystemWakeEnabled to a nonzero value. A check box in the device Properties page is automatically enabled so that the user can override the setting.
Note
Changing the SystemWakeEnabled setting has no effect on selective suspend, this registry value only pertains to system suspend.
Selective Suspend
Selective suspend can be disabled by any of several system or WinUSB settings. A single setting can't force WinUSB to enable selective suspend.
The following power policy settings that are specified in WinUsb_SetPowerPolicy's PolicyType parameter affect the behavior of selective suspend:
- AUTO_SUSPEND When set to zero, it doesn't set the device to selective suspend mode.
- SUSPEND_DELAY Sets the time between when the device becomes idle and when WinUSB requests the device to go into selective suspend.
The following table shows how the registry keys affect the selective suspend feature.
Registry key | Description |
---|---|
DeviceIdleEnabled | This is a DWORD value. This registry value indicates whether the device is capable of being powered down when idle (Selective Suspend).
HKR,,DeviceIdleEnabled,0x00010001,1 |
DeviceIdleIgnoreWakeEnable | When set to a nonzero value, it suspends the device even if it doesn't support RemoteWake. |
UserSetDeviceIdleEnabled | This value is a DWORD value. This registry value indicates whether a check box should be enabled in the device Properties page that allows a user to override the idle defaults. When UserSetDeviceIdleEnabled is set to a nonzero value the check box is enabled and the user can disable powering down the device when idle. A value of zero, or the absence of this value indicates that the check box isn't enabled.
The UserSetDeviceIdleEnabled is ignored if DeviceIdleEnabled isn't set. HKR,,UserSetDeviceIdleEnabled,0x00010001,1 |
DefaultIdleState | This is a DWORD value. This registry value sets the default value of the AUTO_SUSPEND power policy setting. This registry key is used to enable or disable selective suspend when a handle isn't open to the device.
This value is ignored if DeviceIdleEnabled isn't set. HKR,,DefaultIdleState,0x00010001,1 |
DefaultIdleTimeout | This is a DWORD value. This registry value sets the default state of the SUSPEND_DELAY power policy setting. The value indicates the amount of time in milliseconds to wait before determining that a device is idle. HKR,,DefaultIdleTimeout,0x00010001,100 |
Detecting Idle
All writes and control transfers force the device into the D0 power state and reset the idle timer. The IN endpoint queues aren't power managed. Read requests wake the device when they're submitted. However, a device can become idle while a read request waits.
Related topics
- WinUSB Architecture and Modules
- Choosing a driver model for developing a USB client driver
- WinUSB (Winusb.sys) Installation
- How to Access a USB Device by Using WinUSB Functions
- WinUSB Functions for Pipe Policy Modification
- WinUSB functions
- Introduction to WinUSB for Developers
- WinUsb_GetPowerPolicy
- WinUsb_SetPowerPolicy