摄像头电源管理

电源管理模式

摄像头子系统的片上系统 (SoC) 外部组件必须支持两种电源管理模式。 摄像头组件必须支持活动模式,在该模式下,摄像头设备在主动将内容流式处理到应用程序。 此外,摄像头组件必须支持电源移除模式,在该模式下,摄像头设备会关闭,电源移除会,并且摄像头设备消耗 0 瓦。 下表介绍了摄像头设备的活动和电源移除电源管理模式。

“模式” 说明 设备电源状态 (Dx) 平均功率消耗 退出延迟到活动状态 转换机制

活动(流式处理)

摄像头设备在主动将内容流式处理到应用程序。 内容可能是全运动、预览或静态照片捕获。

特定于传感器、AF 和闪光灯。

不适用

软件启动的 D0 转换。

(应用程序通过将捕获引脚的状态设置为 KSSTATE_ACQUIRE 启动了流式处理。)

电源 - 已移除

摄像头设备未将内容流式处理到任何应用程序。 摄像头传感器、闪光灯设备或自动聚焦引擎上不会保留任何上下文。

0 瓦

到第一帧的时间 < 200 毫秒(请参阅下表中的说明。)

软件启动的 D3 转换。

(所有流式处理引脚的状态都已设置为除 KSSTATE_RUN 之外的任何值。)

注意 Windows 期望从活动模式到电源移除模式的转换时间(关闭延迟)小于 100 毫秒。 大多数电源管理工作侧重于减少从电源移除模式到活动模式的转换时间(打开延迟)。

SoC 内部图像处理单元必须支持相同的两种电源管理模式(活动和电源移除)。 SoC 供应商定义构成图像处理单元及其电源管理状态的各个组件。 建议由单个驱动程序控制 SoC 内部图像处理单元,并且将用于摄像头捕获的所有图像处理单元作为单个电源管理组件呈现给电源引擎插件 (PEP)。

软件电源管理机制

当系统处于联网待机状态且显示器处于关闭状态时,片上系统 (SoC) 内部图像处理单元和 SoC 外部摄像头组件都不应耗电(零瓦特)。 电源管理的主要软件机制是对摄像头捕获引脚进行引用计数。 此引用计数由摄像头控制器驱动程序进行维护,该驱动程序是一种 AVStream 微型驱动程序。 每当系统打开时(包括系统显示器打开时)都可以使用此基本电源管理机制。

摄像头控制器驱动程序应将电源管理状态转换转发到控制 SoC 外部组件(如摄像头传感器、自动对焦器和闪光灯)的驱动程序。 在响应中,控制这些设备的驱动程序应执行特定操作来更改电源状态以及移除或应用电源。

摄像头子系统应该通过单个 AVStream 微型驱动程序(称为控制器驱动程序)向 Windows 公开。 建议摄像头控制器驱动程序不直接访问硬件,并且不直接对硬件组件进行电源管理。 相反,摄像头控制器驱动程序应将电源管理和硬件请求转发给构成摄像头子系统的其他驱动程序。

SoC 内部图像处理硬件应由 SoC 电源引擎插件 (PEP) 进行电源管理。 图像处理硬件应由 Windows 驱动程序框架 (WDF) 驱动程序进行管理,此驱动程序应通过将 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构中的 IdleTimeout 成员设置为 SystemManagedIdleTimeout 来启用与 PEP 的协作。 此设置使 PEP 可以控制 SoC 硬件独有的任何时钟和电源轨共享拓扑。 控制 SoC 内部图像处理单元的驱动程序应将整个图像处理单元表示为单个电源管理组件,以便可以使用电源管理的默认 WDF 功能。

SoC 外部摄像头子系统组件应由一个或多个内核模式驱动程序框架 (KMDF) 驱动程序进行管理。 SoC 外部组件的驱动程序在摄像头捕获不再需要其组件时,必须转换为电源移除 (D3) 状态。 此外,SoC 外部组件的驱动程序必须启用 D3cold,这使基础 ACPI 子系统可以更改 GPIO 线路的状态以应用和移除电源。 有关详细信息,请参阅在驱动程序中支持 D3cold

下面的框图显示了建议驱动程序体系结构。

the recommended driver architecture for the camera subsystem

构成摄像头子系统的所有驱动程序(包括摄像头控制器驱动程序、图像处理单元驱动程序和 SoC 外部摄像头组件的驱动程序)必须在同一驱动程序安装 (.inf) 文件中进行枚举。 所有摄像头子系统驱动程序都必须是图像处理 PnP 设备设置类的成员。 图像处理设备的 ClassGuid 为 {6bdd1fc6-810f-11d0-bec7-08002be2092f}。

