power_supply 探究设备 关系

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

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

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值