充电问题解决总结

1、充电电流有规律的跳变,30s跳变一次:

解决:
<1> 功耗方面,modem会每隔30s进行一次唤醒,即使飞行模式也会存在,还有其他的wake唤醒源,可以添加log debug:
— a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -21,6 +21,9 @@ bool irq_pm_check_wakeup(struct irq_desc *desc)
desc->istate |= IRQS_SUSPENDED | IRQS_PENDING;
desc->depth++;
irq_disable(desc);

  • pr_info(“wakeuped by irq %d\n”, desc->irq_data.irq);
  • if(desc->action && desc->action->name)
  • pr_info(“wakeuped by dev %s\n”,desc->action->name);
    pm_system_irq_wakeup(irq_desc_get_irq(desc));
    return true;
    }
    <2> 充电方面,三方IC bq会有32s进行一次喂狗,不喂vbus会掉了再起来
    psy没有调用起来IC的狗函数,我们在它的dumpreg函数中添加一个喂狗:
    在这里插入图片描在这里插入图片描述
述

2、充电在85%左右一直再充不上去,电流停充:

解决:IC的充电状态没有给到gauge,full状态没上报
POWER_SUPPLY_PROP_STATUS,
case POWER_SUPPLY_PROP_STATUS:
pr_err(“yonghai charger done\n”);
val->intval = bq24157_get_charging_status();
break;

3、充电到1%放电时间太长:

解决:电池连接器阻抗值不对

4、充电曲线不平稳:

解决:给充电加锁避免休眠:
charger_routine_thread函数最后添加:__pm_stay_awake(info->charger_wakelock);

5、温度检测不准确:

解决:温度检测的上拉电阻和LDO的电压配置不准确
RBAT_PULL_UP_R
RBAT_PULL_UP_VOLT

6、lk下的上键以gpio按键实现:

#define GPIO_7 (0x80000000 | 7) //EINT7_UP KEY_VOLUMEUP
mtk_kpd_gpio_set函数下添加:
mt_set_gpio_mode(GPIO_7, GPIO_MODE_GPIO);
mt_set_gpio_dir(GPIO_7, GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_7, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_7, GPIO_PULL_UP);
mtk_detect_key函数下添加:
mtk_kpd_gpio_set();
#ifdef KPD_DL_KEY1
if(key == KPD_DL_KEY1)
{
if(!mt_get_gpio_in(GPIO_7)) //volup pull-down
{
print(“preloader volup gpio pull-down\n”);
return true;
}
return false;
}
#endif

7、充电到400ma时突降到200ma:

解决:
在这里插入图片描述

8、充电插入usb不识别vbus,无通知:

解决:
《1》、dts中使能bc1.2 active:

关于MTK BC12检测:
bc12_sel= 0; bc12_active=0 ==> use Charger IC’s bc1.2
bc12_sel = 1; bc12_active=0 ==> use MTK PMIC’s bc1.2
bc12_sel = 2; bc12_active=0 ==> use external IC’s bc1.2

bc12_active=1 ==>
Use charging IC without bc1.2
Use MTK PMIC’s bc1.2
Don’t care bc12_sel

《2》、do_charger_detect函数中添加usb通知:
if(en &&(prop3.intval ==1 || prop3.intval ==3)) {
mt_usb_connect();
} else {
mt_usb_disconnect();
}
power_supply_changed(info->psy);

9、充电不能报full,一直有电流输入:

解决:
pmic和gauge的probe init时间有点早,会有fail,导致充电状态无法给到gauge
//module_init(mt6357_charger_type_init);
late_initcall(mt6357_charger_type_init);

//module_init(mt6357_gauge_init);
late_initcall(mt6357_gauge_init);

10、空电池状态下有电流输入:

解决:原因是空电池时在preloader下会一直检测,导致pmic有耗电
平台platform.c下检测到5次电池不在位时不再去检测,让走到lk下,然后启动充电IC驱动时,因为没有电池,充电就不使能,所有寄存器下电停留在lk阶段
在这里插入图片描述