表示单个摄像头组件的每个驱动程序都应作为 ACPI 命名空间中的单个设备进行枚举。

活动状态和电源移除状态

当没有任何应用程序从摄像头设备流式处理内容时,摄像头控制器驱动程序必须将摄像头设备转换为电源移除状态。 应用程序可能会停止流式处理,因为它已由用户关闭或转换到后台并挂起。

如果应用程序从设备处于电源移除状态的摄像头启动流式处理,则摄像头控制器驱动程序必须在 100 毫秒内将摄像头设备转换回活动状态。

为了更改各种摄像头子系统组件的电源状态,摄像头控制器驱动程序使用专有接口与构成摄像头子系统的其他驱动程序进行通信。 若要查询相应的接口,摄像头子系统驱动程序应使用标准方法,该方法用于发送检索一组函数指针的 IRP_MN_QUERY_INTERFACE I/O 请求。

当所有流式处理引脚都进入 KSSTATE_STOP 状态时,摄像头控制器驱动程序必须将摄像头设备置于电源移除状态。 当用户按下电源按钮且系统进入连接待机状态时,Windows 会自动挂起前台应用程序。 当捕获应用程序挂起时,Windows 运行时提供的摄像头捕获 API 会收到通知,并更改摄像头捕获引脚的状态,从而使它们进入 KSSTATE_STOP 状态。

当第一个流式处理引脚进入 KSSTATE_ACQUIRE 时,摄像头控制器驱动程序必须将摄像头设备(包括 SoC 内部图像处理单元)置于活动状态。

关联摄像头功能

摄像头传感器和闪光灯设备可能具有必须由驱动程序进行管理的其他平台级别功能。 这些功能可能包括以下这些:

  • 通过 I2C 总线启用、禁用和配置摄像头传感器。
  • 通过 I2C 总线配置闪光灯连拍速率和亮度级别。
  • 通过从闪光灯模块到 SoC 的 GPIO 线路检测闪光灯模块的热条件。

若要实现这些功能,摄像头设备驱动程序开发人员应使用下表中汇总的方法和指导。

函数 说明 硬件/固件连接 软件机制
传感器配置 枚举摄像头传感器硬件的功能或配置其当前操作模式。 通过 I2C 总线通信。 ACPI 命名空间中摄像头设备下的 _CRS 方法中介绍了 I2C 资源。

简单外设总线 (SPB) 输入/输出 (I/O) 请求接口用于与 I2C 主机控制器和摄像头传感器设备通信。

传感器事件检测 使用从摄像头传感器到 SoC 的 GPIO 线路引发事件或指示状态。 提供给摄像头设备的 GPIO 资源。 ACPI 命名空间中摄像头设备下的 _CRS 方法中介绍了这些资源。 指示事件信号的 GPIO 引脚必须描述为 GPIO 中断资源。

中断由驱动程序进行处理以响应 GPIO 事件。

SPB I/O 请求接口用于与传感器设备通信,以确定中断的原因。

闪光灯配置 为闪光灯设备配置连拍速率、已连接 LED 数或其他属性。 通过 I2C 总线通信。 ACPI 命名空间中摄像头设备下的 _CRS 方法中介绍了 I2C 资源。

SPB I/O 请求接口用于与 I2C 主机控制器和摄像头传感器设备通信。

与图像处理单元驱动程序的协调 通过 SoC 内部图像处理电路启动并协调捕获。 不适用

专用接口由管理图像处理单元的驱动程序进行公开。

摄像头设备枚举

为了识别平台中的摄像头设备,应用程序通常会对即插即用 (PnP) 管理器查询摄像头设备的实例。 每个 PnP 实例对应于单个摄像头设备。 为了识别此类实例,系统集成商在 ACPI 命名空间中定义了摄像头设备。 摄像头设备一次只能将内容流式处理到一个应用程序。 但是,应用程序可以同时从多个摄像头设备进行流式处理。

由摄像头控制器驱动程序(AVStream 微型驱动程序)表示的每个摄像头设备都必须在 ACPI 命名空间中枚举为图形驱动程序子级的单独设备。

作为特殊情况,如果 SoC 平台在其报告的分辨率或模式的任何组合下,无法同时从平台中的所有摄像头设备同时流式处理内容,则可以改为枚举单个摄像头设备。 但是,此实现需要认真考虑,只应在与 Microsoft 直接协作时才执行。

