原文网址(转载请注明出处):
源码基于:Android Q
目录
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

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

6112

被折叠的 条评论
为什么被折叠?



