makefile:
obj-$(CONFIG_MTK_CHARGER) += charger_class.o mtk_basic_charger.o mtk_charger.o mtk_charger_algorithm_class.o mtk_charger_intf.o adapter_class.o mtk_pd_adapter.o mtk_pd.o mtk_pd_hal.o mtk_pulse_charger.o
obj-$(CONFIG_CHARGER_TYPE_MT6357) += mt6357-charger-type.o
obj-$(CONFIG_CHARGER_MT6357) += mt6357-pulse-charger.o
obj-$(CONFIG_CHARGER_HL7005) += hl7005.o
static int __init charger_class_init(void)
{
charger_class = class_create(THIS_MODULE, "switching_charger"); //建立一个节点到sys 可以 用户通讯
if (IS_ERR(charger_class)) {
pr_notice("Unable to create charger class; errno = %ld\n",
PTR_ERR(charger_class));
return PTR_ERR(charger_class);
}
charger_class->dev_groups = charger_groups;
return 0;
}
/**
* charger_device_register - create and register a new object of
* charger_device class.
*/
struct charger_device *charger_device_register-
device_register(&chg_dev->dev);
chg_dev->ops = ops
提供一下接口函数 例如如下:
int charger_dev_set_input_current(struct charger_device *chg_dev, u32 uA)
{
if (chg_dev != NULL && chg_dev->ops != NULL &&
chg_dev->ops->set_input_current)
return chg_dev->ops->set_input_current(chg_dev, uA);
return -ENOTSUPP;
}
EXPORT_SYMBOL(charger_dev_set_input_current);
搜了一下
kernel-4.19/drivers/power/supply/mtk_basic_charger.c:438: charger_dev_set_input_current(info->chg1_dev,
kernel-4.19/drivers/power/supply/mtk_pulse_charger.c:259: charger_dev_set_input_current(info->chg1_dev,
kernel-4.19/drivers/power/supply/mtk_pulse_charger.c:473: charger_dev_set_input_current(info->chg1_dev,
被mtk 默认的充电器调用,也就是我们注册一个充电i2c的充电设备,实现ops接口,mtk 会通过机器充电器算法 调用接口。
mtk_basic_charger.c ---->
static int do_algorithm(struct mtk_charger *info)
{
。。。。。。。。。。
is_basic = select_charging_current_limit(info, &info->setting);
charger_dev_do_event(info->chg1_dev, EVENT_FULL, 0);
。。。。。。。。。。。。
chg_alg_set_current_limit(alg, &info->setting);
charger_dev_set_input_current(info->chg1_dev,pdata->input_current_limit);
}
'
int mtk_basic_charger_init(struct mtk_charger *info)
{
info->algo.do_algorithm = do_algorithm;
info->algo.enable_charging = enable_charging;
info->algo.do_event = charger_dev_event;
//info->change_current_setting = mtk_basic_charging_current;
return 0;
}
前面make 中 obj-$(CONFIG_MTK_CHARGER) += charger_class.o mtk_basic_charger.o mtk_charger.o mtk_charger_algorithm_class.o mtk_charger_intf.o adapter_class.o mtk_pd_adapter.o mtk_pd.o mtk_pd_hal.o mtk_pulse_charger.o
mtk_basic_charger_init 里面 是默认充电器算法 主要实现 enable_charging和do_algorithm;
我们其他函数 mtk_pulse_charger.c
int mtk_pulse_charger_init(struct mtk_charger *info)
{
static struct pcharger_data pdata;
pr_notice("%s\n", __func__);
info->algo.do_algorithm = pchr_do_algorithm;
info->algo.enable_charging = mtk_linear_charging_do_charging;
//info->algo.do_event = charger_dev_event;
info->algo.algo_data = &pdata;
mtk_pulse_charger_parse_dt(info, &info->pdev->dev);
pr_notice("%s end\n", __func__);
return 0;
}
我们搜下 mtk_pulse_charger_init 和 mtk_basic_charger_init ;
结果如下 :
kernel-4.19/drivers/power/supply/mtk_charger.c:166: mtk_basic_charger_init(info);
kernel-4.19/drivers/power/supply/mtk_charger.c:169: mtk_pulse_charger_init(info);
我们看到在一块我们猜下是在干嘛。
if (of_property_read_string(np, "algorithm_name",
&info->algorithm_name) < 0) {
chr_err("%s: no algorithm_name name\n", __func__);
info->algorithm_name = "Basic";
}
if (strcmp(info->algorithm_name, "Basic") == 0) {
chr_err("found B

本文详细解读了MTK平台的充电器驱动与电池管理系统的交互,涉及Makefile配置、充电器算法选择、接口函数实现、DTS配置与power_supply_class注册。重点讲解了如何通过DTS决定运行哪个充电器算法,并剖析了pd接口和电池信息获取的过程。
最低0.47元/天 解锁文章
1515





