3. 骁龙平台电源管理架构:RPMh/SPM、LDO/SMPS电源轨、Power Collapse状态

在骁龙(Snapdragon)平台上,Sensor 子系统的上电与掉电并非由应用处理器(APSS)直接控制,而是通过一套层次化的电源管理架构完成。理解 RPMh(Resource Power Manager hardened)、SPM(Subsystem Power Manager)、LDO/SMPS 电源轨以及 Power Collapse 状态,是定位 Sensor 上电时序问题的关键前提。

3.1 电源管理核心组件:RPMh 与 SPM

骁龙平台采用“Always-on, Low-power”设计哲学,将电源状态决策下沉到硬件微控制器中。RPMh 是 SoC 级别的电源管理固件核心,而 SPM 则是每个子系统(如 MSS、LPASS、Sensors)内部的电源状态机。

组件 全称 所在位置 主要职责
RPMh Resource Power Manager (hardened) SoC 独立硬件模块 接收客户端请求,仲裁并配置 LDO/SMPS 电压与时钟;管理 SoC 级睡眠与唤醒
SPM Subsystem Power Manager 每个子系统内部(如 Sensors DSP) 管理本子系统的 Power Collapse 序列;与 RPMh 握手完成上下电
关键概念: 驱动代码(如 Sensor 的 I2C/SPI 驱动)不直接操作 PMIC 寄存器。驱动通过 rpmh_write() 或 qcom_rpmh_write() 接口向 RPMh 发送“电压请求”,RPMh 再通过 SPMI 总线配置 PMIC 的 LDO/SMPS 输出。
移植要点: 在 DeviceTree 中,Sensor 节点必须正确引用 vdd-supply 和 vddio-supply 等电源句柄。如果 RPMh 无法解析这些句柄,驱动 probe 阶段将返回 -EPROBE_DEFER,导致 Sensor 无法上电。
RPMh 与 SPM 交互架构 RPMh SoC 电源资源仲裁 SPM (Sensors) 子系统状态机 PMIC LDO / SMPS 输出 SPMI 请求 状态反馈 SPMI 电压配置 Sensor 驱动 (Linux Kernel) rpmh_write() → regulator_set_voltage() → 电源轨请求 ⚠ 故障排查要点 • 检查 DeviceTree 中 vdd-supply 是否指向正确的 PMIC 节点 • 使用 cat /sys/kernel/debug/regulator/regulator_summary 确认电压输出 • 若 RPMh 超时,检查 SPM 状态机是否卡在 Power Collapse 入口

3.2 LDO 与 SMPS 电源轨:Sensor 的生命线

PMIC 通过两种类型的电源轨为 Sensor 供电:LDO(低压差线性稳压器)和 SMPS(开关模式电源)。Sensor 通常使用 LDO,因为其纹波小、噪声低,适合模拟电路。

特性 LDO SMPS
效率 较低(压差大时效率低) 较高(可达 90%+)
输出纹波 极低(适合模拟/传感器) 较高(需额外滤波)
典型用途 Sensor VDD、VDDIO、PLL 供电 CPU/GPU 核心、DDR 供电
上电时间 较快(几十 μs) 较慢(需软启动)
驱动控制 通过 SPMI 设置输出电压与模式 通过 SPMI 设置输出电压与模式
常见故障: Sensor 上电时序失败往往是因为 LDO 的“输出放电”功能未正确配置。当 Sensor 进入 Power Collapse 时,LDO 应快速放电至 0V;若放电过慢,下次上电时 Sensor 可能检测到残留电压,导致初始化失败。在 DeviceTree 中,使用 qcom,ldo-auto-disable 或 regulator-ramp-delay 属性控制放电行为。

3.3 Power Collapse 状态:Sensor 的深度睡眠

Power Collapse 是骁龙平台中最深的睡眠状态。在此状态下,子系统的时钟被门控,电源轨被切断,寄存器内容丢失。Sensor 子系统进入 Power Collapse 后,必须通过完整的硬件复位序列才能恢复。

