搜索

40

主题

41

帖子

226

积分

版主

Rank: 7Rank: 7Rank: 7

积分
226
发表于 2021-3-18 17:47:42 150 浏览 0 回复

MTK Pump_Express充电

本帖最后由 longrz 于 2021-3-19 10:39 编辑

快充充电电压的设置流程
在 Mtk_charger.c根据dts中的配置选择初始化充电算法 ,
在static void mtk_charger_parse_dt(struct mtk_charger *info,struct device *dev)函数中
调用mtk_basic_charger_init(info);

在static int charger_routine_thread(void *arg)函数中
充电唤醒线程的时候会执行充电算法的初始化charger_init_algo

在static bool charger_init_algo(struct mtk_charger *info)函数中选择pe 或者pd算法充电方式

在int chg_alg_init_algo(struct chg_alg_device *alg_dev)中最终会调用到对应Mtk_pe2.c文件

在 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)函数

快充充电器的升压电压代码如下
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;
}

充电电流的设置流程如下:
在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电压越低。

普通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的功率了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则


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