USB 设备电源状态

本文介绍了通用串行总线 2.0 规范第 9.1 节中规定的用于 USB 设备电源状态的 Windows 驱动程序模型 (WDM) 设备状态。

USB 设备电源状态(如通用串行总线 2.0 规范第 9.1 节所述)可分为三大类:

  • 附后:设备已连接,但未完全通电。
  • 通电:设备处于其中一种完全通电状态:默认、地址或配置。
  • 暂停:设备处于闲置状态,以低功耗运行。

WDM 功率模型中定义的设备功率状态与 USB 标准中定义的设备功率状态之间没有直接关联。 例如,在 USB 规范中,术语 suspendedidle 具有明确的含义;但在 WDM 功率模型中,这些术语的用法往往不同。 Windows 客户端驱动程序可以将 USB 设备置于挂起状态。 有关详细信息,请参阅 USB 选择性挂起。 客户端驱动程序准备挂起设备时,会指示总线驱动程序将其空闲。 有关空闲请求的讨论,请参阅 USB 选择性挂起

WDM 模型中的设备功率状态可概括如下:

  • D0 - 工作状态。 设备已完全通电。
  • D1/D2 - 中间睡眠状态。 这些状态允许设备布防以进行远程唤醒。
  • D3 - 最深的睡眠状态。 处于 D3 状态的设备无法为远程唤醒布防。

有关 WDM 功率模型中设备功率状态的完整讨论,请参阅设备功率状态

WDM 功率模型使用设备防护一词来实现远程唤醒。 防护是一项软件操作,通常(但不总是)会导致启用 USB 设备远程唤醒功能的硬件操作。 等待唤醒 IRP (IRP_MN_WAIT_WAKE) 是 WDM 软件对设备进行的远程唤醒操作。 有关此 IRP 的详细信息,请参阅支持具有唤醒功能的设备

有关该软件操作与启用 USB 远程唤醒功能之间关系的说明,请参阅远程唤醒 USB 设备

本部分包含以下小节:

更改非复合设备的电源状态

USB 设备的电源策略管理器负责设置设备的电源状态。 电源策略管理器通过发出 WDM 电源 (IRP_MN_SET_POWER) IRP 来设置电源状态。 有关电源策略管理器的更多信息,请参阅电源策略所有权

总线驱动程序采取的行动取决于电源策略管理器要求的设备功率级别。 下面列出了总线驱动程序针对各级设置功率请求所采取的操作:

  • D0

    总线驱动程序执行以下任务

    1. 确保所有上游 USB 集线器都已通电并准备好接收请求。
    2. 如果设备的 USB 端口处于暂停状态,则通过清除 PORT_SUSPEND 功能恢复端口。
    3. 以 STATUS_SUCCESS 完成设备的空闲 IRP(如果有的话)。
    4. 如果设备已布防,则解除布防以便远程唤醒。
  • D1/D2

    总线驱动程序执行以下任务

    1. 如果等待唤醒 IRP (IRP_MN_WAIT_WAKE) 待定,则启动设备进行远程唤醒。
    2. 通过设置 PORT_SUSPEND 功能暂停设备的 USB 端口。
  • D3

    总线驱动程序执行以下任务

    1. 通过设置 PORT_SUSPEND 功能暂停设备的 USB 端口。
    2. 完成设备的等待唤醒 IRP,如果有 STATUS_POWER_STATE_INVALID(等待唤醒)的话。
    3. 完成设备的空闲 IRP (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION),如果正在等待 STATUS_POWER_STATE_INVALID。

更改复合设备的电源状态

复合设备上接口的客户端驱动程序必须与设备上其他接口的客户端驱动程序共享复合设备的电源状态。 因此,一个接口的客户端驱动程序无法在不影响设备上其他接口的情况下,让复合设备进入低功耗状态。 当接口的客户端驱动程序发送 IRP_MN_SET_POWER 请求时,USB 通用父驱动程序 (Usbccgp.sys) 会采取以下操作。

  • D0

    总线驱动程序执行以下任务

    1. 确保所有上游 USB 集线器都已通电并准备好接收请求。
    2. 如果设备的 USB 端口处于暂停状态,则通过清除 PORT_SUSPEND 功能恢复端口。
    3. 完成客户端驱动程序的空闲 IRP(如果有),并显示 STATUS_SUCCESS。
  • D1/D2

    总线驱动程序没有采取任何行动。

  • D3

    总线驱动程序执行以下任务

    1. 完成客户端驱动程序的等待唤醒 IRP (IRP_MN_WAIT_WAKE),如果有 STATUS_POWER_STATE_INVALID 待执行。
    2. 完成客户端驱动程序的空闲 IRP(IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION),如果正在等待 STATUS_POWER_STATE_INVALID。

当以下条件之一为真时,通用父驱动程序会暂停设备的 USB 端口:

  • 系统正在向低功耗状态过渡。
  • 复合设备上所有功能的客户端驱动程序启动了选择性挂起。