Power Collapse 的进入与退出流程如下:

  1. 进入条件: Sensor 空闲超时(通常由 RPMh 或 SPM 检测)。
  2. 保存上下文: SPM 将关键寄存器保存到 Retention RAM(RRAM)或 L2 Cache 中。
  3. 切断电源: SPM 通知 RPMh 关闭对应的 LDO/SMPS 电源轨。
  4. 退出触发: 硬件唤醒事件(如 Sensor 中断、GPIO 电平变化、RPMh 定时器)。
  5. 恢复电源: RPMh 重新使能 LDO/SMPS,等待电压稳定。
  6. 恢复上下文: SPM 从 RRAM 恢复寄存器,重新初始化 Sensor 硬件。
移植陷阱: 许多第三方 Sensor 驱动在 probe 时没有注册 suspend 和 resume 回调,或者回调中未正确处理电源轨的开关。这会导致系统进入 Power Collapse 后,Sensor 无法被正确唤醒,表现为“设备无响应”或“I2C 传输超时”。务必在驱动中实现 struct dev_pm_ops,并在 suspend_late 中调用 regulator_disable(),在 resume_early 中调用 regulator_enable()。
Sensor 子系统 Power Collapse 状态机 Active 正常工作,电源轨开启 Idle 空闲超时计数 Power Collapse 电源轨关闭,上下文丢失 Wakeup 恢复电源,复位 Sensor 空闲超时 SPM 决策 硬件唤醒事件 上下文恢复完成 ⚠ 关键时序点 1. LDO 电压建立时间 2. Sensor 复位释放时间 3. I2C 总线恢复时间 4. 驱动 probe 重试间隔

3.4 电源轨配置实战:DeviceTree 示例

以下是一个典型的 Sensor 节点 DeviceTree 配置,展示了如何绑定 LDO 电源轨并设置上电时序:

/* 在 PMIC 节点中定义 LDO */
pm8150_l5: regulator-pm8150-l5 {
    regulator-name = "pm8150_l5";
    regulator-min-microvolt = <1800000>;
    regulator-max-microvolt = <1800000>;
    regulator-always-on;          /* 注意:Sensor 通常不应 always-on */
    regulator-boot-on;
    qcom,ldo-auto-disable;        /* 进入 Power Collapse 时自动放电 */
};

/* 在 Sensor 节点中引用 */
i2c@880000 {
    status = "okay";
    sensor@48 {
        compatible = "vendor,sensor-xyz";
        reg = <0x48>;
        vdd-supply = <&pm8150_l5>;       /* 主电源轨 */
        vddio-supply = <&pm8150_l6>;     /* IO 电源轨 */
        interrupt-parent = <&tlmm>;
        interrupts = <32 IRQ_TYPE_EDGE_RISING>;
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&sensor_default>;
        pinctrl-1 = <&sensor_sleep>;
        /* 上电延迟:等待 LDO 稳定 */
        regulator-enable-ramp-delay = <100>;  /* 100 μs */
    };
};
调试命令: 在目标板上执行以下命令,可以实时查看电源轨状态:
cat /sys/kernel/debug/regulator/regulator_summary | grep pm8150_l5
输出示例:
pm8150_l5 1800000 1800000 1800000 1 0 sensor@48
如果 use_count 为 0,说明驱动未成功使能该电源轨。

3.5 故障排查清单

当 Sensor 上电序列失败时,按以下清单逐一排查:

步骤 检查项 验证方法
1 DeviceTree 电源句柄 确认 vdd-supply 和 vddio-supply 指向正确的 PMIC LDO
2 LDO 输出电压 使用万用表或 regulator_summary 检查电压值
3 上电时序延迟 检查 regulator-enable-ramp-delay 是否足够
4 Power Collapse 配置 确认 qcom,ldo-auto-disable 已设置,避免残留电压
5 驱动 PM 回调 检查 suspend/resume 是否正确开关电源轨
6 SPM 状态机 通过 cat /sys/kernel/debug/spm/spm_stats 查看状态
终极提示: 如果所有检查都正常,但 Sensor 仍然无法上电,请检查 PMIC 的 热关断(Thermal Shutdown) 标志。某些 PMIC 在过温后会锁存输出,直到 VPH_PWR 重新上电才能恢复。这在高温环境测试中尤为常见。