☰
MTK PE+2.0快充协议:D+/D-握手与VBUS阶梯调压实战解析
2026/10/6 16:48:34 网站建设 项目流程

写MTK平台开发的,几乎没人敢说自己没被充电问题折磨过。我做联发科方案调试这些年,第一次认真研究PE+2.0,就是因为一台机器插上原装快充头后电流死活上不去,VBUS一直稳在5V不动。后来把Pump Express那套机制从头到尾翻了一遍才明白,问题出在D+/D-的握手电平没被正确识别。这篇东西不打算讲PPT式的概念,而是从一个实际开发者的角度,把PE+2.0是什么、它的握手过程到底怎么走、开发调试时会踩哪些坑,一次说清楚。

1. 当年5V/1A是常态,PE+2.0到底要解决什么问题

1.1 USB-BC充电时代的瓶颈

2013年到2015年间,安卓手机的电池容量普遍在2500mAh到4000mAh之间,而USB 2.0标准口输出只有5V/500mA。后来USB-IF推出BC 1.2充电规范,通过D+/D-引脚做充电器类型识别,才把普通USB口的充电电流抬到大约1.5A。但对一块4000mAh的电池来说,5V/1.5A意味着理论充满需要接近3个小时,实际边充边用的话更久。

那个年代屏幕越做越大,SoC功耗水涨船高,电池容量增速又跟不上,厂商们只能从充电功率上想办法。我记得当时不少入门级MTK方案还在标配5V/1A充电器,而高通那边已经靠Quick Charge把充电功率拉到了10W以上。如果联发科不跟进,中低端市场会被高通方案彻底压着打。PE系列快充就是在这个背景下被推到前台的。

1.2 高通QC铺路之后,MTK必须拿出自己的答案

高通QC 1.0做的事情其实很朴素,就是在USB规范之外把电流从500mA提到2A,功率大约10W。QC 2.0开始引入9V/12V的高电压档位,通过D+/D-上的电压组合信息让充电器切换到指定输出电压,最大功率能做到18W左右。QC 2.0的机制并不复杂,但它证明了同一根Micro USB线缆下,通过改变VBUS电压就能大幅缩短充电时间,用户感知非常明显。

对MTK来说,问题在于它不想在充电协议这个关键环节上依赖高通的方案。MTK的平台自研程度高,从AP到PMIC、充电IC都希望形成自己的闭环生态,因此推出了Pump Express。PE+1.0是先头部队,档位固定在5V/7V/9V,真正被大规模商用、让开发者有深刻印象的,其实是PE+2.0。PE+2.0不支持高通QC的电压档位表,也不依赖USB-IF的标准枚举流程,它有一套自己的握手机制,这套机制在当时的MTK平台上被戏称为“充电头电压跟着手机走”。

1.3 从PE+1.0到PE+2.0,改进的核心在哪里

PE+1.0最大的局限是固定档位。手机告诉充电器“我要9V”,充电器就输出9V,但如果当前充电阶段的理想电压是7.5V或者8V,PE+1.0就无能为力了,只能在预设档位之间来回切换。档位切换还伴随VBUS上的跳变,处理不好会造成PMIC过压保护或者充电电流震荡。

PE+2.0最大的改进是引入了“连续调压”的思想。手机端不再直接指定目标电压,而是引导充电头从5V起步,按固定步进逐步升压,直到手机判断电压已经符合当前需求才喊停。这样电压不再是几个离散的档位,而是一个可以连续调整的区间。MT6735、MT6752、MT6795这一批平台上,配套的PMIC MT6351和充电IC广泛支持了这套逻辑。可以说,PE+2.0是MTK从“固定档位”走向“动态电压调节”的分水岭。

2. PE+2.0的握手机制——D+/D-电压编码与VBUS阶梯升压

2.1 谁在说话:D+/D-在快充协商中的角色

理解PE+2.0之前,必须先搞清D+/D-这两根线在握手过程中扮演的角色。USB 2.0的D+/D-本来是数据线,但在充电协商阶段并没有建立USB数据通信,协议就利用这两根线的直流电平来传递信息。