11、使用switch charger之后电流读取不准确:

解决:
在这里插入图片描述

12、关机充电截止电流一直截止不了:

解决:关机状态下,设置的100ma截止电流,但是一直没有办法截止,最低电流在120ma左右,原因是关机充电动画没有好,一直高亮显示第一张低电图片,导致耗电,修改关机动画能保证正常息屏休眠下去,截止电流正常

13、关机充电曲线毛刺太大:

解决:关机充电,屏背光硬件原因导致屏会高频率的亮一下白屏,所以会有亮灭状态,会导致有漏电,所以毛刺比较大,硬件修改,软件兼容,保证息屏之后,无外部中断下不再亮屏,漏电解决

14:电池电量快速下降,插上usb快速上升:

换了新型号的电池,没有添加电池的容量mAh,还有电池的放电曲线,

15、DLPT_FEATURE_SUPPORT这个宏打开的时候,会在LK 里面初始化FG ,导致启动时间很长,FG 初始化消耗2~3秒的时间

a>DLPT是一种通过实时监控battery能够提供给系统使用的的最大功率,然后将这些功率按照一定的算法来分配到cpu ,gpu,modem,flashlight,icleake,是一种防止在电池低电量由于耗电多大而导致了系统当机的机制
b>由于在系统启动的lk阶段就会去计算imix这个参数,如果把它拿掉了,那么在kernel阶段的DLPT算法就会直接skip,直到系统发生休眠后重新计算这个imix值之后
c>这个feature主要是在mt6753之后的平台推的,贵司使用的是6735,这个是没有验证过这个feature的作用有大多,所以贵司如果考量DLPT在lk带来的时间过长导致体验不好可以关闭这个feature
d>目前来说,这部分的算法是根据硬件的设计来实验的,软件上面的延迟是必须的,这个暂时没有优化

16、预充时间长:

pre阶段的电流很小,导致预充时间长,修改正确的RSENSE电阻值,不支持power_path的关闭它

17、lk阶段的充电时间长:

pre预充到3.3v之后会到lk,然后lk初始化了fg,重新通过pmic adc读取电压电流值,会充电到3.45v,这阶段IC充电,电流小原因:i2c slave 器件读写位不对:
-#define bq24157_SLAVE_ADDR_WRITE 0xD4
-#define bq24157_SLAVE_ADDR_Read 0xD5
+#define bq24157_SLAVE_ADDR_WRITE 0xD6
+#define bq24157_SLAVE_ADDR_Read 0xD7

18、一二供IC兼容问题:

IC的vendor code和IC PN脚的值区分IC:一供:ETA6937,二供:AW32207
在这里插入图片描述

19、二供AW32207断充问题:

充一会电就会断充,然后10s后重新连接,10s再断开,期间bat id还检测错误,adc电压检测错误
因为USB DCP识别连接错误:
在这里插入图片描述

20、预充时间太长:

检查R_SENSE阻值大小是否和硬件上贴的一致,预充时电压低于3.3v,是硬件pmic直接供电,R_SENSE电阻靠近VBAT,BATSNS靠近R_SENSE引出,通过ADC读取BATSNS电压和对应的R_SENSE来计算流入电池的电流大小,IBENBE跟BATSNS完成端电压除以RSENSE测得充电电流
在这里插入图片描述

21、充电截止时ui_soc远没有到100%:

1、优先确认电池对应的ZCV表是否正确,
2、确认无误之后可以适当调整截止电流或者截止电压大小
3、R_FG_VALUE电流采样电阻大小确认,必须要和硬件上贴的一致,属于gauge部分,靠近电池连接器,

22、fg log等级设置:

打开充电fg log:

adb shell setprop persist.mediatek.fg.log.enable 1

adb shell getprop persist.mediatek.fg.log.enable

BM_DAEMON_DEFAULT_LOG_LEVEL 值修改为8

上层读取电池信息:

adb shell dumpsys battery

23、双充:

