| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | mtk_charger.c???static?int?charger_routine_thread(void?*arg) ????????????????????->if?(!info->charger_wakelock.active) ????????????????????????__pm_stay_awake(&info->charger_wakelock);???//增加combined_event_count計(jì)數(shù) ????????????????????->chr_err("Vbat=%d,Ibat=%d,I=%d,VChr=%d,T=%d,Soc=%d:%d,CT:%d:%d?hv:%d?pd:%d:%d\n", ????????????????????->is_charger_on?=?mtk_is_charger_on(info) ????????????????????????->chr_type?=?mt_get_charger_type();?//去拿充電類型 ????????????????????????????->return?mtk_chg->chg_type; ????????????????????????->if?(chr_type?==?CHARGER_UNKNOWN?&&?info->chr_type?!=?CHARGER_UNKNOWN)?{ ????????????????????????????->mtk_charger_plug_out(info); ????????????????????????????????->info->chr_type?=?CHARGER_UNKNOWN; ????????????????????????????????->info->charger_thread_polling?=?false; ????????????????????????????????->info->plug_out(info); mtk_switch_charging.c???????????????->int?mtk_switch_charging_plug_out(struct?charger_manager?*info) ????????????????????????????????????????->swchgalg->total_charging_time?=?0; ????????????????????????????????->wakeup_sc_algo_cmd(&pinfo->sc.data,?SC_EVENT_PLUG_OUT,?0); charger_class.c?????????????????->charger_dev_set_input_current(info->chg1_dev,?100000);????//info->chg1_dev?=?get_charger_by_name("primary_chg"); ????????????????????????????????->charger_dev_plug_out(info->chg1_dev); ????????????????????????????????????->chg_dev->ops->plug_out(chg_dev)???//hl7019沒實(shí)現(xiàn),不會報(bào)錯(cuò)嗎 ????????????????????????->else?if?(info->chr_type?==?CHARGER_UNKNOWN) ????????????????????????????->mtk_charger_plug_in(info,?chr_type); ????????????????????????????????->info->chr_type?=?chr_type; ????????????????????????????????->info->charger_thread_polling?=?true; ????????????????????????????????->info->can_charging?=?true; ????????????????????????????????->info->plug_in(info) mtk_switch_charging.c???????????????->int?mtk_switch_charging_plug_in(struct?charger_manager?*info) ????????????????????????????????????????->swchgalg->state?=?CHR_CC; ????????????????????????????????????????->info->polling_interval?=?CHARGING_INTERVAL; ?//10s ????????????????????????????????????????->get_monotonic_boottime(&swchgalg->charging_begin_time);???//保存充電啟示時(shí)間 ????????????????????????????????->wakeup_sc_algo_cmd(&pinfo->sc.data,?SC_EVENT_PLUG_IN,?0); charger_class.c?????????????????->charger_dev_set_input_current(info->chg1_dev,?info->chg1_data.input_current_limit); ????????????????????????????????->charger_dev_plug_in(info->chg1_dev); ????????????????????????????????????->chg_dev->ops->plug_in(chg_dev)????//hl7019沒實(shí)現(xiàn),不會報(bào)錯(cuò)嗎 ????????????????????->if?(info->charger_thread_polling?==?true) ????????????????????????->mtk_charger_start_timer(info);????//開啟定時(shí)器用于喚醒線程 ????????????????????????????->alarm_start(&pinfo->charger_timer,?ktime); mtk_charger.c???????->charger_update_data(info)?//檢查電池溫度 ????????????????????->check_battery_exist(info) ????????????????????->check_dynamic_mivr(info) ????????????????????->charger_check_status(info)????//檢查充電過程中溫度、時(shí)間、vbus電壓等等,拔插中斷不會跑 ????????????????????????->charging?=?true/false;????//先默認(rèn)為true,然后根據(jù)不同狀態(tài)決定是否賦值false ? ? ? ? ? ? ? ? ? ? ? ? ->if (!mtk_chg_check_vbus(info)) ?//檢查充電器vbus電壓 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->charging = false; ? ? ? ? ? ? ? ? ? ? ? ? ->if (mt_get_charger_type() == CHARGER_UNKNOWN)?//如果是拔出充電器狀態(tài),那么直接return; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->return; ? ? ? ? ? ? ? ? ? ? ? ? ->mtk_battery_notify_check(info); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->mtk_battery_notify_VCharger_check(info); ?//檢查充電器電壓 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->mtk_battery_notify_VBatTemp_check(info); ?//檢查電池溫度 ????????????????????????->if?(charging?!=?info->can_charging)???//如果狀態(tài)發(fā)生改變(充電器插入時(shí),一般這里不會跑,因?yàn)檫@兩個(gè)值都是true) ????????????????????????????->_charger_manager_enable_charging(info->chg1_consumer,0,?charging); ????????????????????????????????->_mtk_charger_do_charging(info,?en); ????????????????????????????????????->info->do_charging(info,?en); ????????????????????????????????????????->mtk_switch_charging_do_charging(struct?charger_manager?*info,?bool?en) ????????????????????????????????????????????->if?(en) ????????????????????????????????????????????????->algo_data->disable_charging?=?false; ????????????????????????????????????????????????->algo_data->state?=?CHR_CC; ????????????????????????????????????????????????->charger_manager_notifier(info,?CHARGER_NOTIFY_NORMAL); ????????????????????????????????????????????????????->int?battery_callback(struct?notifier_block?*nb,?unsigned?long?event,?void?*v) ????????????????????????????????????????????????????????->battery_main.BAT_STATUS?=?POWER_SUPPLY_STATUS_CHARGING; ????????????????????????????????????????????????????????->battery_update(&battery_main); ????????????????????????????????????????????->else ????????????????????????????????????????????????->algo_data->disable_charging?=?true; ????????????????????????????????????????????????->algo_data->state?=?CHR_ERROR; ????????????????????????????????????????????????->charger_manager_notifier(info,?CHARGER_NOTIFY_ERROR); ????????????????????????????????????????????????????->int?battery_callback(struct?notifier_block?*nb,?unsigned?long?event,?void?*v) ????????????????????????????????????????????????????????->battery_main.BAT_STATUS?=?POWER_SUPPLY_STATUS_NOT_CHARGING; ????????????????????????????????????????????????????????->battery_update(&battery_main); ????????????????????????????????????????????????->_disable_all_charging(info); ????????????????????????????????????????????????????->charger_dev_enable(info->chg1_dev,?false); ????????????????????->kpoc_power_off_check(info) ????????????????????????->boot_mode?=?get_boot_mode(); ????????????????????????->if?(boot_mode?==?KERNEL_POWER_OFF_CHARGING_BOOT?||?boot_mode?==?LOW_POWER_OFF_CHARGING_BOOT)?{ ????????????????????????????->orderly_poweroff(true);???//if?(system_state?!=?SYSTEM_POWER_OFF)?//system_state是整個(gè)系統(tǒng)的全局變量 ????????????????????->if?(is_charger_on?==?true)?{ ????????????????????????->info->do_algorithm(info); mtk_switch_charging.c???????->mtk_switch_charging_run(struct?charger_manager?*info) ????????????????????????????????->struct?switch_charging_alg_data?*swchgalg?=?info->algorithm_data ????????????????????????????????->switch?(swchgalg->state)?{ ????????????????????????????????->case?CHR_CC: ????????????????????????????????????->mtk_switch_chr_cc(info) ????????????????????????????????????????->get_monotonic_boottime(&time_now);????//獲取當(dāng)前時(shí)間 ????????????????????????????????????????->charging_time?=?timespec_sub(time_now,?swchgalg->charging_begin_time);????//相減得到充電時(shí)間 ????????????????????????????????????????->swchg_turn_on_charging(info) ????????????????????????????????????????????->swchg_select_charging_current_limit(info)?//如果不是META_BOOT ????????????????????????????????????????????????->struct?charger_data?*pdata?=?&info->chg1_data; ????????????????????????????????????????????????->charger_dev_set_input_current(info->chg1_dev,?pdata->input_current_limit) ????????????????????????????????????????????????????->chg_dev->ops->set_input_current(chg_dev,?uA) ?//kernel-4.14/drivers/power/supply/mediatek/charger/hl7019.c ????????????????????????????????????????????????->charger_dev_set_charging_current(info->chg1_dev,?pdata->charging_current_limit) ????????????????????????????????????????????????????->chg_dev->ops->set_charging_current(chg_dev,?uA) ????????????????????????????????????????????????->/*If?thermal?current?limit?is?larger?than?charging?IC's?minimum?current?setting,?enable?the?charger?immediately*/ ????????????????????????????????????????????????????->charger_dev_enable(info->chg1_dev,?true); ????????????????????????????????????????????->swchg_select_cv(info); ????????????????????????????????????????????????->charger_dev_set_constant_voltage(info->chg1_dev,?constant_voltage); ????????????????????????????????????????????->charger_dev_enable(info->chg1_dev,?charging_enable) ????????????????????????????????????????????????->chg_dev->ops->enable(chg_dev,?en) ????????????????????????????????????????->charger_dev_is_charging_done(info->chg1_dev,?&chg_done);??//讀取充電IC?CHRG_STAT狀態(tài),判斷是否充滿 ????????????????????????????????????????????->chg_dev->ops->is_charging_done(chg_dev,?done); ????????????????????????????????????????->if?(chg_done) ????????????????????????????????????????????->swchgalg->state?=?CHR_BATFULL; ????????????????????????????????????????????->charger_dev_do_event(info->chg1_dev,?EVENT_EOC,?0); ????????????????????????????????????????????????->chg_dev->ops->event(chg_dev,?event,?args); ????????????????????????????????????????????????????->charger_dev_notify(chg_dev,?CHARGER_DEV_NOTIFY_EOC); ?//充電IC驅(qū)動的.event()會調(diào)用charger_dev_notify() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ->srcu_notifier_call_chain(&chg_dev->evt_nh, event, &chg_dev->noti); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?->int?charger_dev_event(struct?notifier_block?*nb,?unsigned?long?event,?void?*v)??//?? ????????????????????????????????->case?CHR_BATFULL: ????????????????????????????????????->mtk_switch_chr_full(info); ????????????????????????????????????????->swchg_select_cv(info);????//如果被JEITA降低了,這里重新設(shè)回來 ????????????????????????????????????????->info->polling_interval?=?CHARGING_FULL_INTERVAL; ?//20s ????????????????????????????????????????->charger_dev_is_charging_done(info->chg1_dev,?&chg_done); ????????????????????????????????????????->if?(!chg_done) ????????????????????????????????????????????->swchgalg->state?=?CHR_CC; ????????????????????????????????????????????->get_monotonic_boottime(&swchgalg->charging_begin_time); ????????????????????????????????????????????->info->polling_interval?=?CHARGING_INTERVAL;??? ????????????????????????????????->mtk_switch_check_charging_time(info);?//check?total?charging?time ????????????????????????????????->charger_dev_dump_registers(info->chg1_dev); ????????????????????????????????????->chg_dev->ops->dump_registers(chg_dev) mtk_charger.c???????????->wakeup_sc_algo_cmd(&pinfo->sc.data,?SC_EVENT_CHARGING,?0); ????????????????????->if?(is_charger_on?==?false)?{ ????????????????????????->wakeup_sc_algo_cmd(&pinfo->sc.data,?SC_EVENT_STOP_CHARGING,?0); ????????????????????__pm_relax(&info->charger_wakelock);???//減少combined_event_count計(jì)數(shù) |