手机侧,PMIC或者充电IC内部有模拟开关,可以把D+或D-切换到某个电压源或电阻分压网络。适配器侧同样有一套检测电路,通过ADC或比较器采样D+/D-的电压,判断手机想干什么。PE+2.0的具体电压电平和组合方式属于协议内部的编码,不同版本的release note里描述略有差异,但基本原理都绕不开“手机在D+上拉出一个特征电平,适配器识别后调整VBUS”。我记得常见实现里,D+上会输出约0.5V到1V范围内的电平,D-则维持接地或低电平,这个组合对适配器来说就是一个“我是PE+2.0设备,请开始升压”的请求。

2.2 一次完整的PE+2.0握手时序

把整个握手过程拆开看,实际顺序是这样的:

  1. 充电器插入,VBUS从0V升到5V,手机PMIC检测到VBUS有效电压,触发插入中断。
  2. 手机先做一次充电器类型识别,区分SDP、CDP、DCP以及非标充电器。只有确认是DCP类型(专用充电端口)且不支持其他标准协议时,才会继续走到PE+2.0这一步。
  3. 手机在D+上输出特征电平,D-设置为低电平,适配器通过比较器检测到这个组合后,确认手机支持PE+2.0。
  4. 适配器开始从5V向上调整VBUS,步进一般控制在0.5V左右。每跳一档,都会等待手机端反馈,不会一口气升到最高。
  5. 手机PMIC实时采样VBUS的ADC值,与当前目标电压做比较。如果还没有到目标值,就保持D+电平不变,让适配器继续升压。
  6. 当VBUS达到目标电压,手机端改变D+状态(比如撤掉电平或者切换到另一个编码),适配器检测后锁定当前输出电压,握手完成。
  7. 充电过程中如果手机需要改变电压,比如从9V降到7V,就会重新发起一轮类似的调压序列。

整个过程看起来像两个人通过一根绳子拉扯:手机不松手,适配器就一直往上提;手机松手,适配器就停在当前高度。

2.3 “向上探”和“向下探”的判定逻辑

PE+2.0的调压并不是盲目的。手机内部会维护一个目标电压区间,这个区间由充电阶段的恒流/恒压策略决定。比如说电池电压在3.6V,当前充电电流设定为2A,考虑线缆压降和充电IC的Dropout电压,手机算出VBUS需要到9V左右。手机会先给出一个目标,然后让适配器以0.5V步进向上探。

探到目标电压附近后,手机不会立刻喊停,它会留出一个阈值窗口,防止负载变化时VBUS波动导致频繁升降。这个逻辑和后来QC 3.0的INOV(智能协商最佳电压)思路非常相似。当年QC 3.0宣传INOV是卖点,实际上MTK的PE+2.0已经用“逐步试探+滞回区间”实现了类似效果。开发时如果发现充电电压在某个值附近来回跳,多半是滞回窗口设置太小,或者D+电平切换的响应时间没匹配上适配器升压节奏。

2.4 PE+1.0与PE+2.0的协议级差异

直接列一个对比表,方便有PE+1.0经验的开发者快速定位差异:

对比项PE+1.0PE+2.0
调压方式固定档位,常见5V/7V/9V阶梯步进连续调压,约0.5V一步
协商过程依赖检测VBUS特征和档位切换手机端主动引导升压,反馈更直接
握手信号通过USB插入/拔插或VBUS变化触发通过D+/D-直流电平组合实时反馈
电压范围最高约9V常见支持到12V
功率上限约10W-18W常见18W-24W量级
兼容性对充电头要求高,容易识别失败改善了识别,但仍受D+/D-占用影响

这个表是我在实际开发中总结的,不是官方定义,但能帮助理解两代协议的核心差异。

3. 同是快充协议,PE+2.0和QC 2.0、USB PD到底差在哪

3.1 一个“主动索取”,一个“被动查询”

高通QC 2.0的协商逻辑是“手机直接告诉充电器我要哪个档位”。手机在D+/D-上施加一组固定的电压组合,比如0.5V、0.9V、1.3V、2.0V这些电平对应不同的电压档位,充电器识别到之后就切换到对应的VBUS输出。整个过程中,充电器处于被动查询状态,手机给出什么指令,它就执行什么指令,档位是预设死的。

PE+2.0不一样。手机并没有直接告诉充电器“给我9V”,而是让充电器从5V开始一步一步向上跳,手机在合适的位置喊停。这个主动索取模式的好处是,充电器不需要内置完整的电压档位表,只需要一个比较器和一个可调升压电路。做得好的适配器甚至可以只响应“升压/停止”两个指令,大大降低了充电头侧BOM成本。

