Linux下的power_supply小析

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值