展锐Kernel层电量百分比获取流程

本文详细解析了AndroidQ中电池管理系统的工作原理,包括节点注册流程、节点回调方法的初始化、capacity节点的写入过程,以及sc27xx_fuel_gauge驱动在电池容量计算和设置中的角色。

原文网址(转载请注明出处):

http://t.csdnimg.cn/OIfb7

源码基于:Android  Q

目录

1.介绍

2.节点注册流程

3.节点回调方法的初始化流程

4.写入capacity节点流程

1.介绍

查看sys目录下battery下节点信息,主要节点的功能如下:

/sys/class/power_supply/battery

    • battery_charging_enabled: 表示电池在充电,插着充电器,不一定给电池供电的( 可能只是给设备供电,没有通过电池)
    • capacity:电池百分比
    • capacity_raw
    • charging_enabled :表示充电器存在,即充电器是插入状态,系统有闪电图标也表示充电器在,但是不表示在充电
    • health : 电池健康状态
    • status : 电池的状态,是否充电等
    • voltage_max : 电池最大电压(满电时的电压)
    • voltage_now : 电池当前电压
    • ...

2.节点注册流程

每个节点的注册都在bsp/kernel/kernel4.14/drivers/power/supply/power_supply_sysfs.c代码中:

bsp/kernel/kernel4.14/drivers/power/supply/power_supply_sysfs.c

#define POWER_SUPPLY_ATTR(_name)                    \
{                                   \
    .attr = { .name = #_name },                 \
    .show = power_supply_show_property,             \
    .store = power_supply_store_property,               \
}

static struct device_attribute power_supply_attrs[] = {
    POWER_SUPPLY_ATTR(status),
    POWER_SUPPLY_ATTR(charge_type),
    POWER_SUPPLY_ATTR(health),
    POWER_SUPPLY_ATTR(capacity),
    ...
    POWER_SUPPLY_ATTR(capacity_raw),
    ...
};

在节点中,当我们使用echo 向节点写值时会调用.store 指向的方法,通过cat 读取节点时会调用.show方法。

3.节点回调方法的初始化流程

bsp/kernel/kernel4.14/drivers/power/supply/power_supply_core.c
 
static int __init power_supply_class_init(void)
{
    power_supply_class = class_create(THIS_MODULE, "power_supply");
 
    if (IS_ERR(power_supply_class))
        return PTR_ERR(power_supply_class);
 
    power_supply_class->dev_uevent = power_supply_uevent;
    power_supply_init_attrs(&power_supply_dev_type);   // 初始化power_supply子节点信息和回调函数
 
    return 0;
}
 
subsys_initcall(power_supply_class_init);  // 该驱动加载时会首先调用此方法调用power_supply_class_init() 方法
module_exit(power_supply_class_exit);      // kernel 退出时会调用此此昂发
 
MODULE_DESCRIPTION("Universal power supply monitor class");
MODULE_AUTHOR("Ian Molton <spyro@f2s.com>, "
          "Szabolcs Gyurko, "
          "Anton Vorontsov <cbou@mail.ru>");
MODULE_LICENSE("GPL");
bsp/kernel/kernel4.14/drivers/power/supply/power_supply_sysfs.c
 
...
static struct attribute *__power_supply_attrs[ARRAY_SIZE(power_supply_attrs) + 1];
...
void power_supply_init_attrs(struct device_type *dev_type)
{
    int i;
 
    dev_type->groups = power_supply_attr_groups;
 
    for (i = 0; i < ARRAY_SIZE(power_supply_attrs); i++)
        __power_supply_attrs[i] = &power_supply_attrs[i].attr;
}
 
static struct attribute_group power_supply_attr_group = {
    .attrs = __power_supply_attrs,
    .is_visible = power_supply_attr_is_visible,
};
 
static const struct attribute_group *power_supply_attr_groups[] = {
    &power_supply_attr_group,
    NULL,
};

会将所有节点的attr 保存到__power_supply_attrs 数组中,传给power_supply_attr_groups 结构体中完成之后的注册流程。

4.写入capacity节点流程

bsp/kernel/kernel4.14/drivers/power/supply/charger-manager.c
 
static struct platform_driver charger_manager_driver = {
    .driver = {
        .name = "charger-manager",
        .pm = &charger_manager_pm,
        .of_match_table = charger_manager_match,
    },
    .probe = charger_manager_probe,
    .remove = charger_manager_remove,
    .shutdown = charger_man
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lion_heart001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值