USB PD就完全是另一套玩法了。PD通过CC线进行双向数据通信,用明文数据包协商电压、电流甚至功率方向,还支持PPS可编程电源。PD的协议栈复杂度远高于PE+2.0,好处是智能化程度高、标准化程度高,不同厂商之间互通性好。

3.2 同样是D+/D-,为什么QC和PE+2.0不能互通

QC 2.0和PE+2.0都用D+/D-作为协商通道,但两者的编码方式完全不同。QC 2.0靠D+/D-上不同的电平组合直接编码目标电压档位,PE+2.0则用D+上的特征电平作为“开始升压”的触发信号,然后通过VBUS升压过程来闭环反馈。这就像两个人都在同一个房间里说话,但一个说中文一个说英文,互相听不懂。

在MTK平台上,如果插入一个QC 2.0充电头,PMIC可能会尝试做PE+2.0握手,但QC 2.0充电头检测不到兼容的PE特征电平,就不会升压,最终VBUS停留在5V,按普通DCP方式5V充电。反过来,高通平台插入PE+2.0充电头也会出现类似情况。这也是当年很多用户发现“快充头插到别的手机上就只能慢充”的根源所在。

3.3 MTK为什么最终转向了PD

PE+2.0尽管成本低、实现简单,但它的封闭性太强了。只有MTK自家平台和通过认证的充电头才能完整跑通PE+2.0协议,第三方充电器厂商兴趣不大。Type-C普及之后,USB PD成为行业统一标准,再做一套封闭协议已经不合时宜。MTK从PE+3.0开始尝试和Type-C结合,到了PE+4.0实际上已经基于PD的PPS能力在做扩展。新平台上的Pump Express功能更多是兼容旧充电器的遗留模式,开发重心早就转移到PD/PPS上了。

回看这段路线选择,我觉得MTK在PE+时代建立的那套“实时反馈、动态调压”的思路并没有浪费,PPS里的AVS(自适应电压调节)模式和PE+2.0其实是一脉相承的。

4. MTK平台PE+2.0开发调试实录:日志、波形与那些坑

4.1 充电栈涉及的软硬件模块

在MTK平台上调试PE+2.0,首先要清楚一条指令从用户空间到硬件要经过哪些层。

  • 硬件层:PMIC负责VBUS检测、OVP、ADC采样和D+/D-电平切换;外置充电IC(如BQ25601、RT9466、SW2416)通过I2C与主控通信,负责充电电流控制、路径管理和保护。
  • 内核驱动层:MTK的charger manager和mtk_pump_express驱动负责PE+2.0的握手状态机。驱动会周期性检查VBUS电压、充电IC上报的电流和D+/D-状态,决定是否发起升压或停止升压。
  • 电源子系统和用户空间:power_supply class把充电状态映射到/sys/class/power_supply/目录下的节点,上层Android的healthd和BatteryService再读取这些节点展示电量、充电状态。

老平台(Android 4.4/5.x时代)上,常见的热词是“mtk kprow0 dws设置”“mtk gpio ies”。dws文件是MTK的GPIO配置工作表,D+/D-相关引脚如果在dws里被配置成别的功能,PE+2.0握手直接就废了。很多人折腾root、改充电脚本,其实硬件握手那一层根本就没跑起来,改上层毫无意义。

4.2 确认PE+2.0是否握手成功的几种手段

接上充电头后,第一步永远是确认协议有没有握手成功,而不是看电流有多大。我常用的确认手段有四种:

  1. 读PMIC和充电IC的寄存器。PMIC的CHRSTATUS、VBUS状态寄存器能直接反映是否检测到充电器,充电IC的VBUS ADC和I2C寄存器能看到当前VBUS电压。
  2. 抓内核日志。MTK的充电驱动会打印PE相关的状态切换信息,执行以下命令就能看到关键日志:
adb shell dmesg | grep -iE "pump|pe_2|chr_type|hiz|vbus"

正常握手时dmesg里能看到类似PE+2.0握手、目标电压切换的字段;一直停在5V不动,就说明根本没进PE状态。3. 读取power_supply节点。不同平台节点路径不完全一样,但常见的可以试:

adb shell cat /sys/class/power_supply/battery/voltage_now adb shell cat /sys/class/power_supply/mtk-master-charger/voltage_now

看VBUS电压是否从5V跳到7V、9V甚至更高,一秒钟就能判断有没有升压。4. 外接工具实测。USB电压电流表是性价比最高的工具,示波器则能抓D+/D-的波形变化。插上充电头瞬间,D+上应该出现一个特征电平,一直到VBUS到达目标才消失。

4.3 常见异常与完整排查链路

调试PE+2.0的过程中,我遇到的绝大部分问题可以归成三类。每一类都有相对固定的排查顺序,按照链路走能省很多时间。

问题A:插上PE+2.0充电头,VBUS始终5V,没有升压。

排查链路:

  1. 先排除充电头本身的问题。换一个原装同型号充电头,或者用自动检测的功率计确认充电头能输出9V/12V。
  2. 看dmesg里的chr_type,确认PMIC把充电器识别成了DCP还是SDP。识别成SDP说明D+/D-检测异常,驱动不会进入PE流程。
  3. 用万用表量D+对地电压。插上充电头的一瞬间,D+上应当出现特征电平。如果D+电压始终为0或者被拉得很低,检查D+/D-对应GPIO在dws里的配置,是否被设成输入、下拉或者复用成其他功能。
  4. 检查PMIC的OVP相关寄存器。如果之前热插拔导致OVP触发,PMIC会锁死VBUS路径,必须重新插拔或者复位才能恢复。
  5. 最后看充电IC的I2C通信是否正常。I2C总线异常会导致驱动无法配置充电IC,握手流程直接卡死。

我遇到过一例,排到第4步才发现PMIC的OVP阈值被改成了6V,充电头一开始升压就触发OVP,VBUS被拉回5V。这个阈值藏在PMIC寄存器配置里,默认可能没问题,但某些省功耗配置会顺手把它调小。

问题B:握手成功,VBUS升到9V了,充电10秒掉回5V。

排查链路:

  1. 先看是不是线缆压降。充电电流大时劣质线缆压降可能超过0.5V,手机端实际VBUS低于PMIC输入的最低要求,驱动会判定掉压并回退。
  2. 看温度。PMIC周围的NTC检测温度过高,MTK充电驱动会主动退出快充,日志里会打温度保护字段。
  3. 看充电IC的ILIM设置。如果输入电流限制配置得过小,大电流充电时充电IC会把VBUS拉垮,适配器检测到过载也可能回退。
  4. 看日志里是否有反复“升压—回退”的循环。这说明手机目标电压对应的门口和适配器实际输出的电压之间有偏差,通常要把目标电压的滞回窗口调大一点。

问题C:插普通5V/2A充电头,手机却错误地进入了PE+2.0流程,把充电头“顶”出过压保护。

这种情况并不常见,但很致命。排查链路:

  1. 检查D+/D-的检测阈值配置。普通DCP充电头的D+/D-特性如果落在了PE+2.0特征电平的判定区间内,PMIC就会误判。
  2. 检查power_supply上报的充电器类型。如果驱动在上报逻辑里把DCP和PE+2.0支持混在一起,上层策略可能错误发起握手。
  3. 如果确认是硬件比较器参考电压偏差导致的误判,只能修改PMIC内比较器的阈值寄存器,让判定区间更严格。

4.4 一个跟dws配置有关的实际案例

之前调试过一台Android 4.4.2的老MTK机器,现象是只有原装充电头能快充,市面上标注支持PE+2.0的第三方头全部只能5V慢充。从日志看,第三方头插入后PMIC根本没识别出PE特征电平,D+电压始终是0V。

后来查dws配置,发现D+和D-两个GPIO被勾上了“下拉”选项。原装充电头内部有很强的上拉驱动,能覆盖这个下拉,第三方充电头为了省电,内部驱动能力弱一点,直接被手机侧的下拉拉到了低电平,导致特征电平永远达不到比较器阈值。把dws里这两个GPIO的下拉去掉之后,第三方充电头的快充功能立刻恢复了。

这类问题最坑的地方在于,你在代码里怎么查都查不出毛病,因为驱动逻辑完全正确,纯粹是硬件配置表把信号链接破坏了。所以遇到PE+2.0相关疑难杂症时,我建议第一步就把dws、GPIO、PMIC寄存器这些都过一遍,别先扎进状态机代码里。

