搜索

430

主题

515

帖子

2106

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2106
QQ
发表于 2020-9-1 17:20:28 5624 浏览 0 回复

MTK6739 充电的Safety timer

[DESCRIPTION]

Safety timer是充电的一种保护机制,当充电时间超过一定时间(默认12小时)都没有充满过,会触发充电超时,停止充电。

[SOLUTION]

1. 一般在MTBF等长时间测试时,需在测试前执行以下命令来关闭safety timer机制(重启失效):
  1. adb root
  2. adb shell "echo 0 >/proc/mtk_battery_cmd/en_safety_timer"
复制代码
代码位置:
  1. /kernel-4.4/drivers/power/mediatek/charger/mtk_linear_charging.c

  2. 242  /* return false if total charging time exceeds max_charging_time */
  3. 243  static bool mtk_linear_check_charging_time(struct charger_manager *info)
  4. 248   if (info->enable_sw_safety_timer) {
  5. ...
  6. 253   if (algo_data->total_charging_time >= info->data.max_charging_time) {
  7. 254   chr_err("%s: SW safety timeout: %d sec > %d sec\n",
  8. 255   __func__, algo_data->total_charging_time,
  9. 256   info->data.max_charging_time);

  10. /kernel-4.4/drivers/power/mediatek/charger/mtk_charger_intf.h
  11. 45  #define MAX_CHARGING_TIME (12 * 60 * 60) /* 12 hours */
复制代码


2. 值得注意的是,当手机没有使用charger ic,即linear charging。
即便是将en_safety_timer写为1,cat的结果还是0,那写进去的值到底有没有生效呢?
  1. adb shell "echo 1 >/proc/mtk_battery_cmd/en_safety_timer"
复制代码

跟踪代码会发现没有相关charger ic定义的ops,最终就会call不到ops下的enable_safety_timer,即不能将enable的值写到chg_dev中。
  1. /kernel-4.4/drivers/power/mediatek/charger/mtk_charger.c

  2. 2358  static ssize_t mtk_charger_en_safety_timer_write(struct file *file, const char *buffer,
  3. 2374           charger_dev_enable_safety_timer(info->chg1_dev, enable);
  4. 2375           pr_debug("%s: enable safety timer = %d\n", __func__, enable);
  5. 2378           if (enable)
  6. 2379                   info->enable_sw_safety_timer = true;
  7. 2380           else
  8. 2381                   info->enable_sw_safety_timer = false;
  9. 317  int charger_dev_enable_safety_timer(struct charger_device *charger_dev, bool en)
  10. 318  {
  11. 319     if (charger_dev != NULL && charger_dev->ops != NULL && charger_dev->ops->enable_safety_timer)
  12. 320            return charger_dev->ops->enable_safety_timer(charger_dev, en);
复制代码

而mtk_charger_en_safety_timer_show中的safety_timer_en正是从charger dev拿的值,由于写的时候就没有将值写到charger dev中,自然也就拿不到值。
  1. 2347  static int mtk_charger_en_safety_timer_show(struct seq_file *m, void *data)
  2. 2352   charger_dev_is_safety_timer_enabled(pinfo->chg1_dev, &safety_timer_en);
  3. 2353   seq_printf(m, "%d\n", safety_timer_en);
复制代码
但是看代码其实是通过sw的方式enable_sw_safety_timer来控制实现的,所以写进去的1有生效,只不过show的时候这部分没有实作。


手机微信同号:13682654092
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表