拓扑概述
在 Windows 驱动程序支持方面,相机子系统包含芯片(SoC)上的非系统组件,例如相机传感器、可选的自动聚焦单元和闪存,以及可能具有其他关联的硬件。 相机硬件还包括 SoC 上的图像处理单元。
On-SoC 图像处理硬件必须由 SoC 供应商提供的电源引擎插件(PEP)进行电源管理。 映像处理硬件应枚举为 ACPI 中的单个设备,并由 Windows 驱动程序框架(WDF)驱动程序管理。 启用图像处理设备空闲超时的系统管理,以便 PEP 可以控制 SoC 所独有的时钟和电源轨共享拓扑。 每当摄像头设备关闭时,任何 SoC 内部图像处理硬件都必须关闭。
一些 SoC 设计具有共享功能块,用于同时执行相机捕获和其他图像和图形处理。 在使用这类 SoC 的平台中,SoC 供应商提供的 PEP 必须对此共享块的使用进行引用计数,并在所有客户端都空闲时将它关闭。
在某些平台上,On-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 是 IRP_MJ_POWER IRP,它指定了 PowerDeviceD3 的 DEVICE_POWER_STATE 枚举值。)Windows ACPI 驱动程序 Acpi.sys 会观察 D3 IRP,并执行由 ACPI 命名空间中摄像头设备下的 _PR3 对象标识的电源资源的 _OFF 方法。
上一段的最后一句话假定电源资源不向除一台相机设备以外的任何设备提供电源。 如果其他设备引用了此电源资源,则 Acpi.sys 仅在引用电源资源的其他所有设备已转换为 D3 之后运行 _OFF 方法。 有关详细信息,请参阅“启用到 D3cold 的转换”。
将相机硬件返回到主动电源状态的过程类似。 当相机控制器驱动程序检测到第一个流捕获引脚进入KSSTATE_ACQUIRE状态时,相机控制器驱动程序将与构成相机子系统的其他 On-SoC 和 off-SoC 组件的驱动程序通信。 作为响应,控制 SoC 上图像处理单元的驱动程序调用 IWDFDevice2::StopIdle 方法,该方法通知 PEP 应启用图像处理单元硬件。 相机控制器驱动程序告知控制非SoC相机组件的驱动程序,它们应该返回到活动状态。 这些驱动程序进而会调用 StopIdle 以向驱动程序框架告知硬件不再处于空闲状态,这会使 D0 IRP 流过摄像头设备驱动程序堆栈。 (D0 IRP 是 IRP_MJ_POWER IRP,它指定了 PowerDeviceD0 的 DEVICE_POWER_STATE 枚举值。)Acpi.sys 会执行由 ACPI 命名空间中摄像头设备下的 _PR0 对象标识的电源资源的 _ON 方法,从而响应 D0 IRP。
如果平台有多个相机设备,则每个相机设备应具有自己的独立可切换电源轨和电源资源,如 ACPI 命名空间中所述。 对于 ACPI 命名空间中的每个相机设备,系统集成商必须提供一个_PLD对象,该对象指示相机设备是位于计算机的正面还是背面。 如果相机设备内置于翻盖式计算机的盖子中,并在盖子打开时正对用户,则该设备的_PLD对象应指示相机位于平台前面。 如果相机设备内置于翻盖式计算机的盖子中,且当盖子打开时相机面向远离用户的方向,该设备的“_PLD”对象应指示相机位于系统的背面。
唤醒问题
摄像头设备硬件不得支持唤醒。 Windows 不希望相机设备能够在新式待机期间从其最低电源状态唤醒 SoC。 当用户按下相机按钮时,许多移动电话使 SoC 能够从睡眠状态唤醒。 相机按钮被 Windows 视为用户输入设备,其操作独立于并与相机设备的系统集成、电源管理、传感器及可选闪存分开。