ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MTK平台充电调试全解析:从硬件通路到快充协议

MTK平台充电调试全解析:从硬件通路到快充协议 一直做手机方案和底层调试的朋友大概率都碰过MTK平台的充电问题。新项目从EVT到量产充电这个模块看起来只是插上就充实际把预充、恒流、恒压、快充协商、温度策略、电量计校准全串起来后涉及的范围比想象中大得多。我最早在MTK平台调充电时也被各种概念绕晕过比如CC/CV切换、Pump Express握手、充电IC的寄存器初始化顺序、电池NTC曲线匹配等等整完一轮下来才慢慢把整个链路理清楚。这篇不写官方案例式的操作手册就按我实际调MTK平台的思路把充电原理从硬件通路、协议协商、软件框架到常见坑位完整拆一遍适合刚接手MTK项目充电调试的驱动工程师、FAE、以及想了解底层充电逻辑的硬件和系统工程师。1. 充电系统整体架构与核心环节1.1 从适配器到电池的关键链路MTK手机平台的充电路径本质上是一个从外部电源到电池的功率传输和控制回路。最常见的形态是适配器通过USB接口进入经过充电IC再流向电池。充电IC是整个回路的执行机构PMIC和CPU则是控制机构。MTK平台的主流方案里有两种典型架构一种是独立的充电IC加上PMIC内置的控制逻辑比如常见的中功率快充方案另一种是PMIC内部集成充电功能省掉了外置充电IC适合低功率慢充场景。实际项目里手机要做快充、大电流、多种协议兼容基本都是外置充电IC为主。这里有一个容易被忽视的点充电通路不只是充电IC到电池一根线。适配器的VBUS进来后会先经过一个过压保护开关或者充电IC内部的OVP电路再进入充电MOSFET。充电IC内部至少有两路功率管一路是BUCK降压管负责从VBUS到电池电压的调整另一路是电池侧的反向保护管避免电池电压回灌到VBUS。MTK平台的充电IC一般还会集成一个充电路径管理功能也就是OTG反向供电让手机可以给外部设备供电。调试的时候要是发现OTG不工作很多人会去查GPIO配置实际上充电IC的OTG使能寄存器和VBUS反向通路没打开也会导致同样的现象。电池侧的连接也不是简单正负极。电池包里通常有NTC热敏电阻用于温度采集有的还带BQ27xxx之类电量计IC通过I2C上报电压、电流、电量百分比。温敏电阻采样一般是PMIC或充电IC通过ADC获得NTC电阻值用来计算电池温度。这里就涉及一个很常见的坑电池NTC上拉电阻和分压电阻选择不同ADC读出的电压范围就不一样。MTK平台里这个上拉电阻有些放在PMIC内部有些放在板子上。改板或换电池供应商后NTC曲线对不上温度误判成50度甚至-10度充电被限制或直接停止这类问题我遇到不止一次。1.2 MTK与高通充电设计的差异点做驱动的人问得最多的一个问题是MTK和高通有什么区别。从充电原理角度看两者的核心框架高度相似都是适配器握手、充电IC执行、PMIC和CPU监控保护。但MTK和高通在软件架构和默认策略上有明显差异。高通平台充电管理通常被集成进PMIC加上一个单独的SMB系列或PMI系列充电IC软件上使用QPNP框架很多参数在设备树里配置代码逻辑相对集中。MTK平台则更依赖外置充电IC配合MTK自己的mux和PMIC电源管理框架代码分散在充电IC驱动、mtk_charger、电量计驱动、温度控制等多个模块里。MTK还有个特点它的充电IC驱动抽象层做得比较统一很多厂家IC注册同一套接口切换充电IC型号时不需要重写整个上层策略这一点在快速定制项目里很实用。另外MTK平台的充电控制节奏更重策略协商。比如充电电流不是简单地根据适配器能力设置一个固定值而是由MTK充电框架根据适配器类型、USB类型、系统负载、电池温度、充电阶段、快充协议协商结果等综合决定。高通也有类似策略但MTK在默认参数上更偏向保守很多项目不调参数直接跑充电速度会慢一大截。相反如果只为了跑分把电流拉满发热和电池加速老化又会立刻暴露。理解这个分配逻辑比单纯记住某个寄存器更有用因为每个项目的电池容量、内阻、热设计都不一样标定充电参数本来就没有一套万能值。2. 充电协议与快充协商的底层逻辑2.1 BC1.2识别与充电器类型判断MTK平台在插上USB或充电器后首先要判断适配器和USB端口的类型这一步通常由充电IC或PMIC的USB检测模块完成。简单说系统需要知道来源是标准USB端口、充电器、还是支持快充的适配器。BC1.2是USB电池充电规范里的经典协议通过D/D-线路上的电压来判断。比如D和D-同时短路时大概率是DCP专用充电口也就是普通充电头如果D/D-有数据通信信号则是SDP标准下行端口能拿到的电流很小还有CDP是带数据又能充电的端口在现代手机上已经很少见。MTK的充电ID检测还会把非标准适配器单独归一类比如很多山寨充电头D/D-直接短接或者没做任何识别。对于这种适配器系统只能按保守策略充电默认电流不能太高否则容易出问题。这个判断结果最终会通过中断上报给充电框架框架再决定初始充电电流上限。所以项目调试时如果插上某款充电头充电电流很低不要急着改电流限制先看看系统识别出的适配器类型是否和充电头一致。快充协商是在BC1.2基础之上的扩展。MTK自家有Pump Express协议通过D/D-上的电压信号和适配器做握手分成PE、PE等不同版本。现在主流项目里更多是兼容USB PD协议走CC线协商电压和电流。充电IC内部有协议检测电路但具体PD协议栈一般跑在充电IC的MCU里CPU这边通过I2C读取协商结果。也就是说CPU并不直接参与PD报文逐字节传输而是从充电IC的寄存器里拿到最终协商出的电压电流档位。这对驱动开发很重要调试时需要分清问题出在物理层、协议栈、还是最终执行策略。2.2 预充电、恒流、恒压、截止的完整状态机电池充电不是一个恒定过程。MTK充电框架把充电过程分成了几个阶段每个阶段有对应的电流电压控制策略。深度放电的电池电压很低比如低于2.8V甚至2.5V系统不会直接大电流充而是先进入预充模式。这个阶段充电电流被限制在很小范围通常是一两百毫安目的是先把电池电压抬升到安全区间。如果电池过放导致Vbat极低预充电流还要更小甚至需要专门的涓流充电。MTK平台里预充电流和预充电压阈值都在充电IC驱动或设备树里配置。调试量产机时仓库里放了很久的机器开机没反应插上充电器指示灯也不亮十有八九是电池电压过低进入了预充需要等好几分钟电流才能拉起来这其实是正常的。电池电压到了预充阈值后进入恒流充电阶段也就是CC模式。CC阶段充电电流恒定电池电压会逐渐上升。这个阶段也是充电最快的阶段快充通常就在这个阶段保持大功率。MTK框架会根据电池温度、系统功耗和适配器能力限制最大充电电流。需要注意CC模式下电流是恒定了但如果系统在运行充电IC提供的电流一部分要给系统供电实际流进电池的电流会下降。所以调试快充时想要准确看到电池电流最好关屏、关闭耗电应用或者用寄存器直接读充电IC的输出电流而不是电池端电流。电池电压上升到设定的目标电压后转入恒压充电也就是CV模式。CV阶段充电IC维持电压恒定电流逐渐下降直到电流降到某个截止值充电过程结束。恒压点的选择直接影响电池实际能充进多少容量以及电池寿命。MTK默认的电池电压平台在4.2V到4.45V之间不同电芯特性不同。这个参数不是软件里随便填的得和电芯厂给的规格书对齐。项目上为了标称容量高一点把恒压电压调高结果电池循环寿命很快衰减或者高温下膨胀这种经验教训真不少。3. MTK充电软件框架与关键配置3.1 充电驱动的整体框架与设备树配置MTK平台的充电软件框架通常是三部分协作。第一部分是充电IC驱动比如常见方案里的sgm41542、bq25601、sy6970等这些驱动会实现充电子系统抽象的一堆回调接口。第二部分是MTK的顶层充电策略模块像mtk_charger.c、mtk_charger_intf.c这些负责收集各种状态计算目标电流电压然后下发到充电IC驱动。第三部分是电量计模块比如mtk_battery.c它负责读取电池电压、电流、温度、循环次数并维护SoC状态。设备树里的充电配置很多工程师只抄不改这是后面出问题的根源。比如max_charger_current_ma这个参数可以理解成整个充电系统允许的最大输入电流上限它不仅限制充电IC的输入电流还会影响温升和适配器握手结果。又比如max_charger_voltage_uv是允许的最大输入电压设置高了遇到异常适配器时OVP不起作用设置低了快充电压档位上不去。这些参数一定要结合充电IC的绝对最大额定值和实际线材、连接器、PCB走线能力一起定。触发热词里有个mtk kprow0 dws设置这个和充电不完全相关但它体现了MTK平台项目配置的一个特点很多功能开关和复用管脚都放在DWS或设备树里。充电IC的中断引脚、OTG使能引脚、I2C配置、电池NTC通道、USB的CC检测引脚全部是GPIO复用配置的一部分。管脚复用错了会出现寄存器写入正常但充电IC不工作这种诡异问题而且很难查因为I2C通信都正常就是中断不触发或者使能脚没拉对。3.2 充电策略参数与电池温度管理MTK充电框架有一个非常实用的特性就是可以通过节点动态查看和修改运行参数。调试时常用的节点一般在/sys/class/power_supply/下面比如主电池的current_now、voltage_now、temp、status还有MTK特有的charging_enabled。实际刷机调参时也可以通过adb shell直接写一些底层节点或者用MTK的工程模式菜单快速查看充电状态。比如cat /sys/class/power_supply/battery/status能看到当前有没有在充电是充电中、满电、还是未充电。这些节点在工厂产测和售后分析时都很常用。电池温度管理要单独强调。MTK默认有一套温度区间策略通常分为低温、常温、高温几个区间。高温区间会限制充电电流极端高温会禁止充电低温区间通常会降低充电电流甚至启用低温加热功能。这些策略不是写死在内核里的很多通过设备树或内核config配合选择。实际项目中如果换了电池NTC的BOM但软件里的温度分压电阻配置没同步改检测到的温度跟实际差十几度都正常。这不是MTK的问题但MTK提供的温度采样配置在设备树里分布得比较散需要细心对齐。电池电压采样同样值得注意。充电IC内部通常有VBAT ADCPMIC内部也有VBAT ADC两个读数在低负载下应该接近高负载下会因为走线阻抗产生差异。MTK电量计模块默认会用某个adc作为参考同时对IR压降做补偿。要是充电电流大电池端电压被拉低电量计会误判电量偏低。所以MTK平台一般有充电时IR补偿的开关调试时必须确认硬件线阻和补偿参数匹配。曾经有个项目充电到80%就显示100%查下来就是IR补偿太激进把浮充电压误判成截止电压。4. 充电IC常用寄存器与实战配置解析4.1 关键寄存器功能速查MTK平台常用的充电IC不管哪家寄存器功能大多类似。以单节电池的开关充电IC为例一般会包括以下几个区块输入电压限制、输入电流限制、充电电压、充电电流、预充电流、截止电流、安全定时器、状态位与中断位、OTG控制、看门狗等。看起来复杂但每个区块其实对应充电状态机的一个环节。输入电压限制寄存器通常设置VBUS_OVP阈值也就是适配器电压过压保护点。比如压敏电阻和OVP硬件的保护在6.8V左右IC内部的OVP就设成6.5V留一点裕量。输入电流限制寄存器则限制从适配器抽取的最大电流很多快充方案会通过协议把电流档位写进这个寄存器。充电电压和充电电流是最主要的输出控制项一个对应CV电压一个对应CC电流。预充电流和截止电流一般由寄存器里的较低位组合值决定。安全定时器非常重要它防止充电IC在异常情况下无限充电比如超过10小时没截止就强制关断。量产调试时容易忽略看门狗有些充电IC有I2C看门狗CPU不按时喂狗就复位到默认配置导致充电电流突然掉下来。这些寄存器通过I2C读写MTK的i2cget工具或者厂家的调试上位机都可以直接操作。不过在生产阶段不能依赖上位机正确做法是把驱动初始化序列写清楚确保上电时充电IC初始化正确。很多充电IC在上电后缺省是HIZ模式也就是高阻态不主动从适配器拉电流必须由软件清掉HIZ位才能正常充电。这个HIZ位藏在寄存器很隐蔽的位置一旦漏了现象就是插充电器完全没电流。4.2 一个典型的充电参数配置示例以下是一个典型的MTK平台设备树配置片段里面包含了充电电流、电压、温度保护等关键参数。这里我摘取了核心部分实际项目中还会有很多型号相关的配置。charger { max_charger_current_ma 2000; max_charger_voltage_uv 9000000; min_charger_voltage_uv 4400000; battery_cv 4350000; charger_current_ma 1500; pre_charger_current_ma 200; termination_current_ma 150; enable_sw_safety_timer; sw_safety_timer_setting 10; };简单解释一下battery_cv是恒压充电的目标电压4.35V对应当前主流的高压电芯。charger_current_ma是CC模式的目标充电电流1.5A在普通5V/2A充电器下是合理值。pre_charger_current_ma预充电流200mA。termination_current_ma截止电流150mA意思是恒压阶段电流降到150mA就认为充满了。max_charger_current_ma和max_charger_voltage_uv是设备整体允许的最大输入电流和电压分别影响快充时能否拉到更高档位。这套参数要跟实际硬件匹配。比如max_charger_current_ma设为2000mA但适配器只支持5V/1A实际充电电流会被适配器能力限制住这是正常的。如果适配器支持5V/3A但软件把上限限制在2000mA充电速度就会保守。这里很多项目在追求充电速度时会把值调高但必须同时考虑充电IC的饱和压降和手机温升否则一发热就触发温度降流根本到不了目标电流纯属白调。5. 充电调试与常见问题排查5.1 看日志和状态节点的正确姿势MTK平台充电调试第一步不是改参数而是先确认当前状态。用adb shell cat /proc/mtk_battery_cmd之类的命令可以查看电池信息不过不同版本命令有所差异。更通用的是先看/sys/class/power_supply/battery/下的节点再看/sys/class/power_supply/mtk-master-charger/下的充电IC状态节点。有些平台会把充电IC注册成main_charger有些版本叫mtk-master-charger。主要关注几个值status、charge_type、constant_charge_current_max、constant_charge_voltage_max、health、temp。如果health显示overheat或cold先查NTC采样别直接怀疑充电IC。日志方面MTK内核在充电状态切换时会打一些关键log比如进入CC、CV、预充、完成都会留下标记。打开内核相关前缀的debug等级比如mtk_charger、charger_ic、battery等。还有一种情况是内核log一直被别的模块刷屏充电log看不见这时候可以在充电IC驱动里临时加打印或者用echo file drivers/power/supply/*.c p /sys/kernel/debug/dynamic_debug/control打开动态调试。排查快充不生效时需要同时看USB PD协商日志和充电IC的VBUS/IBUS寄存器。如果VBUS只有5V说明适配器还没进入快充模式问题多半在CC通信或者协议握手阶段。如果VBUS已经到9V但充电电流只有几百毫安那就要看充电IC的输入电流限制和热限制寄存器可能是温升导致降流也可能是输入限流没按适配器能力放开。5.2 典型故障场景与解决思路汇总用一张表把实际项目里最常遇到的MTK充电问题整理出来。现象可能原因处理方向插充电器无任何反应充电IC处于HIZ、VBUS未检测到、GPIO配置错误检查充电IC寄存器、VBUS ADC、DWS管脚配置只能小电流充电适配器类型识别错误、输入限流寄存器限制、线材压降大检查BC1.2识别寄存器、最大输入电流参数、换线材对比快充无法握手成功CC引脚配置、PD协议栈异常、充电IC固件版本低抓PD协议日志、检查CC引脚电平、升级充电IC固件电量越充越少IR补偿过激、系统功耗过高、电池内阻增大调整IR补偿参数、关闭后台耗电、校准电池内阻温度显示异常NTC上拉/分压电阻不匹配、ADC通道选择错误核对设备树温度采样配置、测量NTC分压点电压充电到80%就停CV电压偏移、截止电流设置过早、SoC校准偏差检查电池CV、截止电流寄存器、重新做电量计校准这些案例里恰恰是最后一条充电到80%就停最隐蔽。有一回项目反馈整批机器只能充到80%查了一遍充电IC、协议、日志都没问题最后定位到是电量计SoC的满充矫正参数跟电池老化后不匹配电池端实际还在充电但电量计认为满了就不更新显示。这类问题单看充电链路很难发现得从电池SoC计算的角度跟踪充电状态跳变。5.3 调试MTK充电的几条实操心得第一必须有电流钳或高精度电源分析仪光靠系统节点读数是远远不够的。很多问题就是充电IC寄存器显示的电流和实际进电池的电流对不上比如电池连接器接触阻抗大回路电流被限制这时寄存器只能反映IC输出设定值测不到物理链路的损耗。用电源分析仪看VBUS端电流和手机里的报告值做对比能快速定位是适配器端、线材端、连接器端还是板端问题。第二调充电参数前先把电池温度校准弄准。温度参数不准确后续做的所有电流限制验证都没有意义。MTK平台一般有mtk_ts_calibration之类的校准流程产线也会做NTC校准。工程调试阶段可以用一个精密电阻箱模拟不同温度下的NTC阻值验证软件温度映射是否正确然后再换真电池实测。第三用好MTK工程模式。很多版本在拨号盘输入特定代码可以进入充电测试界面直接看到充电状态、当前电压电流、温度、测试模式。这比反复改代码刷机高效多了。工作流一般是先用工程模式做初步判断再通过adb和底层寄存器做精确定位最后才动代码和参数。有一个细节提醒一下量产前一定要做充电器兼容性测试别只测原装充电头。市面上大量第三方充电头的D/D-行为和协议栈实现不规范容易让MTK平台出现识别失败、快充闪断等奇怪问题。如果发现某款充电头兼容性差先记录充电IC的识别和协商过程再决定是硬件加电阻匹配还是软件上做特殊协议兼容。这种问题不是单靠增大充电电流就能解决的。6. 关于充电安全与后续扩展方向6.1 充电安全机制再理解MTK平台的充电安全机制实际上是一个多级保护体系。最底层是硬件保护包括充电IC内部的过压、过流、过温保护以及电池保护板上的二级保护IC。中间层是充电IC的寄存器保护比如输入过压、充电安全定时器、看门狗、热限制。最上层才是软件策略MTK充电框架综合温度、电压、电流、SoC、充电时长等信息做动态限制。调试中常见一个误区为了提升充电速度把温度保护阈值往上调或者关闭安全定时器。这在工程机阶段可能看不出问题但产品一量产用户在各种恶劣场景下充电风险就出来了。MTK本身有很多默认保护项比如充电时长超过一定时间会强制中断温度超过设定值会降流或停止这些保护在项目量产前不要随意关闭。实在有特殊需求比如温升测试时不想要限制也建议只在调试版本里去掉量产配置保持保守。6.2 从充电原理扩展到平台整体调优掌握了MTK充电原理后你再看其他模块会轻松很多。比如热词里提到的mtk android 以太网配置、mtk keymaster可能和充电没直接关系但这类平台项目的调试思路是相通的先看硬件通路再看软件框架然后查配置策略最后排协议和状态机。MTK的很多模块都建立在类似的设备树配置、内核驱动、HAL层抽象的层次上理解了这一套换到任何平台都能迁移。如果想在这个方向继续深入建议研究一下DTS配置里充电参数的每一个字段具体映射到哪个寄存器以及电量计SoC计算模型和充电状态之间的耦合关系。还可以多看充电IC厂商的公开寄存器手册拿自己的板子做读写实验观察寄存器变化对电流电压的影响。实践经验加原理理解相结合才能真正摆脱调参搬运工的状态。我在实际项目中最深的体会是MTK充电调试初期会感觉参数和状态节点多到让人烦躁但一旦把充电状态机、硬件保护链、快充协商流程串起来再遇到问题就能很自然地缩小范围。踏踏实实把底层原理过一遍比盲目改参数加打印要省时间得多。
返回列表