1 内核注册供电设备
内核通过 devm_power_supply_register 或者 power_supply_register 注册供电相关的设备
2 获取电量的方式
电量是电池相关的信息,所以,注册的供电设备为: battery
例如:
static const struct power_supply_desc batt_psy_desc = {
.name = "battery", //注册的供电设备名
.type = POWER_SUPPLY_TYPE_BATTERY, //注册的供电设备类型为电池
.properties = smb5_batt_props,
.num_properties = ARRAY_SIZE(smb5_batt_props),
.get_property = smb5_batt_get_prop,
.set_property = smb5_batt_set_prop,
.property_is_writeable = smb5_batt_prop_is_writeable,
};
healthd 通过 power_supply_get_property 接口获取电量:
psy->desc->name = “battery”
“ psp = POWER_SUPPLY_PROP_CAPACITY ”
int power_supply_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
/*
以上变量中: psy->desc->name = "battery"
psp = POWER_SUPPLY_PROP_CAPACITY
*/
if (atomic_read(&psy->use_cnt) <= 0) {
if (!psy->initialized)
return -EAGAIN;
return -ENODEV;
}
return psy->desc->get_property(psy, psp, val);//函数指针最终调用smb5_batt_get_prop
}
代码流程可以通过adb获取电量的方法跟踪代码:
adb root
adb shell
cd /sys/class/power_supply/battery
cat capacity
55 //电量为55%
3 电池在位检测
adb root
adb shell
cd /sys/class/power_supply/battery
cat present
1 //电池在位
0 //电池不在位
获取状态的流程如下:
power_supply_get_property
psy->desc->name = “battery”
psp = POWER_SUPPLY_PROP_PRESENT
int power_supply_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
/*
以上变量中: psy->desc->name = "battery"
psp = POWER_SUPPLY_PROP_PRESENT
*/
if (atomic_read(&psy->use_cnt) <= 0) {
if (!psy->initialized)
return -EAGAIN;
return -ENODEV;
}
return psy->desc->get_property(psy, psp, val);//函数指针最终调用smb5_batt_get_prop
}
重点: psp = POWER_SUPPLY_PROP_PRESENT