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计数 ->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没实现,不会报错吗 ->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); //保存充电启示时间 ->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没实现,不会报错吗 ->if (info->charger_thread_polling == true) ->mtk_charger_start_timer(info); //开启定时器用于唤醒线程 ->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) //检查充电过程中温度、时间、vbus电压等等,拔插中断不会跑 ->charging = true/false; //先默认为true,然后根据不同状态决定是否赋值false ->if (!mtk_chg_check_vbus(info)) //检查充电器vbus电压 ->charging = false; ->if (mt_get_charger_type() == CHARGER_UNKNOWN) //如果是拔出充电器状态,那么直接return; ->return; ->mtk_battery_notify_check(info); ->mtk_battery_notify_VCharger_check(info); //检查充电器电压 ->mtk_battery_notify_VBatTemp_check(info); //检查电池温度 ->if (charging != info->can_charging) //如果状态发生改变(充电器插入时,一般这里不会跑,因为这两个值都是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是整个系统的全局变量 ->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); //获取当前时间 ->charging_time = timespec_sub(time_now, swchgalg->charging_begin_time); //相减得到充电时间 ->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状态,判断是否充满 ->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驱动的.event()会调用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降低了,这里重新设回来 ->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计数 |