Linux内核中电源供应类(Power Supply Class)的核心实现,文件名power_supply_core.c。它提供了一个通用的框架,用于管理各种电源供应设备,如电池、充电器、AC电源等。该类允许驱动程序注册电源供应设备,并通过sysfs接口暴露属性(如电压、电流、容量等),便于用户空间程序监控和控制电源状态。
文件的主要功能包括:
- 电源供应设备的注册和注销:允许驱动注册电源供应,并处理依赖关系(如一个电源是否由另一个供应)。
- 属性管理:通过power_supply_desc结构定义电源的属性,并提供获取/设置属性的接口。
- 事件通知:使用通知链(notifier)和工作队列处理电源变化事件。
- 设备树支持(在CONFIG_OF启用时):从设备树中解析电源供应关系和电池信息。
- 热管理和冷却设备集成(在CONFIG_THERMAL启用时):与热管理系统集成,允许监控温度并调整充电限值。
- 电池信息解析:从设备树中提取电池参数,如容量、电压阈值、OCV(开路电压)表格等。
- 辅助函数:如检查电源供应关系、计算电阻或容量等。
文件使用模块化设计,导出符号供其他内核模块使用(如驱动程序)。它支持延迟注册以避免探针函数中的竞争条件,并处理电源间的依赖(如供应商-消费者关系)。
文件分为几个部分:
- 全局变量和结构定义。
- 电源变化处理函数。
- 延迟注册工作。
- 设备树相关函数(条件编译)。
- 供应关系检查和查询函数。
- 属性设置和获取函数。
- 引用计数管理(get/put)。
- 电池信息处理函数。
- 热管理和冷却函数(条件编译)。
- 注册/注销核心函数。
- 模块初始化/退出。
下面,我将按文件中的出现顺序,逐个函数进行详细说明。每个函数的说明包括:
- 函数签名:参数和返回值。
- 目的:函数的作用。
- 详细说明:内部逻辑、关键点、潜在问题。
- 使用场景:何时调用。
为了清晰,我使用表格列出所有函数及其简要描述,然后逐一展开细节。
函数列表表格
| 函数名 | 简要描述 |
|---|---|
| __power_supply_is_supplied_by | 检查一个电源是否由另一个电源供应,支持supplied_to和supplied_from模式。 |
| __power_supply_changed_work | 处理电源变化时通知依赖的电源。 |
| power_supply_changed_work | 工作队列函数,处理电源变化事件,包括通知和更新。 |
| power_supply_changed | 标记电源变化并调度工作队列。 |
| power_supply_deferred_register_work | 延迟注册工作,等待父设备探针完成后再触发变化事件和冷却注册。 |
| __power_supply_populate_supplied_from | 从设备树填充supplied_from列表(CONFIG_OF)。 |
| power_supply_populate_supplied_from | 遍历所有电源填充supplied_from(CONFIG_OF)。 |
| __power_supply_find_supply_from_node | 检查设备节点是否匹配电源的of_node(CONFIG_OF)。 |
| power_supply_find_supply_from_node | 在类中查找匹配设备节点的电源(CONFIG_OF)。 |
| power_supply_check_supplies | 检查并填充电源的供应列表,从设备树或属性读取。 |
| __power_supply_am_i_supplied | 检查电源是否被另一个电源供应并在线(辅助函数)。 |
| power_supply_am_i_supplied | 检查电源是否有在线供应商。 |
| __power_supply_is_system_supplied | 检查非电池电源是否在线(辅助函数)。 |
| power_supply_is_system_supplied | 检查系统是否有在线电源(非电池)。 |
| __power_supply_get_supplier_max_current | 获取供应商的最大电流(辅助函数)。 |
| power_supply_set_input_current_limit_from_supplier | 从供应商设置输入电流限制。 |
| power_supply_set_battery_charged | 设置电池为已充满(仅电池类型)。 |
| power_supply_match_device_by_name | 匹配电源名称的设备(辅助函数)。 |
| power_supply_get_by_name | 通过名称获取电源引用。 |
| power_supply_put | 释放电源引用。 |
| power_supply_match_device_node | 匹配设备节点的电源(CONFIG_OF,辅助函数)。 |
| power_supply_get_by_phandle | 通过phandle获取电源引用(CONFIG_OF)。 |
| power_supply_match_device_node_array | 匹配多个设备节点的电源(CONFIG_OF,辅助函数)。 |
| power_supply_get_by_phandle_array | 通过phandle数组获取多个电源引用(CONFIG_OF)。 |
| devm_power_supply_put | 设备管理释放电源引用(CONFIG_OF)。 |
| devm_power_supply_get_by_phandle | 设备管理的phandle获取电源(CONFIG_OF)。 |
| power_supply_get_battery_info | 从设备树解析电池信息。 |
| power_supply_put_battery_info | 释放电池信息分配的内存。 |
| power_supply_temp2resist_simple | 根据温度查找电池内部电阻百分比。 |
| power_supply_ocv2cap_simple | 根据OCV查找电池容量。 |
| power_supply_find_ocv2cap_table | 查找最匹配温度的OCV表格。 |
| power_supply_batinfo_ocv2cap | 使用电池信息计算OCV到容量的映射。 |
| power_supply_get_property | 获取电源属性值。 |
| power_supply_set_property | 设置电源属性值。 |
| power_supply_property_is_writeable | 检查属性是否可写。 |
| power_supply_external_power_changed | 通知外部电源变化。 |
| power_supply_powers | 在sysfs中创建"powers"链接。 |
| power_supply_dev_release | 释放电源设备内存。 |
| power_supply_reg_notifier | 注册电源通知器。 |
| power_supply_unreg_notifier | 注销电源通知器。 |
| power_supply_read_temp | 读取温度(CONFIG_THERMAL)。 |
| psy_register_thermal | 注册热区设备(CONFIG_THERMAL)。 |
| psy_unregister_thermal | 注销热区设备(CONFIG_THERMAL)。 |
| ps_get_max_charge_cntl_limit | 获取最大充电控制限值(CONFIG_THERMAL)。 |
| ps_get_cur_charge_cntl_limit | 获取当前充电控制限值(CONFIG_THERMAL)。 |
| ps_set_cur_charge_cntl_limit | 设置当前充电控制限值(CONFIG_THERMAL)。 |
| psy_register_cooler | 注册冷却设备(CONFIG_THERMAL)。 |
| psy_unregister_cooler | 注销冷却设备(CONFIG_THERMAL)。 |
| __power_supply_register | 内部注册电源供应。 |
| power_supply_register</ |

最低0.47元/天 解锁文章
3928

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



