据说,可以在暂停时响应外部唤醒信号的 USB 设备具有 远程唤醒 功能。 具有远程唤醒功能的设备示例包括鼠标、键盘、USB 集线器、调制解调器(响铃唤醒)、网络接口卡、连接电缆时唤醒。 所有这些设备都能够生成远程唤醒信号。 无法生成远程唤醒信号的设备包括摄像机、大容量存储设备、音频设备和打印机。
支持远程唤醒信号的设备驱动程序必须发出 IRP_MN_WAIT_WAKE IRP(也称为等待唤醒 IRP),以使设备准备进行远程唤醒。 支持具有 Wake-Up 功能的设备部分中介绍了等待唤醒机制。
USB 叶设备上的远程唤醒
在 USB 术语中,当 USB 设备的 DEVICE_REMOTE_WAKEUP 功能被设置时,该设备的远程唤醒功能将被启用。 USB 规范规定,主机软件必须在“就在”将设备置于睡眠状态之前,设置设备上的远程唤醒功能。
因此,USB 堆栈在收到设备的等待唤醒 IRP 后,不会在设备上设置 DEVICE_REMOTE_WAKEUP 功能。 它将等待,直到收到 IRP_MN_SET_POWER 请求,然后将设备的 WDM 设备状态更改为 D1/D2。 在大多数情况下,当 USB 堆栈收到此请求时,它都会在设备上设置远程唤醒功能,并通过暂停设备的上游端口将设备置于睡眠状态。 在设计和调试您的驱动程序时,您应记住,通过等待唤醒 IRP 软件方式武装 USB 设备与通过设置远程唤醒功能在硬件上为设备武装唤醒之间存在松散的关系。
USB 堆栈在收到将设备更改为 D3 睡眠状态的请求时,不会为设备启用远程唤醒,因为根据 WDM 电源模型,D3 中的设备无法唤醒系统。
连接或分离 USB 设备时的唤醒行为
WDM 电源模式的 USB 实现中的另一个独特方面是关于启用 USB 集线器以支持远程唤醒。 如果总线上的 USB 端设备已准备唤醒,USB 堆栈也会为 USB 主机控制器设置为唤醒,但不一定会为设备上游的任何 USB 集线器设置唤醒。 仅当 USB 堆栈配置为在连接和断开(插拔)事件时唤醒系统时,USB 集线器驱动程序才会准备集线器以进行远程唤醒。
通用主机控制器接口(UHCI)USB 主机控制器无法区分远程唤醒信号和根集线器端口上的连接变更事件。 这意味着,如果 UHCI 控制器后面至少有一个设备处于唤醒状态,则当 USB 设备连接到根中心端口或从根中心端口断开连接时,系统始终会从低系统电源状态唤醒。