5. 兼容性矩阵、安全机制与量产测试建议

5.1 适配器兼容矩阵怎么建

PE+2.0最怕的就是“我的充电头能快充,你的不能”这种兼容性问题。新平台引入PE+2.0支持之前,建议至少准备五类适配器做验证:

适配器类型典型规格验证重点
原装PE+充电头9V/2A或12V/1.5A基本握手、满功率充电
第三方PE+充电头(不同厂商)9V/1.67A、5V/2A等兼容性、特征电平判定是否一致
普通DCP充电头5V/2A不误入PE流程,稳定普通充电
QC2.0/3.0充电头9V/2A、12V/1.5A能否正确拒绝PE+2.0握手,避免冲突
USB PD充电头(Type-C)5V/3A、9V/3A等支持PD时能否平滑切换,不残留PE状态

重点要记录每类适配器插入后的VBUS变化曲线、握手成功还是失败、协议退出是否干净。我一般会做一个Excel表,把适配器型号、固件版本、dmesg关键日志、实测VBUS电压、充电电流逐项填进去,出问题的时候检索效率非常高。

5.2 保护机制如何配

PE+2.0虽然提高了充电电压,却没有改变电池侧的充电电压需求,中间隔着充电IC做充电管理。这决定了保护机制必须覆盖输入侧、中间转换侧和电池侧三个层面。

输入侧最关键的是VBUS过压保护(OVP)。PMIC的OVP阈值必须大于PE+2.0可能输出的最高电压,并且留出一定余量。我记得部分MTK PMIC的OVP阈值可以通过寄存器调,默认值一般是7V或者12.5V量级,如果只支持到9V,插上12V输出的PE+2.0充电头就会直接锁死输入。

中间转换侧要关注充电IC的ILIM(输入电流限制)。PE+2.0握手成功后,电流限制一般会从握手前的1A左右抬到2A以上。如果ILIM配置得太小,大电流充电时VBUS会被拉低,手机端检测到掉压后回退,表现为“快充几秒就掉线”。

电池侧主要看充电IC的恒压目标和电池过压保护。PE+2.0只负责把充电功率送进来,真正决定电池电压的仍然是充电IC的CV阶段,这部分的保护配置不能因为输入电压变高就放松。

5.3 量产与老化测试里不能漏的细节

量产测试最容易漏的是“极限适配器测试”。PE+2.0的特性是手机引导充电头升压,如果充电头升压精度差,声称输出9V实际输出9.5V,手机端必须在OVP之前能正确处理。建议准备几台输出精度偏离较大的适配器,验证手机端在这种边缘条件下依然能正常握手并充电。

老化测试方面,持续快充循环至少要做200到500个周期。不仅要看电池有没有鼓包、充电IC温度有没有超标,还要记录每个周期里VBUS的波形和握手耗时。有些机器在几十个循环后充电头或线缆的接触阻抗发生变化,导致握手时间从几十毫秒变成几百毫秒,最终触发超时回退。这种问题在常规功能测试里根本发现不了,只有做长周期老化才能暴露。

还有一个容易被忽略的场景:Type-C端口下PE+2.0和PD共存的切换。同一根Type-C线先插PD充电头完成PD握手,拔掉后再插PE+2.0充电头,PMIC里残留的CC状态不能影响D+/D-检测。如果出现第二只充电头插上无法快充的情况,多半是上一次PD会话没有正确退出,需要在驱动里加会话清理逻辑。

6. 我的体会:PE+2.0留下的不只是协议本身

PE+2.0在今天的新平台上已经很少作为主角出现,但它给后续充电协议设计留下的思路一直没有过时。手机端主导调压、滞回判别、边握手边监测VBUS,这些机制在PD PPS的AVS模式里都能找到类似影子。对我个人来说,理解PE+2.0的最大收获是建立了一个认知:快充协议的本质,是适配器和手机之间关于“电压边界”和“信任边界”的协商。手机要敢提要求,适配器要能安全响应,任何一方的误判都会回到5V这条安全线。所以现在再看新协议,我总会下意识去想它的回退路径是否干净、保护阈值是否留够。如果你正在MTK老平台上排查PE+2.0问题,不妨从D+/D-的物理电平开始查起,很多看似诡异的现象,最后都落在了一颗电阻和一个GPIO配置上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询