摄像头硬件

拓扑概述

在 Windows 驱动程序支持方面,摄像头子系统包含片上系统 (SoC) 外部组件(如摄像头传感器、可选自动对焦单元、闪光灯)以及可能的其他关联硬件。 摄像头硬件还包括 SoC 内部图像处理单元。

SoC 内部图像处理硬件必须由 SoC 供应商提供的电源引擎插件 (PEP) 进行电源管理。 图像处理硬件应在 ACPI 中作为单个设备进行枚举,并由 Windows 驱动程序框架 (WDF) 驱动程序进行管理。 启用图像处理设备空闲超时的系统管理,以便 PEP 可以控制 SoC 所独有的时钟和电源轨共享拓扑。 每当摄像头设备关闭时,任何 SoC 内部图像处理硬件都必须关闭。

某些 SoC 设计具有共享功能块,它会同时执行摄像头捕获以及其他图像和图形处理。 在使用这类 SoC 的平台中,SoC 供应商提供的 PEP 必须对此共享块的使用进行引用计数,并在所有客户端都空闲时将它关闭。

在某些平台中,SoC 内部图像处理硬件可能会在两个或更多摄像头设备之间共享。 在这种情况下,图像处理硬件会在摄像头设备之间进行多路复用。 每个摄像头设备的组件都应在 ACPI 命名空间中独立描述,并且应作为单独设备对象向 Windows 即插即用管理器进行枚举。

Windows 要求具有两个(或更多)嵌入式摄像头的平台能够采用各个摄像头支持的模式和分辨率的任意组合,同时使用(即,从中流式处理内容)这两个(或所有)摄像头。 无法满足此要求的 SoC 供应商必须直接与 Microsoft 合作,以获得有关实现其驱动程序和系统固件的指导。

支持的电源配置

Windows 支持新式待机平台中摄像头设备的单个硬件电源管理配置。 简而言之,每个摄像头传感器都必须通过 MIPI-CSI 链路连接到片上系统 (SoC),并可选择连接到 I2C 总线和一个或多个 GPIO 引脚。 摄像头传感器设备、其可选闪光灯和任何其他 SoC 外部摄像头组件必须置于可通过 ACPI 固件打开和关闭的电源轨上。

如果除了 MIPI-CSI 链路之外,摄像头设备还具有 I2C 或 GPIO 引脚来控制摄像头传感器或闪光灯设备,则这些引脚必须路由到 SoC 上的 I2C 控制器或 GPIO 控制器的对应引脚。 系统集成商必须在 ACPI 命名空间中摄像头设备下的 _CRS 对象中枚举摄像头传感器和闪光灯设备的 I2C 和 GPIO 资源。

注意 系统集成商应与摄像头子系统驱动程序开发人员合作,以确定摄像头驱动程序应如何排序 GPIO 和 I2C 资源。 例如,收到两个 I2C 资源的驱动程序会按照它们在资源列表中的出现顺序来区分它们。 同样,收到三个 GPIO 资源的驱动程序需要按特定顺序列出这些资源。 系统集成商必须在 _CRS 对象中按照相同顺序枚举 I2C 和 GPIO 资源。

摄像头传感器和闪光灯设备必须置于可通过 ACPI 控制方法打开和关闭的电源轨上。 建议使用来自 SoC 的 GPIO 引脚控制电源切换硬件。 GPIO 应在 GPIO 操作区域中进行枚举,以便 ACPI 控制方法可以更改其状态。 系统集成商必须在 ACPI 命名空间中描述摄像头设备(传感器、闪光灯或任何其他摄像头组件)的电源资源。 此资源必须包括 _ON 方法和 _OFF 方法,以更改路由到电源切换硬件的 GPIO 信号的状态。 在 ACPI 命名空间中的摄像头设备下,系统集成商必须提供引用电源资源的 _PR0 对象和 _PR3 对象。

当摄像头控制器驱动程序检测到所有流式处理引脚都已进入 KSSTATE_STOP 状态时,它会使用专用接口向控制 SoC 外部摄像头组件的驱动程序告知不再需要进行捕获。 这些驱动程序进而会调用 IWDFDevice2::ResumeIdle 方法,向驱动程序框架告知其硬件处于空闲状态。 作为响应,驱动程序框架会启动到 D3 的转换,这会使 D3 IRP 流过摄像头设备驱动程序堆栈。 (D3 IRP 是指定 PowerDeviceD3 的 DEVICE_POWER_STATE 枚举值的 IRP_MJ_POWER IRP。)Windows ACPI 驱动程序 Acpi.sys 将观察 D3 IRP,并执行按 ACPI 命名空间中相机设备下的 _PR3 对象标识的电源资源的 _OFF 方法。

上一段中的最后一句假设电源资源不会向任何一个摄像头设备之外的任何设备提供电源。 如果其他设备引用了此电源资源,则 Acpi.sys 仅在引用电源资源的所有其他设备都转换为 D3 后,才会运行 _OFF 方法。 有关详细信息,请参阅“启用到 D3cold 的转换”。

将摄像头硬件恢复为活动电源状态是类似的过程。 当摄像头控制器驱动程序检测到第一个流捕获引脚进入 KSSTATE_ACQUIRE 状态时,社跌停控制器驱动程序会与组成摄像头子系统的其他 SoC 内部和 SoC 外部组件的驱动程序通信。 作为响应,控制 SoC 内部图像处理单元的驱动程序会调用 IWDFDevice2::StopIdle 方法,该方法会向 PEP 告知应打开图像处理单元硬件。 摄像头控制器驱动程序会向控制 SoC 外部摄像头组件的驱动程序告知应恢复为活动状态。 这些驱动程序进而会调用 StopIdle 以向驱动程序框架告知硬件不再处于空闲状态,这会使 D0 IRP 流过摄像头设备驱动程序堆栈。 (D0 IRP 是指定 PowerDeviceD0 的 DEVICE_POWER_STATE 枚举值的 IRP_MJ_POWER IRP。Acpi.sys 通过执行按 ACPI 命名空间中相机设备下 _PR0 对象标识的电源资源的 _ON 方法来响应 D0 IRP。

如果平台具有多个摄像头设备,则每个摄像头设备都应在 ACPI 命名空间中描述自己的独立可切换电源轨和电源资源。 对于 ACPI 命名空间中的每个摄像头设备,系统集成商必须提供一个 _PLD 对象,该对象指示摄像头设备是位于计算机的正面还是背面。 如果摄像头设备内置到翻盖外形规格计算机的盖子中,并且在盖子打开时面对用户,则此设备的 _PLD 对象应指示摄像头位于平台正面。 如果摄像头设备内置到翻盖外形规格计算机的盖子中,并且在盖子打开时背对用户,则此设备的 _PLD 对象应指示摄像头位于系统背面。

唤醒问题

摄像头设备硬件不得支持唤醒。 Windows 不期望摄像头设备能够在新式待机期间将 SoC 从其最低电源状态唤醒。 许多移动电话使 SoC 可以在用户按下摄像头按钮时从睡眠状态唤醒。 摄像头按钮被 Windows 视为用户输入设备,其操作独立于摄像头设备、其传感器和可选闪光灯的系统集成或电源管理。