• Call Mode feature


    起源

    user 在插著 充電器 打電話的狀況下,
    為了安全起見,
    避免 充電器在這時損害手機,間接造成 user 的傷害,
    而有了這 feature,

    在 battery voltage Vbat > 4V 時,不充電;
    在 battery voltage Vbat < 3.8V 時,需充電;

    24 #define V_CC2TOPOFF_THRES               4000
    ...
    2616 #if defined(STOP_CHARGING_IN_TAKLING)
    2617 static PMU_STATUS mt_battery_CheckCallState(void)
    2618 {
    2619     PMU_STATUS status = PMU_STATUS_OK;
    2620 
    2625     if ((g_call_state == CALL_ACTIVE) && (battery_meter_get_battery_voltage(KAL_TRUE) > V_CC2TOPOFF_THRES))
    2628     status = PMU_STATUS_FAIL;
    2629 
    2630     return status;
    2631 }
    2632 #endif
    
    2484 static void mt_battery_CheckBatteryStatus(void)
    2485 {
    ...
    2707 #if defined(STOP_CHARGING_IN_TAKLING)
    2708         if (mt_battery_CheckCallState() != PMU_STATUS_OK) {
    2709                 BMT_status.bat_charging_state = CHR_HOLD;
    2710                 return;
    2711         }
    2712 #endif
    ...
    2888 }
    
    1338 void mt_battery_charging_algorithm(void)
    1339 {
    1340         battery_charging_control(CHARGING_CMD_RESET_WATCH_DOG_TIMER, NULL);
    1341 
    1342         /* Generate AICR upper bound by AICL */
    1343         if (!mtk_is_pep_series_connect()) {
    1344                 battery_charging_control(CHARGING_CMD_RUN_AICL,
    1345                         &g_aicr_upper_bound);
    1346         }
    1347 
    1348         mtk_pep20_check_charger();
    1349         mtk_pep_check_charger();
    1350         switch (BMT_status.bat_charging_state) {
    1351         case CHR_PRE:
    1352                 BAT_PreChargeModeAction();
    1353                 break;
    1354 
    1355         case CHR_CC:
    1356                 BAT_ConstantCurrentModeAction();
    1357                 break;
    1358 
    1359         case CHR_BATFULL:
    1360                 BAT_BatteryFullAction();
    1361                 break;
    1362 
    1363         case CHR_HOLD:
    1364                 BAT_BatteryHoldAction();
    1365                 break;
    1366 
    1367         case CHR_ERROR:
    1368                 BAT_BatteryStatusFailAction();
    1369                 break;
    1370         }
    1371 
    1372         battery_charging_control(CHARGING_CMD_DUMP_REGISTER, NULL);
    1373 }
    
    1250 #define TALKING_RECHARGE_VOLTAGE 3800
    ...
    1253 PMU_STATUS BAT_BatteryHoldAction(void)
    1254 {
    1255         unsigned int charging_enable;
    1256 
    1257         battery_log(BAT_LOG_CRTI, "[BATTERY] Hold mode !!
    
    ");
    1259
    1263         if (battery_meter_get_battery_voltage(KAL_TRUE) < TALKING_RECHARGE_VOLTAGE ||
    1264                 g_call_state == CALL_IDLE ||
    1266                 xxxxx) {
    1271                 BMT_status.bat_charging_state = CHR_CC;
    1272                 battery_log(BAT_LOG_CRTI, "[BATTERY] Exit Hold mode and Enter CC mode !!
    
    ");
    1273         }
    1274 
    1275         /*  Disable charger */
    1276         charging_enable = KAL_FALSE;
    1277         battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
    1278 
    1279         return PMU_STATUS_OK;
    1280 }
    

    解說1

    一開始對 BAT_BatteryHoldAction() 有些疑惑,
    為什麼不在 vbat 小於 TALKING_RECHARGE_VOLTAGE 時,如下,就 enable charging,

    1263         if (battery_meter_get_battery_voltage(KAL_TRUE) < TALKING_RECHARGE_VOLTAGE ||
    1264                 g_call_state == CALL_IDLE ||
    1266                 xxxxx ) {
    ...
    ...                  enable_charging
    ...
    1273         }
    

    如果 在判斷式裡直接 enable charging,(如上),
    會發生一種狀況,
    有兩種 手機使用狀況 可能會進入 hold action,
    若其中一個不需要進入 hold,也就是會開啟 enable charging 的條件,如 xxxxx
    則會發生 一直 enable charging,
    而失去 hold 的 意義,
    正確流程應該是
    設定 BMT_status.bat_charging_state = CHR_CC; 讓其在下一個輪回時,進入正常流程,check 是否要enable charging,
    並且在 BAT_BatteryHoldAction() 最下方, disable charging
    也就是
    只要發生 hold 的狀況,即 disable charging,
    讓其在下一個輪回,重新檢查。

    解說2

    為什麼在最下面要 disable charging
    不是 在 vbat 小於 TALKING_RECHARGE_VOLTAGE 時,就要 enable charging 嗎?

    原來是

    如果 Vbat 大於 V_CC2TOPOFF_THRES,
    設定 BMT_status.bat_charging_state = CHR_HOLD,
    執行 BAT_BatteryHoldAction()

    BAT_BatteryHoldAction()裡,vbat 不論大於或小於 TALKING_RECHARGE_VOLTAGE,
    都會disable charging,

    但是
    設定 BMT_status.bat_charging_state = CHR_CC;
    讓其在下一回執行 BAT_thread 時,進入 CC 充電,
    而這一輪回 先 disable charging。


    PMU_ChargerStruct BMT_status; 是一個 global variable,
    BMT_status.bat_charging_state 會一直記錄 state
    所以會一直保持 CHR_HOLD,(除非 被設為 BMT_status.bat_charging_state = CHR_CC)
    進入BAT_BatteryHoldAction()。

  • 相关阅读:
    Python之利用 gensim的word2vec进行酒店评论+wiki百科语料联合词向量训练
    Python之酒店评论主题提取LDA主题模型
    Python之酒店评论分词、词性标注、TF-IDF、词频统计、词云
    Pycharm使用技巧----Pycharm工程使用anaconda环境
    Python之Pandas 简介与Pandas 读取csv文件及相关操作01
    csv文件用excel打开乱码的解决方案
    apply()和call()的方法
    如何将webstrom本地的代码上传到github上
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    Express bodyParser中间件使用方式
  • 原文地址:https://www.cnblogs.com/youchihwang/p/6798353.html
Copyright © 2020-2023  润新知