快充充电电压的设置流程
1.在 Mtk_charger.c根据dts中的配置选择初始化充电算法 ,
在static void mtk_charger_parse_dt(struct mtk_charger *info,struct device *dev)函数中
调用mtk_basic_charger_init(info);其中注意mtk_charger_parse_dt中获取的参数 charger_configuration 该值为0时代表一个充电器,为1时为双充电器
2.在static int charger_routine_thread(void *arg)函数中
充电唤醒线程的时候会执行充电算法的初始化charger_init_algo
3.在static bool charger_init_algo(struct mtk_charger *info)函数中选择pe 或者pd算法充电方式
4.在int chg_alg_init_algo(struct chg_alg_device *alg_dev)中最终会调用到对应Mtk_pe2.c文件
5.在 static int _pe2_init_algo(struct chg_alg_device *alg)文件中设置调用
int pe2_hal_set_efficiency_table(struct chg_alg_device *alg)函数,最终调用到
static int mt6370_set_pep20_efficiency_table(struct charger_device *chg_dev)函数
6.快充充电器的升压电压代码如下
static int mt6370_set_pep20_efficiency_table(struct charger_device *chg_dev)
{
#ifdef FIXME /* TODO: without charger manager */
struct charger_manager *chg_mgr = NULL;
chg_mgr = charger_dev_get_drvdata(chg_dev);
if (!chg_mgr)
return -EINVAL;
chg_mgr->pe2.profile[0].vchr = 8000000;
chg_mgr->pe2.profile[1].vchr = 8000000;
chg_mgr->pe2.profile[2].vchr = 8000000;
chg_mgr->pe2.profile[3].vchr = 8500000;
chg_mgr->pe2.profile[4].vchr = 8500000;
chg_mgr->pe2.profile[5].vchr = 8500000;
chg_mgr->pe2.profile[6].vchr = 9000000;
chg_mgr->pe2.profile[7].vchr = 9000000;
chg_mgr->pe2.profile[8].vchr = 9000000;
chg_mgr->pe2.profile[9].vchr = 9000000;
#endif
return 0;
}
7.充电电流的设置流程如下:
在charger_routine_thread 线程中调用do_algorithm最终调用到Mtk_basic_charger.c文件中的static int do_algorithm(struct mtk_charger *info)函数中
最终调用到 static bool select_charging_current_limit(struct mtk_charger *info,
struct chg_limit_setting *setting)函数
注意:设置快充时需要注意的是 MTK 使用单个mt6370充电是最大功率为13.5W,当我们设置VBUS电压越高会导致IBUS电压越低。
8.普通5V2A充电器充电功率无法达到10W
在使用5V2A充电的时候发现充电电流只有500mA,根据log信息
m:0 chg1:-1,-1,500,500 chg2:-1,-1,0,0 type:5:5 usb_unlimited:0 usbif:0 usbsm:0 aicl:-1 atm:0 bm:0 b:0
该log信息是在函数static bool select_charging_current_limit(struct mtk_charger *info,
struct chg_limit_setting *setting)中打印出来的
该log的打印代码如下:
chr_err("m:%d chg1:%d,%d,%d,%d chg2:%d,%d,%d,%d type:%d:%d usb_unlimited:%d usbif:%d usbsm:%d aicl:%d atm:%d bm:%d b:%d\n",
info->config,
_uA_to_mA(pdata->thermal_input_current_limit),
_uA_to_mA(pdata->thermal_charging_current_limit),
_uA_to_mA(pdata->input_current_limit),
_uA_to_mA(pdata->charging_current_limit),
_uA_to_mA(pdata2->thermal_input_current_limit),
_uA_to_mA(pdata2->thermal_charging_current_limit),
_uA_to_mA(pdata2->input_current_limit),
_uA_to_mA(pdata2->charging_current_limit),
info->chr_type, info->pd_type,
info->usb_unlimited,
IS_ENABLED(CONFIG_USBIF_COMPLIANCE), info->usb_state,
pdata->input_current_limit_by_aicl, info->atm_enabled,
info->bootmode, is_basic);
pdata->input_current_limit,
pdata->charging_current_limit被限制为500mA
查找赋值的地方为
if (adapter_dev_get_property(info->pd_adapter, TYPEC_RP_LEVEL)
== 3000) {
pdata->input_current_limit = 3000000;
pdata->charging_current_limit = 3000000;
} else if (adapter_dev_get_property(info->pd_adapter,
TYPEC_RP_LEVEL) == 1500) {
pdata->input_current_limit = 1500000;
pdata->charging_current_limit = 2000000;
} else {
chr_err("type-C: inquire rp error\n");
pdata->input_current_limit = 500;
pdata->charging_current_limit = 500;
}
int adapter_dev_get_property(struct adapter_device *adapter_dev,
enum adapter_property sta);通过cc1 cc2协议 经过pd算法,该函数未获取到设配器的相关信息,所以将电流限制在了500mA。
强制将pdata->input_current_limit = 3200000;
pdata->charging_current_limit = 2000000;
插上充电器发现报如下log
m:0 chg1:-1,-1,1450,2000 chg2:-1,-1,0,0 type:5:5 usb_unlimited:0 usbif:0 usbsm:0 aicl:1450000 atm:0 bm:0 b:1
aicl被限制为1450mA导致电流无法达到5V2A,代码如下:
charger_dev_run_aicl(info->chg1_dev,
&pdata->input_current_limit_by_aicl);
if (info->enable_dynamic_mivr) {
if (pdata->input_current_limit_by_aicl >
info->data.max_dmivr_charger_current)
pdata->input_current_limit_by_aicl =
info->data.max_dmivr_charger_current;
}
if (is_basic == true && pdata->input_current_limit_by_aicl != -1) {
if (pdata->input_current_limit_by_aicl < pdata->input_current_limit)
pdata->input_current_limit = pdata->input_current_limit_by_aicl;
}
查找文档发现 aicl 是用来防止在功率一定的充电适配器 情况下 P=U*I,当IBUS电流增大时,UBUS会跌落导致plug out,触发aicl的条件是VBUS充电的自小电压低于在dts中
charger: charger {
compatible = "mediatek,charger";
gauge = <&mtk_gauge>;
charger = <&mt6370_chg>;
bootmode = <&chosen>;
pmic = <&main_pmic>;
algorithm_name = "Basic";
charger_configuration= <0>;
/* common */
battery_cv = <4350000>;
max_charger_voltage = <6500000>;
min_charger_voltage = <4600000>;
min_charger_voltage + 200000时
会触发限制充电电流
只需要将min_charger_voltage = <4600000>改为min_charger_voltage = <4400000>;5V2A的适配器就能输出额定10W的功率了。