Android手机过power_supply的节点获取充电和电池信息,今天来分析下power_supply。先不讲那么多,用个demo来熟悉下
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
struct mtk_charger_type {
struct power_supply_desc usb_desc;
struct power_supply_config usb_cfg;
enum power_supply_usb_type type;
struct power_supply *usb_psy;
};
static enum power_supply_property mt_usb_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_VOLTAGE_MAX,
};
static int mt_usb_get_property(struct power_supply *psy,enum power_supply_property psp, union power_supply_propval *val)
{
struct mtk_charger_type *info;
info = (struct mtk_charger_type *)power_supply_get_drvdata(psy);
switch (psp) {
case POWER_SUPPLY_PROP_ONLINE:
if ((info->type == POWER_SUPPLY_USB_TYPE_SDP) ||
(info->type == POWER_SUPPLY_USB_TYPE_CDP))
val->intval = 1;
else
val->intval = 0;
break;
case POWER_SUPPLY_PROP_CURRENT_MAX:
val->intval = 500000;
break;
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
val->intval = 5000000;
break;
default:
return -EINVAL;
}
return 0;
}
static int power_probe(struct platform_device *pdev)
{
struct mtk_charger_type *info;
info = devm_kzalloc(&pdev->dev, sizeof(*info),GFP_KERNEL);
if (!info)
return -ENOMEM;
info->usb_desc.name = "usb";
info->usb_desc.type = POWER_SUPPLY_TYPE_USB;
info->usb_desc.properties = mt_usb_properties;
info->usb_desc.num_properties = ARRAY_SIZE(mt_usb_properties);
info->usb_desc.get_property = mt_usb_get_property;
info->usb_cfg.drv_data = info;
info->usb_psy = power_supply_register(&pdev->dev,&info->usb_desc, &info->usb_cfg);
if (IS_ERR(info->usb_psy)) {
pr_notice("%s Failed to register power supply: %ld\n",__func__, PTR_ERR(info->usb_psy));
return PTR_ERR(info->usb_psy);
}
return 0;
}
static int power_remove(struct platform_devi

这篇博客介绍了如何在Android系统中通过分析power_supply节点获取充电状态和电池信息。示例代码展示了如何注册电源供应设备并创建对应的sysfs节点,包括online、current_max和voltage_max等属性。通过device_add和power_supply_register函数,设备节点被创建并在sys目录下显示,允许读取电池的当前最大电流和最大电压等关键属性。
最低0.47元/天 解锁文章
927

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



