MTK Linux Charger驱动分析(二) - power_supply_core.c
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 | 注册电源供应(支持唤醒)。 |
power_supply_register_no_ws | 注册电源供应(不支持唤醒)。 |
devm_power_supply_release | 设备管理释放电源。 |
devm_power_supply_register | 设备管理注册电源(支持唤醒)。 |
devm_power_supply_register_no_ws | 设备管理注册电源(不支持唤醒)。 |
power_supply_unregister | 注销电源供应。 |
power_supply_get_drvdata | 获取电源的驱动数据。 |
power_supply_class_init | 初始化电源类。 |
power_supply_class_exit | 退出电源类。 |
每个函数的详细说明
- **__power_supply_is_supplied_by(struct power_supply supplier, struct power_supply supply)
- 目的:检查supplier是否供应supply。
- 详细说明:支持两种模式:如果supply有supplied_from列表,检查supplier名称是否匹配;否则,如果supplier有supplied_to列表,检查supply名称是否匹配。返回true表示是供应关系。处理名称为空的情况。
- 使用场景:在电源依赖检查中使用,如通知变化时。
- 返回值:bool(true表示供应关系)。
- **__power_supply_changed_work(struct device dev, void data)
- 目的:处理电源变化时,通知依赖的电源。
- 详细说明:data是变化的电源psy。检查psy是否供应pst(从dev获取),如果是的,且pst有external_power_changed回调,则调用它。
- 使用场景:作为class_for_each_device的回调,在电源变化工作中遍历类设备。
- 返回值:0(总是)。
- *power_supply_changed_work(struct work_struct work)
- 目的:处理电源变化的工作队列函数。
- 详细说明:从work获取psy,使用自旋锁检查并清除changed标志。遍历类设备通知依赖电源,更新LED,调用通知链,发送uevent。处理竞争条件,确保所有事件处理后释放唤醒源。
- 使用场景:由power_supply_changed调度。
- 返回值:无。
- *power_supply_changed(struct power_supply psy)
- 目的:标记电源变化并调度工作。
- 详细说明:设置changed标志,保持唤醒,调度changed_work。
- 使用场景:驱动检测到变化时调用,如电池电量变化。
- 返回值:无。
- *power_supply_deferred_register_work(struct work_struct work)
- 目的:延迟处理注册后的变化事件和冷却注册。
- 详细说明:等待父设备互斥锁,调用power_supply_changed和psy_register_cooler。避免探针中过早调用get_property。
- 使用场景:注册后延迟调度。
- 返回值:无。
- **__power_supply_populate_supplied_from(struct device dev, void data) (CONFIG_OF)
- 目的:从设备树填充一个电源的supplied_from。
- 详细说明:遍历psy的"power-supplies" phandle,匹配epsy的of_node,添加名称到supplied_from。
- 使用场景:作为class_for_each_device回调。
- 返回值:0(总是)。
- *power_supply_populate_supplied_from(struct power_supply psy) (CONFIG_OF)
- 目的:填充电源的supplied_from列表。
- 详细说明:调用class_for_each_device遍历所有电源,使用上述辅助函数填充。
- 使用场景:在check_supplies中调用。
- 返回值:错误码(0成功)。
- **__power_supply_find_supply_from_node(struct device dev, void data) (CONFIG_OF)
- 目的:检查设备是否匹配节点。
- 详细说明:比较epsy的of_node与np,返回1表示匹配。
- 使用场景:作为class_for_each_device回调。
- 返回值:1(匹配)或0。
- *power_supply_find_supply_from_node(struct device_node supply_node) (CONFIG_OF)
- 目的:查找匹配节点的电源。
- 详细说明:调用class_for_each_device,如果找到返回0,否则-EPROBE_DEFER或错误。
- 使用场景:在check_supplies中验证供应。
- 返回值:0(找到)或错误(如-EPROBE_DEFER)。
- *power_supply_check_supplies(struct power_supply psy)
- 目的:检查并填充电源的供应列表。
- 详细说明:如果已有列表,返回;否则从设备树(CONFIG_OF)或父设备属性读取supplied_from,分配内存并填充。验证每个供应是否存在。
- 使用场景:注册前调用。
- 返回值:错误码(0成功)。
- **__power_supply_am_i_supplied(struct device dev, void _data)
- 目的:检查电源是否被供应并在线。
- 详细说明:如果epsy供应data->psy,递增计数,并获取在线状态返回。
- 使用场景:作为class_for_each_device回调。
- 返回值:在线状态或0。
- *power_supply_am_i_supplied(struct power_supply psy)
- 目的:检查是否有在线供应商。
- 详细说明:遍历类设备,累加在线供应商。如果无供应商,返回-ENODEV;否则返回在线状态或错误。
- 使用场景:查询电源是否被供应,如检查充电器是否连接。
- 返回值:在线状态(1/0)或错误。
- **__power_supply_is_system_supplied(struct device dev, void data)
- 目的:检查系统电源是否在线。
- 详细说明:非电池类型,递增计数,获取在线状态返回。
- 使用场景:作为class_for_each_device回调。
- 返回值:在线状态或0。
- power_supply_is_system_supplied(void)
- 目的:检查系统是否有在线电源。
- 详细说明:遍历类设备,如果无设备假设市电(返回1),否则返回在线状态。
- 使用场景:系统级电源检查,如桌面系统。
- 返回值:1(有电源)或0/错误。
- **__power_supply_get_supplier_max_current(struct device dev, void data)
- 目的:获取供应商最大电流。
- 详细说明:如果epsy供应psy,获取CURRENT_MAX返回。
- 使用场景:作为class_for_each_device回调。
- 返回值:电流值或0。
- *power_supply_set_input_current_limit_from_supplier(struct power_supply psy)
- 目的:从第一个非零供应商设置输入电流限值。
- 详细说明:遍历类设备获取最大电流,设置INPUT_CURRENT_LIMIT。不支持多供应商。
- 使用场景:调整充电电流基于供应商。
- 返回值:错误码(0成功)。
- *power_supply_set_battery_charged(struct power_supply psy)
- 目的:设置电池为充满。
- 详细说明:检查使用计数、类型为电池、有set_charged回调,则调用它。
- 使用场景:充电完成时调用。
- 返回值:0或-EINVAL。
- **power_supply_match_device_by_name(struct device dev, const void data)
- 目的:匹配电源名称。
- 详细说明:比较psy名称与name。
- 使用场景:作为class_find_device回调。
- 返回值:0(匹配)。
- *power_supply_get_by_name(const char name)
- 目的:通过名称获取电源并递增引用。
- 详细说明:在类中查找设备,递增use_cnt。
- 使用场景:其他模块获取特定电源。
- 返回值:电源指针或NULL。
- *power_supply_put(struct power_supply psy)
- 目的:释放电源引用。
- 详细说明:递减use_cnt,put_device。
- 使用场景:与get_by_name配对。
- 返回值:无。
- **power_supply_match_device_node(struct device dev, const void data) (CONFIG_OF)
- 目的:匹配父设备的of_node。
- 详细说明:比较dev->parent->of_node与data。
- 使用场景:作为class_find_device回调。
- 返回值:非0(匹配)。
- **power_supply_get_by_phandle(struct device_node np, const char property) (CONFIG_OF)
- 目的:通过phandle获取电源引用。
- 详细说明:解析phandle,在类中查找匹配节点,递增use_cnt。
- 使用场景:设备树中引用电源。
- 返回值:电源指针或ERR_PTR。
- **power_supply_match_device_node_array(struct device dev, void data) (CONFIG_OF)
- 目的:匹配多个节点并填充数组。
- 详细说明:如果匹配父of_node,添加psy到数组,递增use_cnt。检查溢出。
- 使用场景:作为class_for_each_device回调。
- 返回值:0或-EOVERFLOW。
- **power_supply_get_by_phandle_array(struct device_node *np, const char *property, struct power_supply psy, ssize_t size) (CONFIG_OF)
- 目的:通过phandle数组获取多个电源。
- 详细说明:解析第一个phandle作为父,遍历类填充psy数组。
- 使用场景:多电源引用。
- 返回值:填充的数量或错误。
- **devm_power_supply_put(struct device dev, void res) (CONFIG_OF)
- 目的:设备管理释放电源。
- 详细说明:调用power_supply_put。
- 使用场景:devres释放回调。
- 返回值:无。
- **devm_power_supply_get_by_phandle(struct device dev, const char property) (CONFIG_OF)
- 目的:设备管理的phandle获取。
- 详细说明:分配devres,调用get_by_phandle,添加devres。
- 使用场景:驱动中自动管理电源引用。
- 返回值:电源指针或ERR_PTR。
- **power_supply_get_battery_info(struct power_supply psy, struct power_supply_battery_info info)
- 目的:从设备树解析电池信息。
- 详细说明:解析"monitored-battery"节点,读取兼容、化学类型、容量、电压等。支持OCV表格和电阻表格分配。仅支持"simple-battery"。
- 使用场景:电池驱动初始化。
- 返回值:错误码(0成功)。
- **power_supply_put_battery_info(struct power_supply psy, struct power_supply_battery_info info)
- 目的:释放电池信息内存。
- 详细说明:devm_kfree OCV表格和电阻表格。
- 使用场景:清理电池信息。
- 返回值:无。
- *power_supply_temp2resist_simple(struct power_supply_resistance_temp_table table, int table_len, int temp)
- 目的:根据温度线性插值电阻百分比。
- 详细说明:假设表格降序,查找temp区间,计算插值。边界处理。
- 使用场景:计算电池电阻。
- 返回值:电阻百分比。
- *power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table table, int table_len, int ocv)
- 目的:根据OCV线性插值容量。
- 详细说明:类似上,假设表格降序,插值容量。
- 使用场景:估算电池剩余容量。
- 返回值:容量值。
- **power_supply_find_ocv2cap_table(struct power_supply_battery_info info, int temp, int table_len)
- 目的:查找最匹配温度的OCV表格。
- 详细说明:遍历OCV温度,找最小温差,返回表格和大小。
- 使用场景:温度补偿容量计算。
- 返回值:表格指针或NULL。
- *power_supply_batinfo_ocv2cap(struct power_supply_battery_info info, int ocv, int temp)
- 目的:使用电池信息计算OCV到容量。
- 详细说明:调用find_ocv2cap_table,然后ocv2cap_simple。
- 使用场景:电池容量估算。
- 返回值:容量或-EINVAL。
- **power_supply_get_property(struct power_supply psy, enum power_supply_property psp, union power_supply_propval val)
- 目的:获取电源属性。
- 详细说明:检查use_cnt和initialized,调用desc->get_property。
- 使用场景:用户空间或内核查询属性。
- 返回值:错误码(0成功)。
- **power_supply_set_property(struct power_supply psy, enum power_supply_property psp, const union power_supply_propval val)
- 目的:设置电源属性。
- 详细说明:检查use_cnt和set_property存在,调用它。
- 使用场景:控制电源,如设置电流限值。
- 返回值:错误码(0成功)。
- *power_supply_property_is_writeable(struct power_supply psy, enum power_supply_property psp)
- 目的:检查属性是否可写。
- 详细说明:检查use_cnt和property_is_writeable,调用它。
- 使用场景:sysfs写权限检查。
- 返回值:可写状态或错误。
- *power_supply_external_power_changed(struct power_supply psy)
- 目的:通知外部电源变化。
- 详细说明:检查use_cnt和external_power_changed,调用它。
- 使用场景:外部事件如AC插入。
- 返回值:无。
- **power_supply_powers(struct power_supply psy, struct device dev)
- 目的:创建sysfs"powers"链接。
- 详细说明:链接到dev的kobj。
- 使用场景:显示电源关系。
- 返回值:错误码(0成功)。
- *power_supply_dev_release(struct device dev)
- 目的:释放电源设备。
- 详细说明:kfree psy。
- 使用场景:device_unregister回调。
- 返回值:无。
- *power_supply_reg_notifier(struct notifier_block nb)
- 目的:注册通知器。
- 详细说明:atomic_notifier_chain_register。
- 使用场景:监听电源事件。
- 返回值:错误码。
- *power_supply_unreg_notifier(struct notifier_block nb)
- 目的:注销通知器。
- 详细说明:atomic_notifier_chain_unregister。
- 使用场景:清理通知器。
- 返回值:无。
- **power_supply_read_temp(struct thermal_zone_device tzd, int temp) (CONFIG_THERMAL)
- 目的:读取温度。
- 详细说明:获取TEMP属性,转换为毫摄氏度。
- 使用场景:热区get_temp回调。
- 返回值:错误码。
- *psy_register_thermal(struct power_supply psy) (CONFIG_THERMAL)
- 目的:注册热区如果有TEMP属性。
- 详细说明:遍历属性,找到TEMP则注册thermal_zone_device并启用。
- 使用场景:注册时调用。
- 返回值:错误码。
- *psy_unregister_thermal(struct power_supply psy) (CONFIG_THERMAL)
- 目的:注销热区。
- 详细说明:如果tzd存在,注销。
- 使用场景:注销时调用。
- 返回值:无。
- **ps_get_max_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
- 目的:获取最大充电控制限值。
- 详细说明:获取CHARGE_CONTROL_LIMIT_MAX。
- 使用场景:冷却设备回调。
- 返回值:错误码。
- **ps_get_cur_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
- 目的:获取当前充电控制限值。
- 详细说明:获取CHARGE_CONTROL_LIMIT。
- 使用场景:冷却设备回调。
- 返回值:错误码。
- *ps_set_cur_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
- 目的:设置当前充电控制限值。
- 详细说明:设置CHARGE_CONTROL_LIMIT。
- 使用场景:冷却设备回调。
- 返回值:错误码。
- *psy_register_cooler(struct power_supply psy) (CONFIG_THERMAL)
- 目的:注册冷却设备如果有CHARGE_CONTROL_LIMIT。
- 详细说明:遍历属性,找到则注册thermal_cooling_device(of或常规)。
- 使用场景:延迟注册中调用。
- 返回值:错误码。
- *psy_unregister_cooler(struct power_supply psy) (CONFIG_THERMAL)
- 目的:注销冷却设备。
- 详细说明:如果tcd存在,注销。
- 使用场景:注销时调用。
- 返回值:无。
- **__power_supply_register(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg, bool ws)
- 目的:内部注册电源。
- 详细说明:分配psy,初始化设备,设置名称、工作队列。检查供应,添加设备,初始化唤醒,注册热/触发/hwmon。递增use_cnt,调度延迟工作。
- 使用场景:注册变体的内部实现。
- 返回值:电源指针或ERR_PTR。
- **power_supply_register(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg)
- 目的:注册支持唤醒的电源。
- 详细说明:调用__power_supply_register with ws=true。
- 使用场景:标准注册。
- 返回值:电源指针或ERR_PTR。
- **power_supply_register_no_ws(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg)
- 目的:注册不支持唤醒的电源。
- 详细说明:调用__power_supply_register with ws=false。
- 使用场景:非唤醒源电源。
- 返回值:电源指针或ERR_PTR。
- **devm_power_supply_release(struct device dev, void res)
- 目的:设备管理注销电源。
- 详细说明:调用power_supply_unregister。
- 使用场景:devres释放回调。
- 返回值:无。
- **devm_power_supply_register(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg)
- 目的:设备管理注册支持唤醒的电源。
- 详细说明:分配devres,调用register,添加devres。
- 使用场景:自动管理注册。
- 返回值:电源指针或ERR_PTR。
- **devm_power_supply_register_no_ws(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg)
- 目的:设备管理注册不支持唤醒的电源。
- 详细说明:类似上,但no_ws。
- 使用场景:自动管理。
- 返回值:电源指针或ERR_PTR。
- *power_supply_unregister(struct power_supply psy)
- 目的:注销电源。
- 详细说明:递减use_cnt,设置removing,取消工作,移除链接/热/触发/hwmon,注销设备。
- 使用场景:驱动移除时。
- 返回值:无。
- *power_supply_get_drvdata(struct power_supply psy)
- 目的:获取驱动数据。
- 详细说明:返回psy->drv_data。
- 使用场景:访问私有数据。
- 返回值:void*。
- power_supply_class_init(void)
- 目的:初始化电源类。
- 详细说明:创建类,设置uevent和attrs。
- 使用场景:模块初始化。
- 返回值:错误码。
- power_supply_class_exit(void)
- 目的:退出电源类。
- 详细说明:销毁类。
- 使用场景:模块退出。
- 返回值:无。
1️⃣ 核心职责
注册/注销电源设备
提供
power_supply_register()
和power_supply_unregister()
。这些接口允许驱动将自己(比如电池驱动、充电器驱动)注册到内核电源子系统。
注册时会创建 sysfs 节点,让用户空间可以通过
/sys/class/power_supply
访问电源信息。
提供统一的查询接口
每个
power_supply
设备都有一个属性集合(struct power_supply_property
)。内核和用户空间可以通过
power_supply_get_property()
获取电池电量、电压、电流、状态等信息。驱动通过实现
get_property()
/set_property()
回调函数来提供实际数据。
通知机制
当电源状态发生变化(电池电量变化、充电器插入/拔出等),通过
power_supply_changed()
通知内核和用户空间。内核内部使用
kobject_uevent()
触发 uevent,让用户空间工具(比如upower
、acpi
)知道状态变化。
sysfs 接口管理
power_supply_core.c
会自动创建对应的 sysfs 节点。每个属性在 sysfs 下会显示为文件,用户空间可以读取(有些可以写)。
支持多个电源类型
POWER_SUPPLY_TYPE_BATTERY
(电池)POWER_SUPPLY_TYPE_USB
(USB)POWER_SUPPLY_TYPE_MAINS
(交流电源)还有无线充电、充电器等类型。
统一用
enum power_supply_property
进行描述。
事件和属性抽象
内核内部不直接依赖具体硬件,而是通过属性和事件接口统一访问电源信息。
驱动只需要关注自身硬件的实现,不需要处理 sysfs、通知等重复逻辑。
2️⃣ 主要结构体
struct power_supply {const char *name;enum power_supply_type type;struct power_supply_desc *desc;struct device dev;struct mutex lock;/* 回调函数 */int (*get_property)(struct power_supply *psy,enum power_supply_property psp,union power_supply_propval *val);int (*set_property)(struct power_supply *psy,enum power_supply_property psp,const union power_supply_propval *val);/* 其它内部成员 */
};
desc: 描述电源设备有哪些属性、类型等。
get_property/set_property: 驱动实现回调。
lock: 内核内部访问保护。
3️⃣ 核心函数
函数 | 功能 |
---|---|
power_supply_register() | 注册一个新的电源设备,并创建 sysfs 节点 |
power_supply_unregister() | 注销电源设备 |
power_supply_get_property() | 获取指定属性值 |
power_supply_set_property() | 设置指定属性值(如果驱动支持) |
power_supply_changed() | 通知内核和用户空间电源状态变化 |
power_supply_init() | 初始化子系统(早期启动阶段调用) |
4️⃣ 总结
power_supply_core.c
的核心作用可以概括为:
提供 统一的电源管理框架;
管理 电源设备注册、属性访问、事件通知;
封装 sysfs 接口和 uevent 通知,屏蔽硬件细节;
驱动开发者只需要实现
get/set_property
,不关心底层通知和接口细节。
简单来说,它是 电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。