表示照摄像头子系统其余部分的设备(包括 SoC 内部图像处理单元以及 SoC 外部摄像头传感器、自动对焦器和闪光灯)应作为 ACPI 命名空间中的一个或多个设备进行枚举。 SoC 内部图像处理单元应枚举为与表示摄像头 SoC 外部组件的设备不同的设备。

摄像头电源管理清单

系统集成商、摄像头传感器供应商和片上系统 (SoC) 供应商应使用本文中的清单,以确保其系统电源管理设计与 Windows 10 兼容。

  • 选择摄像头传感器组件和集成摄像头设备时,系统集成商必须与 SoC 供应商进行通信和协作。
  • 摄像头控制器驱动程序开发人员必须执行以下操作:
    • 当应用程序不再从摄像头设备流式处理内容时,关闭摄像头硬件的电源。 (当所有捕获引脚处于 KSSTATE_STOP 状态时,会发生这种情况。)
    • 当应用程序从摄像头设备上的任何捕获引脚开始流式处理时,打开摄像头硬件的电源。
    • 开发一个用于管理 SoC 内部图像处理单元的 KMDF 驱动程序。 摄像头控制器驱动程序应使用自定义驱动程序接口向图像处理单元驱动程序告知启动或结束摄像头捕获。
    • 确保图像处理单元驱动程序已注册到 Windows 电源管理框架 (PoFx),以便 SoC 供应商提供的 PEP 可以控制图像处理单元硬件的电源管理。
    • 开发一个 Windows 驱动程序框架 (WDF) 驱动程序以管理每个用于管理 SoC 外部摄像头硬件(包括摄像头传感器、自动对焦器和可选闪光灯)的硬件组件。 摄像头控制器驱动程序应使用自定义驱动程序接口向 SoC 外部摄像头组件告知启动或结束摄像头捕获。
    • 确保当摄像头组件应关闭时,管理 SoC 外部摄像头硬件的驱动程序会启动 D3 转换,以便 ACPI 可获知 D3 转换,并可以从组件中移除电源。 • 确保当摄像头组件应打开时,管理 SoC 外部摄像头硬件的驱动程序会启动 D0 转换,以便 ACPI 可获知 D0 转换,并可以向组件应用电源。
    • 开发用于管理摄像头传感器硬件或闪光灯设备配置的任何驱动程序代码。
    • 向系统集成商告知管理摄像头传感器硬件或闪光灯设备所需的任何 GPIO 和 I2C 资源的预期排序。
    • 确保在相同驱动程序安装 (.inf) 文件中枚举构成摄像头子系统的所有驱动程序。
    • 确保构成摄像头子系统的所有驱动程序都是图像处理 PnP 设备安装程序类的成员。 图像处理设备的 ClassGuid 为 {6bdd1fc6-810f-11d0-bec7-08002be2092f}。
  • 系统集成商必须将平台 ACPI 固件设计为执行以下操作:
    • 将每个摄像头设备作为 ACPI 命名空间中的单独设备进行枚举。
    • 在 ACPI 命名空间中每个摄像头设备下包含一个 _PLD 对象,以指示摄像头是位于计算机正面还是背面。
    • 为每个摄像头设备在 ACPI 命名空间的根处包含一个电源资源。 给定摄像头设备(传感器、AF、闪光灯等)的所有 SoC 外部硬件组件都应在一个电源资源中。
    • 为每个电源资源实现 _ON 和 _OFF 控制方法,以便从驱动电源轨开关硬件的 SoC 更改 GPIO 引脚状态。
    • 在命名空间中每个摄像头设备下提供 _PR0 和 _PR3 方法,以引用每个摄像头设备及其关联硬件的电源资源。
    • 在 ACPI 命名空间中每个摄像头设备下提供 _CRS 对象,以枚举摄像头传感器和闪光灯硬件的 GPIO 和 I2C 资源。 GPIO 和 I2C 资源必须采用摄像头传感器驱动程序开发人员指定的顺序。
  • 系统集成商应设计平台硬件和电源路由,以便:
    • 每个摄像头设备都有自己的电源轨,可独立于其他摄像头设备的电源轨进行控制,并可从 SoC 通过 GPIO 引脚进行打开和关闭。
  • 系统集成商必须测试并验证以下方面:
    • 摄像头设备硬件在应用程序未使用摄像头设备时,不会消耗功率(0 瓦)。 系统集成商应使用检测的硬件来度量此功耗。