但是另外一个充电ic mt6071 这个充电ic电流是怎么分配的?
答:在dual charger的情况,rt5738和mt6371的电流应该是均分,当rt5738报Ieco(end of current)的时候,会退出PE40算法,充电只由mt6371完成。
还有这个充电器端和电池端在不同充电ic配置时,这个电流是怎么分配的?
答:软件策略上,主要去预测手机能接收的最大功率,然后去控制总的输入手机电流和电压,具体电流分到两个IC由硬件控制,均分,电流主要的限制是不能超过dts这里所规定的上限
/* PE 4.0 dual charger*/
pe40_dual_charger_input_current = <3000000>;
pe40_dual_charger_chg1_current = <2000000>;
pe40_dual_charger_chg2_current = <2000000>;
还有高低温限流是怎么做的?
答:mtk_charger.c里面有一个线程,charger_routine_thread,它会10s起来一次读取温度,判断现在能否充电
需要关注的地方,下面两条是thermal限流的主要code:
1./kernel-4.14/drivers/power/supply/mediatek/charger/mtk_charger.c里面的charger_check_status函数
正常来说这里会10s走一次,检查温度是否合适,如果检查到温度不合适(譬如温度>46°),charging标志位置false,停止充电。
2./kernel-4.14/drivers/power/supply/mediatek/charger/mtk_dual_switch_charging.c的dual_swchg_select_charging_current_limit函数
这里会考虑所有限制电流的因素,包括温度,如果最后得出结论,电流的最大值=0会停止充电。有一种情况就是如果设置的电流不够大(可能是温度限制,也可能是快充满电了),比如说分配到chg2的电流只有700mA,这个电流就有可能小于设置的Ieoc,硬件就会报中断,软件会判断说,chg2的电流太小,不需要chg2工作把它关掉。
达到46°会离开快充算法,dual_swchg_select_charging_current_limit函数里面的条件不成立,chg2的电流的输入电流就不会被设置
471 if ((mtk_pe20_get_is_enable(info) && mtk_pe20_get_is_connect(info))
472 || (mtk_pe_get_is_enable(info) && mtk_pe_get_is_connect(info))
473 || mtk_pe40_get_is_connect(info)
474 || (mtk_pdc_check_charger(info) &&
475 !dual_swchg_check_pd_leave(info)))
rt9471是串联在mt6371后面的,rt9471的供电是来自mt6391的,如果mt6371作为main charger关了,rt9471这个slave charger也不可能工作。
之前你说发现“电流检测仪的电流有1-2秒的时间内,电流为0,这个是什么情况?”,断冲的原因是到了46°。到达了46°之后,chg2也是不会立刻关闭的,ADC读到连续3次chg2的电流小于Ieoc之后,才会关闭chg2,温度要回到42°这样子才会重新开始充电。
Line 206222: <5>[ 4377.408962] .(5)[327:charger_thread]Vbat=4422,Ibat=28884,I=0,VChr=9253,T=45,Soc=70:66,CT:4:4 hv:1 pd:5:0
Line 206299: <6>[ 4377.842362] .(4)[327:charger_thread]mt6370_pmu_charger mt6370_pmu_charger: mt6370_dump_register: VSYS = 4450mV, VBAT = 4420mV, IBAT = 1400mA, IBUS = 1550mA, VBUS = 9250mV
Line 206412: <5>[ 4386.440228] .(5)[327:charger_thread]Vbat=4422,Ibat=28762,I=0,VChr=9272,T=46,Soc=70:66,CT:4:4 hv:1 pd:5:0
Line 206549: <6>[ 4386.918210] .(4)[327:charger_thread]mt6370_pmu_charger mt6370_pmu_charger: mt6370_dump_register: VSYS = 4270mV, VBAT = 4270mV, IBAT = 0mA, IBUS = 750mA, VBUS = 9350mV

24、关于MTK BC12检测:

bc12_sel= 0; bc12_active=0 ==> use Charger IC’s bc1.2
bc12_sel = 1; bc12_active=0 ==> use MTK PMIC’s bc1.2
bc12_sel = 2; bc12_active=0 ==> use external IC’s bc1.2

