SDM660是Qualcomm骁龙660移动平台的代号,这颗芯片在2017年发布后,几乎成了中端机的代名词。OPPO R11、小米Note 3、vivo X20这些当年的爆款都用它,一直到今天,还有不少IoT设备、行业终端在沿用这套方案。所以如果你手里正好有一块SDM660的板子要调,或者正在做基于这颗SoC的电源管理设计,这篇文章就是写给你的。
我最早接触SDM660是给一台带屏智能音箱做主控选型,当时看中它的原因很简单:性能够用、出货量大、PMIC方案成熟。但真正把板子拿到手开始调电源,才发现这里面的门道比想象中多得多。尤其是电源部分,SDM660用的是PM660+PM660L双PMIC架构,和当年骁龙835那套单PMIC的思路完全不一样,配置起来坑不少。
这篇文章我不打算给你念芯片手册,也不做PPT式的架构图罗列。我按实际调试项目的顺序,把SDM660电源部分的架构解析、关键电源轨配置、时序要求、常见错误和调试方法一条条讲清楚,都是我在真实项目中踩过坑、拿示波器一针一针量出来的经验。
1. 电源架构拆解:为什么SDM660要挂两颗PMIC
先搞清楚整体框架,后面调起来才不迷糊。
SDM660的PMIC方案是PM660加PM660L组合。看过SDM660参考设计的人都知道,这俩PMIC各有分工:PM660是主PMIC,负责SoC核心供电、内存供电、IO供电这些"命脉"电源;PM660L则偏向显示、音频、充电相关的高压或模拟电源。
具体分工大致如下:
- PM660:输出VDD_CX(CPU/GPU核心)、VDD_MX(内存相关)、VDD_APC(应用处理器核心)、VDD_SRAM等关键电源轨
- PM660L:负责LCD背光供电、摄像头AVDD、音频编解码器电源、USB PHY电源、部分传感器供电
为什么要拆成两颗?核心原因是SDM660有独立的调制解调器(Modem)和应用处理器(AP),两者对电源噪声的要求不同。Modem部分对电源纹波极其敏感,单独用一颗PMIC供电,可以物理上隔离来自AP高速开关带来的电源干扰。这在当年是个很有实用价值的决策,尤其是SDM660这代芯片加了CDMA基带,射频和数字部分共用PCB,电源隔离做不好,灵敏度直接崩。
还有一个现实考虑:功耗和散热。双PMIC可以把发热源分散,不至于像单PMIC那样所有降压转换器挤在一起,充电加游戏场景下板面温度能差出2到3摄氏度。对于主打轻薄的中端手机来说,这个差距就是卖点。
我们的板子用的是标准PM660+PM660L组合,FPC连接器接线,和手机上的连接方式保持一致,方便后续直接搬到量产机型上。如果你做的是IoT模块,也可以只挂其中一颗,但那就需要手动关掉未使用PMIC的对应电源域,操作空间不小,后面会讲。
2. 关键电源轨配置与参数选择
2.1 VDD_CX与VDD_MX:SoC核心命脉
先讲最核心的VDD_CX和VDD_MX。
VDD_CX供给CPU和GPU的核心逻辑,是SDM660所有电源轨里电流变化率最高的一个。它由PM660的S1降压器输出(有的设计里叫BUCK1),默认配置电压是0.8V左右,但实际电压会根据运行频率动态调整,最高能到1.0V上下。
VDD_MX供给内存控制器、L3缓存和部分数字逻辑,由PM660的S2降压器输出,默认1.1V左右。
这两个电源轨最关键的一点是:它们的电压不是固定值,而是由硬件自动电压调节(AVS)控制的。也就是SoC根据自身工艺偏差和温度,动态请求PMIC调整输出电压。这就意味着,你在配置表里写的那个电压只是一个"期望值",真正跑起来是多少,要看SoC和PMIC之间的握手结果。
我遇到过工程师在这里犯的最大的错误:为了省电,手动把VDD_CX的固定电压调低。结果跑高频跑不起来,系统随机重启。后来查下来,是AVS机制被绕过了,SoC在高频时需要的电压高于手动设定值,逻辑就出错。记住一句话:SDM660的VDD_CX和VDD_MX,千万不要手动固定电压,除非你明确知道自己要干什么。
正确做法是:在PMIC配置脚本里,只设置最小和最大电压边界,然后交给AVS硬件控制环去动态调整。最小边界关系到最低频能否稳定运行,最大边界关系到射频拉满时是否够电压,这两个值在参考设计里都有推荐值,直接抄作业即可。
2.2 VDD_APC:应用处理器核心的调压策略
VDD_APC是SDM660的应用处理器(Application Processor Core)专用供电,由PM660的S3/S4降压器提供。这里的APC对应的是Kryo 260核心,分大小核,所以VDD_APC实际上可能是多路,大核小核各有独立供电。
大核(Kryo 260 Gold)电压相对高,峰值电流能到好几安培,所以PM660上用了两个降压器并联输出,以提供足够的电流能力。小核电压低一点,但也不能含糊。
这里的配置要点和VDD_CX类似,也是AVS参与动态调整。但区别在于,VDD_APC的动态响应要求更高——因为CPU频率可以毫秒级跳变,电压必须能跟上频率的变化。这就是为什么PM660上的降压器要选支持快速瞬态响应的模式。
调试时有一个非常实用的指标:负载瞬态响应。具体做法是写一个循环脚本,让CPU在最低频和最高频之间快速切换,同时用示波器看VDD_APC波形。正常的波形应该是在频率切换瞬间,电压有一个轻微的下冲(几十毫伏),然后迅速回到目标值。如果下冲超过100mV,或者恢复时间超过几十微秒,就要检查补偿网络参数或者降压器的开关频率设置。
2.3 内存供电:VDD_MEM与VDD_QDRI
内存相关的电源轨有两条:VDD_MEM供LPDDR4/LPDDR4X内存颗粒的核心电压,一般1.1V;VDD_QDRI供内存IO接口,一般1.8V。
这两路看着简单,但坑不少。内存供电最怕的是上电时序不满足要求,导致内存初始化失败,现象就是系统能开机但经常死机,或者干脆点不亮。
LPDDR4的电源时序要求非常严格:VDD1(内核)要先于VDD2(IO)到达,两者之间至少要有1微秒的间隔;VDDQ(IO)要在VDD2稳定之后才能拉起来。如果你的设计里这两路电分别来自不同的降压器,控制好了时序顺序;如果来自同一颗PMIC的不同输出,PMIC内部通常已经处理好了顺序,只需要在配置脚本里确认对应的上电序列是否正确即可。
调试小技巧:如果点不亮,别急着查代码。用示波器探头同时抓VDD_MEM和VDD_QDRI的上升沿,量一下两者的时序。如果顺序反了或者间隔不足,大概率就是这个原因。这个检查十次里有七次能命中问题。
2.4 其他电源轨的配置注意事项
除了上面几路大电源,还有一堆小电源轨需要关注。这里挑几个容易出问题的讲。
VDD_PX是外设IO供电,1.8V。它供的是UART、I2C、SPI这些低速接口的电平。如果这个电压不对,外设通信会时好时坏。我遇到过一个板子,I2C读传感器数据经常出错,查了两天才发现是VDD_PX的纹波超标,示波器一看峰值有100多mV,直接把I2C的高电平判读弄乱了。后来在输出端加了2.2uF的MLCC,问题立刻解决。
VDD_TSSC是触摸屏控制器供电,1.8V。看着不起眼,但触摸屏的灵敏度和上报延迟很大程度上取决于这路电的纯净度。如果屏幕触摸偶尔没反应,先量这路电压,再看看PMIC这边是不是有别的负载在开关时把纹波打进去了。
VDD_EBI是外部总线接口供电,也归内存子系统管,一般跟着VDD_MEM走,不用单独操心。但注意在配置表里别把它漏了,漏了的话内存训练会报错。
USB PHY供电也是容易被忽略的地方。PM660L上的USB PHY供电如果配得不对,会表现为USB识别不稳定、枚举失败、设备断开重连。当年我们还遇到过USB只能在低温下正常工作,温度一高就掉线,排查下来是USB PHY供电的LDO在高温下压降变大,供过去的电压不够了。
3. 启动时序与掉电时序:让SoC按正确顺序苏醒和入睡
3.1 上电时序配置要点
SDM660对上电时序的要求,本质上是按"先时钟后核心"的逻辑。具体来说,最关键的一步是:VDD_CX和VDD_MX必须先建立,然后才允许SoC的时钟开始起振,最后才是复位信号释放。
为什么是这个顺序?因为SoC的核心逻辑和内存控制器在时钟起来之前就必须有电,否则时钟控制逻辑处于未定义状态,锁定环(PLL)上电后无法锁定,整个系统就起不来了。这就像人必须先有呼吸(电源),然后心跳(时钟)才能起来,最后大脑复位(复位信号)才能开始运作。顺序搞反了,后面全是白费。
PM660/PM660L的时序控制有两种方式:硬件引脚控制和软件控制。硬件方式是用PMIC的GPIO做时序互锁,比如VDD_MX起来了,拉高一个GPIO,通知PM660L可以开始输出VDD_APC。软件方式是让PMIC按照预先烧写的序列自动执行。
我建议你用混合方式:关键电源轨的时序用硬件互锁,这能保证即使软件崩溃,电源也不会乱序;非关键的电源轨(比如外设供电)可以交给软件控制,以便于调试时灵活开关。
在pm660_regulator.c驱动的初始化日志里,你会看到类似这样的输出:
pm660_regulator_probe: regulator S1 registered, voltage range 388000-1352000 pm660_regulator_probe: regulator S2 registered, voltage range 388000-1352000这里的电压范围不是直接写死的,而是从设备树里的regulator-min-microvolt和regulator-max-microvolt字段读出来的。你在修改设备树时,只需要改这两个值,驱动就会自动更新可调范围。
3.2 掉电时序:更容易被遗忘的坑
上电时序讲的人多,掉电时序讲的人少,但掉电出问题的概率一点不低。
SDM660关机时的掉电顺序要求:VDD_APC先掉,然后VDD_CX,最后VDD_MX。原因很简单:VDD_MX供着内存控制器,如果它在CPU和总线的电之前掉,内存控制器的逻辑会处于不确定状态,可能导致漏电甚至闩锁效应。
我遇到过的一个实际案例:设备关机后功耗高,整块板子在待机状态下还有200mA电流。查了一个礼拜,最后发现是掉电顺序错了——VDD_MX比VDD_APC先掉电,导致SoC内部一部分逻辑电路没有完全放电,形成了一条低阻抗漏电路径。
修这个问题的办法是修改PMIC的掉电序列配置。在PM660L的寄存器里,PWR_DWN_SEQ寄存器控制着各路输出的掉电顺序。修改时需要保证三个原则:核心先掉、内存后掉、IO最后掉。
3.3 从设备树的角度理解时序配置
在Linux内核里,SDM660的电源配置主要靠设备树文件。你会看到类似这样的节点:
&pm660_s1 { regulator-min-microvolt = <388000>; regulator-max-microvolt = <1352000>; qcom,init-voltage = <750000>; regulator-always-on; };这里的regulator-always-on不能随便加——加上后这一路电常开,会拉高待机功耗。但像VDD_CX这种路,不设always-on又可能在系统休眠时被关掉,导致SoC无法唤醒。正确的做法是配合regulator-system-load和regulator-ramp-delay,让内核的regulator框架自动管理开关时机。
ramp-delay这个参数很容易被忽略,但它直接影响电压切换速度。SDM660的CPU调频时,需要电压先变,频率后变(先升压再升频、先降频再降压)。如果ramp-delay设得太大,调频就会变慢,性能受影响;设得太小,PMIC的降压器来不及跟上CPU的请求,会报欠压错误。PM660推荐的ramp-delay是8000 到 20000 ns/V,参考设计里一般给12800,可以直接用。
4. 核心配置实操:从设备树到寄存器调试
4.1 参考设计中的电源树检查
拿到一块新板子,第一步别急着改代码,先检查电源树。我一般按下面这个清单过一遍:
- 拿万用表量各路电源的对地阻抗,排除短路——特别要注意VDD_CX和地之间的阻抗,如果低于几十欧姆,基本是SoC焊接问题或者PCB设计缺陷
- 拿热成像仪看PMIC周边温度,通电后如果局部温度明显高,就有漏电嫌疑
- 对照参考设计的电源树,确认每一路电源的供电来源和去向
这里的核心思想是:先确认硬件健康,再进行软件配置。省得后面软件调了半天,最后发现是硬件设计问题。
4.2 用APPSBL和LK阶段排查电源问题
SDM660平台的软件启动流程是:PBL(Primary Boot Loader)→ SBL1 → APPSBL(也就是LK/ABL)→ 内核。电源配置在前两个阶段基本就定死了,后面内核只是读取配置。
如果在LK阶段就出现电源问题,现象通常是不开机或者开机logo闪一下就黑屏。
排查方法:接上调试串口,打开LK的详细日志。在APPSBL阶段,你会看到完整的电源初始化记录。注意看有没有regulator probe failed或者voltage out of range的报错。这两个报错几乎都是设备树里电压配置超出PMIC支持范围导致的。
我之前遇到过一次:把VDD_CX的最小电压设成了300mV,结果PMIC直接报错拒绝工作。PM660L的S1电压范围是388mV到1352mV,低于388mV就不认。所以配置电压前,先查一下对应PMIC的电压范围表,网上能搜到PM660L的datasheet里关于S1-S6的完整列表。
4.3 实测波形与参数调优
板子能开机,只是第一步。真正考验功力的是把各个电源轨调到性能、功耗、稳定性的最佳平衡点。
我建议你按这个顺序测:
先测静态电压。在系统空载状态下,用万用表量各路主要电源的输出电压,和配置值对比,偏差应该在1%以内。如果偏差过大,检查反馈电路的分压电阻是否贴错。
再测动态响应。写一个CPU满负载脚本,以1秒为周期让CPU在最低频和最高频之间切换,同时用示波器抓VDD_APC的波形。观察以下几个指标:电压跌落幅度、恢复时间、是否有振铃。
最后测纹波。在系统稳定运行的状态下,用示波器的交流耦合模式,抓各路电源的纹波。一般来说,核心电源纹波控制在30mV以内没问题,超过50mV就需要警惕了。
纹波超标的处理优先级:先确认MLCC电容布局够不够(开关节点附近至少要保证一颗0.1uF加一颗1uF),再看是不是和别的电源轨共地导致的地弹。如果这两个都没问题,再考虑在输出端加一颗小容量的高频电容。
4.4 电源管理集成电路(PMIC)寄存器调试实战
配置阶段需要操作PMIC寄存器时,可以用高通的SPMI总线直接访问。在Linux的shell环境里,可以用下面的方式来读写PM660的寄存器:
# 查看PM660 S1寄存器的电压配置(SPMI地址0x01对应PM660主设备) cat /sys/kernel/debug/pmic/spmi/pm660_s1/voltage # 手动设置电压(调试用,正式量产不建议) echo 750000 > /sys/kernel/debug/pmic/spmi/pm660_s1/voltage不过更常用的方式是直接在设备树里改电压范围,让驱动自动计算寄存器值。PM660的电压查找表是一个离散的步进式列表,不是连续的。你写一个750mV的电压值,驱动会就近查找最匹配的那一个档位,可能是752mV。这个问题不大,但如果你的外设对电压精度有要求,需要注意这一点。
调试时还有个小技巧:用示波器抓SPMI总线的波形,确认PMIC确实是按照你配置的寄存器值工作的。如果SPMI通信异常,你改的配置不会生效,但软件的报错信息可能不明显。遇到过SPMI走线过长导致时序违规,配置时好时坏,一阵一阵,最后示波器一看,时序边沿已经很难看了,拉大驱动强度才解决。
5. 常见故障排查与实战笔记
5.1 开不了机的电源排查思路
先说结论:SDM660设备开不了机,80%的概率和电源时序、电压范围配置有关。排查思路按以下层级展开。
先看上电瞬间是否有关键电源输出。用示波器同时抓VDD_CX、VDD_MX和复位信号。如果三个信号都没有,问题在PMIC的启动条件,比如PMIC的使能引脚没拉起来,或者主电池电压检测有问题。
如果VDD_MX有了,但VDD_CX没起来,问题大概率在PMIC的时序配置上。查一下设备树里VDD_CX对应的regulator是否定义了supply-on-sequence。
如果VDD_CX也有了,但SoC不跑代码,查一下复位信号的时序。SDM660要求复位信号在VDD_CX稳定后至少保持若干毫秒的低电平,然后才释放。如果复位释放太早,SoC内部的电源管理单元还没准备好,代码就跑飞了。
5.2 待机功耗高的排查思路
待机功耗高,首选排查掉电时序,这个前面已经说过。如果掉电时序没问题,再用排除法,把各路电源从设备树中一个一个去掉,去看待机功耗的变化。
这里有一个容易被忽视的点:GPIO状态。SDM660的很多GPIO在芯片内部有内部上拉或下拉,默认状态可能是拉高的。如果某个GPIO在休眠时没有被正确配置为输入,它会通过内部上拉持续灌电流。一个GPIO漏电可能只有几十微安,但几十个GPIO加起来,待机功耗就会从几十毫瓦涨到几百毫瓦。
检查方法:遍历所有GPIO,看它们在休眠时的默认状态,确保不需要输出的引脚被设置成高阻输入。
5.3 频繁重启的排查思路
SDM660如果运行过程中频繁重启,先看是不是VDD_CX在高频时欠压。SDM660在频率切换到最高档位的瞬间,需要的电流可能从几百毫安跳到几安培,这个电流变化率非常快。如果PMIC的降压器响应不够快,VDD_CX电压就会被拉低,SoC检测到欠压,触发保护重启。
排查方法:系统活着的时候,用示波器持续抓取VDD_APC波形。如果发现重启前电压有明显跌落,说明是供电问题。解决方案有几个:换用更高开关频率的降压模式;在VDD_APC输出端加更大的输出电容;或者降低CPU的最高频率上限,避开瞬态响应跟不上的场景。
5.4 一个真实案例复盘:OTG供电导致的电源噪声
最后分享一个我记忆深刻的案例,因为它非常典型,也很有代表性。
有一块SDM660板子,带USB OTG功能。客户反馈设备在插入U盘时,屏幕会有轻微闪烁,触摸操作偶尔失灵。
排查过程:最初的直觉是屏幕驱动或触摸驱动问题,但排了很久没结果。后来用示波器抓电源,发现在插入U盘的瞬间,VDD_PX(1.8V IO供电)上出现了一个约200mV的毛刺,持续时间10毫秒左右。这个毛刺通过PCB的地平面耦合到了触摸控制器和屏幕接口的IO线上,导致显示和触摸同时受到干扰。
根因是USB OTG的VBUS供电和VDD_PX共用了同一条地回路,U盘插入瞬间的大电流通过地平面回流,抬高了参考地电位。
解决办法有两个,我最后都做了:一是在OTG的VBUS路径上加了一颗磁珠,滤除地弹带来的高频噪声;二是在PCB设计上把USB的地和模拟/IO地做了分离,用单点连接。
这个案例给我最大的教训是:SDM660的电源调试不只是看PMIC的配置,还要看整个系统的电源完整性和地平面布局。很多时候,问题不是PMIC本身,而是它周围的PCB环境。
6. 工具链与调试方法的建议
6.1 调试工具准备
一套趁手的调试工具能省一半的时间。我常用的配置如下:
- 示波器:至少4通道,带宽200MHz以上,推荐500MHz。抓电源波形时用无源探头搭配短地线弹簧,避免长地线引入额外电感
- 万用表:精度至少4位半,用于测量静态电压和阻抗
- 电子负载:用于模拟负载电流,验证PMIC的大电流输出能力
- 热成像仪:排查发热问题和漏电路径,效率比万用表高太多
- 逻辑分析仪:调SPMI协议时序时必用,能快速定位通信异常
6.2 调试流程小结
我习惯的顺序是:硬件健康检查 → 上电时序验证 → 静态电压校准 → 动态响应测试 → 纹波测试 → 待机功耗评估 → 系统压力测试。
每一步都有明确的目标和判断标准。比如上电时序验证的目标是确认各路电源的电平和顺序与参考设计一致;动态响应测试的目标是确认电压跌落和恢复时间在允许范围内。每一步过了再进下一步,不然越到后面越难定位问题。
6.3 量产阶段的电源配置注意事项
如果已经到了量产阶段,有几个事情必须提前做准备:
一是PMIC参数的校准数据要固化。每块板子的PMIC个体差异会导致输出有微小偏差,量产前需要做一次校准,把实际电压值和目标电压值的偏差记录在板上,然后由驱动在启动时读取并修正。SDM660方案里这个数据一般存在PMIC的OTP区域或者单独的EEPROM里。
二是设置好PMIC的保护参数。过压保护(OVP)、欠压保护(UVP)、过流保护(OCP)的阈值都要根据实际负载情况设置,不能太灵敏(正常工作时误触发),也不能太宽松(故障时不保护)。
三是考虑温度特性。PMIC的输出电压会随温度漂移,低温时电压会略低,高温时略高。这个特性对模拟电路影响较大,对数字电路影响较小。如果板子上有对电压敏感的模拟部分,比如RF前端,就需要特别注意。
最后再分享一个个人体会:电源调试里遇到的大部分棘手问题,其实都不是技术深度不够,而是没有按顺序排查。尤其是SDM660这种成熟平台,绝大多数故障都能通过"先时序后电压再纹波"的思路快速定位。保持耐心,一步一个脚印去验证,别跳步,就一定能把电源部分配置好。