启用自定义 HID 迷你驱动程序的唤醒

本主题讨论如何使用自定义 HID 迷你驱动程序实现触控唤醒。

背景:用于触控唤醒的 HIDClass 电源策略

以下状态图说明了输入设备在支持触控唤醒电源策略时将处于的逻辑状态。

Logical states for the input device

注意:

  1. Dx = DEVICE_CAPABILITIES.DeviceWake
  2. 空闲计时器间隔为 1 秒

如何启用触控唤醒

  1. 确定用于触控唤醒的 D 状态,并使用下面“选择用于触控唤醒的 D 状态”部分中的指南获得一些指导,从而实现自定义 HID 迷你驱动程序。
  2. 根据“INF 要求”部分,生成一个 INF 以选择加入触控唤醒策略。
  3. 根据 OEM 要求和/或设备的外形因素,验证设备是否在使用相应的触摸手势时唤醒。 同时,验证它不会导致虚假的唤醒事件,并且启用此功能的功耗可以接受。 请参阅触控唤醒验证指南

选择用于触控唤醒的 D 状态

对于自定义 HID 迷你驱动程序,下图提供了有关如何在 D2 和 D3 之间进行选择的指导。 假设触摸控制器在其触控唤醒模式下需要主设备电源,当支持 D3Cold 时,建议将 D2 用于触控唤醒,因为 D3Hot 之后可能是 D3Cold,在这种情况下不可能实现触控唤醒。

Wake-on-touch D-state diagram

INF 要求

默认情况下,不会选择使用 HIDClass 触控唤醒电源策略。

对于使用自定义 HID 迷你驱动程序和 INF 的触摸控制器,OEM/IHV 应创建一个 INF,并将以下内容添加到其 DDInstall.HW 部分,以选择加入“触控唤醒”策略。

Include = input.inf

Needs = WakeScreenOnTouch.HW

如果设备已选择加入与触控唤醒策略冲突的任何其他 HID 策略,则将忽略其中任一策略。

如果设备有多个 HID 集合,包括触摸屏集合 (UsagePage:0xD, Usage:0x4) 和非触摸屏集合,则触摸固件应仅支持从触摸屏集合唤醒。 如果非触摸屏集合也可以发出唤醒信号,设备仍将返回到 D0 状态以耗尽电量。

了解何时启用或禁用触控唤醒

在触控唤醒情况下,HIDClass 会请求 IRP_MN_WAIT_WAKE 唤醒设备,然后请求 D-IRP 关闭触控设备电源。 在设备未使用的情况下,HIDClass 会直接请求 D-IRP 关闭触控设备的电源,而无需先请求 IRP_MN_WAIT_WAKE。

  • 如果自定义解决方案将 D2 用于触控唤醒,并将 D3 用于“设备未使用”,则它可能只依赖 D-IRP 中的 D 状态来区分两种情况,并只在使用 D2 时启用触控唤醒。
  • 如果自定义解决方案在这两种情况下都使用 D3,则必须依赖于 IRP_MN_WAIT_WAKE 的存在来区分两种方案,并在 IRP_MN_WAIT_WAKE. 后获取 D3 请求时启用触控唤醒。

建议自定义 HID 迷你驱动程序不依赖于任何其他系统通知(如 GUID_MONITOR_POWER_ON),因为这可能会导致 HIDClass 请求的 IRP_MN_WAIT_WAKE 和 D2/D3 出现计时问题。

设备重置通知

这不是特定于触控唤醒的要求,而是针对 HID 迷你驱动程序的一般要求。 自定义 HID 迷你驱动程序负责在发现设备状态丢失和需要重新初始化设备时完成 IOCTL_HID_DEVICERESET_NOTIFICATION。 这可以在设备启动的重置处理程序中实现,也可以在驱动程序的 D0Entry 例程中实现,例如在它检测到来自 D3Cold 的恢复之后。