bc12_active=1 ==>
Use charging IC without bc1.2
Use MTK PMIC’s bc1.2
Don’t care bc12_sel

25、有DPPM(power path)电源路径管理,无电池时插入DC不能启动机器:

使用TI的IC,板子硬件设计上机器运行所需要的电流过大,但是在内核charger IC那里有对充电电流的限制,所以插上DC启动到驱动probe时就重启了,电流不足,
修改充电使能时的电压电流大小
在这里插入图片描述

26、有DPPM,电池放完电之后,一直充电不能退出电池保护和激活电池:

使用TI的IC,充电时的电压不够,激活不了已经亏电的电池,修改充电使能时的电压电流大小,修改同上

27、充电指示灯,图标,不能及时更新:

充电和电池的状态信息更新延迟,或者native层的epoll监听时间过长,
1、内核驱动处在插拔处通过power_supply_changed上报,或者添加定时上报
2、healthed处的对充电和电池信息的epoll事件监听时间减小

28、sprd charger不能正确检测到外部充电器的插入,battery等节点无法创建:

原因:dts中charger节点下的extcon属性值错误,修改添加extcon_gpio检测方式,
regulator@0 {
cm-regulator-name = “vddgen0”;
cable@0 {
cm-cable-name = “USB”;
extcon = <&extcon_gpio>, <&pmic_typec>;
};
};
解析:usb cable的插拔通过硬件信号检测,phy参与其中,外部信号由extcon最终确认检测,看具体硬件信息使用pmic检测还是gpio检测,然后使用对应的方式

29、linux基于smbus的sbs-battery驱动使能:

问题:项目使用基于smbus总线的sbs电池系统来获取对应battery信息并更新给上层使用
什么是sbs battery
智能电池符合智能电池供电系统(SBS)所定义的元件所有工作性能指标,电池具有跟踪有关电池充电和使用信息的嵌入控制器。通
过串行、2线SMBus接口提供信息到系统。可询问电池信息包括剩余容量、总容量、在现有放电速率下时间余、放电电流、终
端电压等
解题:
在linux中已经有sbs manager等驱动代码,我们需要在dts中enable它:

battery: smart-battery {
    compatible = "sbs,sbs-battery";
    reg = <0xb>;
    battery-name = "sbs-battery";
    sbs,i2c-retry-count = <2>;
    sbs,poll-retry-count = <10>;
    sbs,disable-charger-broadcasts = <0>;
    /*sbs,battery-detect = <>;
    sbs,battery-detect-gpios = <>;
    power-supplies = <>;*/
};

在sbs battery驱动跑起来之后,还需要在HDI侧读取的底层节点对应起来,charger和battery HDI部分代码在: drivers/peripheral/battery/interfaces/hdi_service/src/power_supply_provider.cpp中,在这里面读取的电池节点名是“Battery”
,而我们的sbs battery节点是“sbs-battery”,需要修改:
sbs_desc->name = devm_kasprintf(&client->dev, GFP_KERNEL, “sbs-%s”, dev_name(&client->dev));
为:
sbs_desc->name = devm_kasprintf(&client->dev, GFP_KERNEL, “Battery”);

30、PD快充调试时不能升电压和没有电流:

不能升压因为充电IC电流的regulator_LDO没有使能,还有电池和充电IC的gpio初始化pinmap配置不正确,导致充电IC的state状态异常,然后因为tcpm那里协商电压过程中,

协议逻辑状态异常导致,没有电流是因为硬件修改的电池飞线不正确,电池的负极直接接地没有正确接入到主板连接器负极上,修改走线解决

31、PD快充调试,在充电功率超过一定值,会断充reset:

它是圣邦威芯片,读IC寄存器它判断是vbus故障了,所以reset,软件排查这个异常比较突兀,是硬件影响,让硬件修改,原因是硬件上的部分机器航插口改的有问题,影响了cc线的判断,修改硬件解决

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值