USB 设备的远程唤醒

在暂停时可以响应外部唤醒信号的 USB 设备据说具有 远程唤醒 功能。 具有远程唤醒功能的设备示例包括鼠标、键盘、USB 集线器、调制解调器 (环形唤醒) 、NIC、电缆插入唤醒。 所有这些设备都能够生成远程唤醒信号。 无法生成远程唤醒信号的设备包括摄像机、大容量存储设备、音频设备和打印机。

支持远程唤醒信号的设备驱动程序必须发出 IRP_MN_WAIT_WAKE IRP(也称为等待唤醒 IRP)来武装设备进行远程唤醒。 支持具有 Wake-Up 功能的设备部分中介绍了等待唤醒机制。

USB 叶设备上的远程唤醒

在 USB 术语中,设置 USB 设备DEVICE_REMOTE_WAKEUP功能时,会启用远程唤醒。 USB 规范指定主机软件必须在“仅在将设备置于睡眠状态之前”设备上设置远程唤醒功能。

因此,在收到设备的等待唤醒 IRP 后,USB 堆栈不会在设备上设置DEVICE_REMOTE_WAKEUP功能。 相反,它会等待,直到收到 IRP_MN_SET_POWER 请求,将设备的 WDM 设备状态更改为 D1/D2。 在大多数情况下,当 USB 堆栈收到此请求时,它会在设备上设置远程唤醒功能,并通过暂停设备的上游端口使设备进入睡眠状态。 设计和调试驱动程序时,应记住,通过等待唤醒 IRP 在软件中为 USB 设备提供唤醒与通过设置远程唤醒功能在硬件中为设备提供唤醒之间存在着松散的关系。

当收到将设备更改为 D3 睡眠状态的请求时,USB 堆栈不会为设备启用远程唤醒,因为根据 WDM 电源模型,D3 中的设备无法唤醒系统。

连接或分离 USB 设备时的唤醒行为

WDM 电源模式的 USB 实现的另一个独特方面是连接 USB 集线器以便进行远程唤醒。 如果总线上的 USB 叶设备用于唤醒,则 USB 堆栈还会为 USB 主机控制器提供唤醒的武装,但它不一定将任何 USB 集线器上游设备武装起来。 仅当 USB 堆栈配置为在连接时唤醒系统并分离 (插头/拔出) 事件时,USB 集线器驱动程序才会为集线器提供远程唤醒。

UHCI) USB 主机控制器 (通用主机控制器接口不区分根集线器端口上的远程唤醒信号和连接更改事件。 这意味着,当 USB 设备连接到根集线器端口或从根集线器端口断开连接时,如果 UHCI 控制器后面至少有一个设备用于唤醒,系统将始终从低系统电源状态唤醒。