[linux thermal] power_supply_core和thermal_core的关系

power_supply_core和thermal_core的关系

源代码版本k5.15

1、power_supply_core.c提供power supply的相关接口,比如:

struct power_supply *__must_check power_supply_register(struct device *parent,
		const struct power_supply_desc *desc,
		const struct power_supply_config *cfg)

2、thermal_core.c提供thermal相关的接口,比如:

struct thermal_zone_device *
thermal_zone_device_register(const char *type, int trips, int mask,
			     void *devdata, struct thermal_zone_device_ops *ops,
			     struct thermal_zone_params *tzp, int passive_delay,
			     int polling_delay)
struct thermal_cooling_device *
thermal_cooling_device_register(const char *type, void *devdata,
				const struct thermal_cooling_device_ops *ops)

3、两者之间的关系

struct power_supply *__must_check power_supply_register() {
	//......
	rc = psy_register_thermal(psy);//-----> thermal_zone_device_register() 
	if (rc)
		goto register_thermal_failed;

	rc = psy_register_cooler(psy);//-----> thermal_cooling_device_register()
	if (rc)
		goto register_cooler_failed;
	//......
}

4、应用示例

charger-manager
电池充电设备驱动的热管理需要注册thermal zone device和thermal cooling device,在驱动注册时probe函数会调用
power_supply_register()来注册

static int charger_manager_probe(struct platform_device *pdev)
{
	struct charger_desc *desc = cm_get_drv_data(pdev);
	struct charger_manager *cm;
	
	//.........cm数据结构初始化
	cm->charger_psy = power_supply_register(&pdev->dev,
						&cm->charger_psy_desc,
						&psy_cfg);
	if (IS_ERR(cm->charger_psy)) {
		dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n",
			cm->charger_psy_desc.name);
		return PTR_ERR(cm->charger_psy);
	}
	//............
}

所以,在编码时需要注意其他模块对thermal的依赖。

5、参考链接

https://elixir.bootlin.com/linux/v5.15/source/drivers/thermal/thermal_core.c
https://elixir.bootlin.com/linux/v5.15/source/drivers/power/supply/power_supply_core.c
https://elixir.bootlin.com/linux/v5.15/source/drivers/power/supply/charger-manager.c

<think>好的,我现在需要处理用户关于Android 7.1中BAT_EC电池设备实现或相关问题的查询。首先,用户提到的BAT_EC可能指的是电池电量计(Battery Fuel Gauge)或相关的硬件模块,通常在Android系统中通过HAL(硬件抽象层)与内核驱动进行交互。我需要回忆Android电源管理子系统的基本结构,特别是电池相关的部分。 Android的电池信息通常由内核通过sysfs或power_supply子系统提供,用户空间的BatteryService会读取这些信息。BAT_EC可能涉及具体的硬件驱动,比如嵌入式控制器(EC)负责监测电池状态。Android 7.1(Nougat)在这一块的实现是否有特别的变化呢?需要查阅相关文档或代码。 接下来,用户可能遇到的问题是电池状态更新不及时、电量显示不准确,或者驱动与HAL层的兼容性问题。常见的故障点可能在驱动未能正确上报电池信息,或者HAL层解析数据出错。此外,电池温度、电压等参数的读取是否正确,也可能影响系统行为。 然后,我需要考虑如何组织回答。首先解释Android电池管理的基本架构,然后具体到BAT_EC的实现,可能涉及的代码路径,比如kernel中的驱动位置,HAL层的接口,以及可能的配置文件日志排查方法。同时,引用相关的源码文件或文档,比如power_supply相关的驱动,或Android官方文档中的说明。 还要注意用户提到的系统级指令,比如使用正确的中文回答,生成相关问题,引用标识等。需要确保回答结构清晰,分点说明,并在适当的位置添加引用标记,例如提到代码文件时添加[^1]。 最后生成的相关问题需要围绕Android电池管理、BAT_EC驱动开发、电源问题排查等方向展开,帮助用户进一步深入理解或解决问题。</think>关于Android 7.1中BAT_EC电池设备的实现与问题分析: ### 一、BAT_EC的实现架构 在Android电源管理子系统中,`BAT_EC`通常指与嵌入式控制器(Embedded Controller)交互的电池设备驱动,其实现分为三个层级: 1. **内核驱动层** 通过`drivers/power/supply/`目录下的电源供应类驱动(如`bq27xxx_battery.c`)与EC通信,使用I²C/SMBus协议读取电池参数[^1] ```c // 示例:内核电池驱动结构体 static struct power_supply_desc bat_ec_desc = { .name = "bat_ec", .type = POWER_SUPPLY_TYPE_BATTERY, .get_property = bat_ec_get_property, }; ``` 2. **HAL层接口** `hardware/libhardware/include/hardware/power.h`定义`BATTERY_STATUS_CHANGED`事件,通过`uevent`监听内核通知[^2] 3. **Framework层处理** `BatteryService`在`frameworks/base/services/core/java/com/android/server/BatteryService.java`中解析`/sys/class/power_supply/`节点数据 ### 二、典型问题与排查方法 1. **电量数据异常** - 检查`/sys/class/power_supply/bat_ec/voltage_now`数值是否在合理范围(例如3.7-4.2V) - 确认EC固件版本与驱动兼容性,常见问题如: ```shell dmesg | grep -i "battery" # 查看内核日志 ``` 2. **充电状态不更新** - 验证`power_supply`子系统事件上报机制: ```c power_supply_changed(bat_ec_psy); // 驱动中触发状态更新 ``` - 检查`ueventd.rc`中设备节点权限设置 3. **温度检测失效** 需确认EC的thermal zone配置: ```device/xxx/xxx/thermal-engine.conf```中温度阈值设置 ### 三、优化实践 1. 通过修改`kernel/drivers/power/bq27xxx_battery.c`增加电池模型校准参数 2. 调整`frameworks/base/core/res/res/xml/power_profile.xml`中的电池特性曲线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值