当前位置: 首页 > news >正文

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退出电源类。
每个函数的详细说明
  1. **__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表示供应关系)。
  2. **__power_supply_changed_work(struct device dev, void data)
    • 目的:处理电源变化时,通知依赖的电源。
    • 详细说明:data是变化的电源psy。检查psy是否供应pst(从dev获取),如果是的,且pst有external_power_changed回调,则调用它。
    • 使用场景:作为class_for_each_device的回调,在电源变化工作中遍历类设备。
    • 返回值:0(总是)。
  3. *power_supply_changed_work(struct work_struct work)
    • 目的:处理电源变化的工作队列函数。
    • 详细说明:从work获取psy,使用自旋锁检查并清除changed标志。遍历类设备通知依赖电源,更新LED,调用通知链,发送uevent。处理竞争条件,确保所有事件处理后释放唤醒源。
    • 使用场景:由power_supply_changed调度。
    • 返回值:无。
  4. *power_supply_changed(struct power_supply psy)
    • 目的:标记电源变化并调度工作。
    • 详细说明:设置changed标志,保持唤醒,调度changed_work。
    • 使用场景:驱动检测到变化时调用,如电池电量变化。
    • 返回值:无。
  5. *power_supply_deferred_register_work(struct work_struct work)
    • 目的:延迟处理注册后的变化事件和冷却注册。
    • 详细说明:等待父设备互斥锁,调用power_supply_changed和psy_register_cooler。避免探针中过早调用get_property。
    • 使用场景:注册后延迟调度。
    • 返回值:无。
  6. **__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(总是)。
  7. *power_supply_populate_supplied_from(struct power_supply psy) (CONFIG_OF)
    • 目的:填充电源的supplied_from列表。
    • 详细说明:调用class_for_each_device遍历所有电源,使用上述辅助函数填充。
    • 使用场景:在check_supplies中调用。
    • 返回值:错误码(0成功)。
  8. **__power_supply_find_supply_from_node(struct device dev, void data) (CONFIG_OF)
    • 目的:检查设备是否匹配节点。
    • 详细说明:比较epsy的of_node与np,返回1表示匹配。
    • 使用场景:作为class_for_each_device回调。
    • 返回值:1(匹配)或0。
  9. *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)。
  10. *power_supply_check_supplies(struct power_supply psy)
    • 目的:检查并填充电源的供应列表。
    • 详细说明:如果已有列表,返回;否则从设备树(CONFIG_OF)或父设备属性读取supplied_from,分配内存并填充。验证每个供应是否存在。
    • 使用场景:注册前调用。
    • 返回值:错误码(0成功)。
  11. **__power_supply_am_i_supplied(struct device dev, void _data)
    • 目的:检查电源是否被供应并在线。
    • 详细说明:如果epsy供应data->psy,递增计数,并获取在线状态返回。
    • 使用场景:作为class_for_each_device回调。
    • 返回值:在线状态或0。
  12. *power_supply_am_i_supplied(struct power_supply psy)
    • 目的:检查是否有在线供应商。
    • 详细说明:遍历类设备,累加在线供应商。如果无供应商,返回-ENODEV;否则返回在线状态或错误。
    • 使用场景:查询电源是否被供应,如检查充电器是否连接。
    • 返回值:在线状态(1/0)或错误。
  13. **__power_supply_is_system_supplied(struct device dev, void data)
    • 目的:检查系统电源是否在线。
    • 详细说明:非电池类型,递增计数,获取在线状态返回。
    • 使用场景:作为class_for_each_device回调。
    • 返回值:在线状态或0。
  14. power_supply_is_system_supplied(void)
    • 目的:检查系统是否有在线电源。
    • 详细说明:遍历类设备,如果无设备假设市电(返回1),否则返回在线状态。
    • 使用场景:系统级电源检查,如桌面系统。
    • 返回值:1(有电源)或0/错误。
  15. **__power_supply_get_supplier_max_current(struct device dev, void data)
    • 目的:获取供应商最大电流。
    • 详细说明:如果epsy供应psy,获取CURRENT_MAX返回。
    • 使用场景:作为class_for_each_device回调。
    • 返回值:电流值或0。
  16. *power_supply_set_input_current_limit_from_supplier(struct power_supply psy)
    • 目的:从第一个非零供应商设置输入电流限值。
    • 详细说明:遍历类设备获取最大电流,设置INPUT_CURRENT_LIMIT。不支持多供应商。
    • 使用场景:调整充电电流基于供应商。
    • 返回值:错误码(0成功)。
  17. *power_supply_set_battery_charged(struct power_supply psy)
    • 目的:设置电池为充满。
    • 详细说明:检查使用计数、类型为电池、有set_charged回调,则调用它。
    • 使用场景:充电完成时调用。
    • 返回值:0或-EINVAL。
  18. **power_supply_match_device_by_name(struct device dev, const void data)
    • 目的:匹配电源名称。
    • 详细说明:比较psy名称与name。
    • 使用场景:作为class_find_device回调。
    • 返回值:0(匹配)。
  19. *power_supply_get_by_name(const char name)
    • 目的:通过名称获取电源并递增引用。
    • 详细说明:在类中查找设备,递增use_cnt。
    • 使用场景:其他模块获取特定电源。
    • 返回值:电源指针或NULL。
  20. *power_supply_put(struct power_supply psy)
    • 目的:释放电源引用。
    • 详细说明:递减use_cnt,put_device。
    • 使用场景:与get_by_name配对。
    • 返回值:无。
  21. **power_supply_match_device_node(struct device dev, const void data) (CONFIG_OF)
    • 目的:匹配父设备的of_node。
    • 详细说明:比较dev->parent->of_node与data。
    • 使用场景:作为class_find_device回调。
    • 返回值:非0(匹配)。
  22. **power_supply_get_by_phandle(struct device_node np, const char property) (CONFIG_OF)
    • 目的:通过phandle获取电源引用。
    • 详细说明:解析phandle,在类中查找匹配节点,递增use_cnt。
    • 使用场景:设备树中引用电源。
    • 返回值:电源指针或ERR_PTR。
  23. **power_supply_match_device_node_array(struct device dev, void data) (CONFIG_OF)
    • 目的:匹配多个节点并填充数组。
    • 详细说明:如果匹配父of_node,添加psy到数组,递增use_cnt。检查溢出。
    • 使用场景:作为class_for_each_device回调。
    • 返回值:0或-EOVERFLOW。
  24. **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数组。
    • 使用场景:多电源引用。
    • 返回值:填充的数量或错误。
  25. **devm_power_supply_put(struct device dev, void res) (CONFIG_OF)
    • 目的:设备管理释放电源。
    • 详细说明:调用power_supply_put。
    • 使用场景:devres释放回调。
    • 返回值:无。
  26. **devm_power_supply_get_by_phandle(struct device dev, const char property) (CONFIG_OF)
    • 目的:设备管理的phandle获取。
    • 详细说明:分配devres,调用get_by_phandle,添加devres。
    • 使用场景:驱动中自动管理电源引用。
    • 返回值:电源指针或ERR_PTR。
  27. **power_supply_get_battery_info(struct power_supply psy, struct power_supply_battery_info info)
    • 目的:从设备树解析电池信息。
    • 详细说明:解析"monitored-battery"节点,读取兼容、化学类型、容量、电压等。支持OCV表格和电阻表格分配。仅支持"simple-battery"。
    • 使用场景:电池驱动初始化。
    • 返回值:错误码(0成功)。
  28. **power_supply_put_battery_info(struct power_supply psy, struct power_supply_battery_info info)
    • 目的:释放电池信息内存。
    • 详细说明:devm_kfree OCV表格和电阻表格。
    • 使用场景:清理电池信息。
    • 返回值:无。
  29. *power_supply_temp2resist_simple(struct power_supply_resistance_temp_table table, int table_len, int temp)
    • 目的:根据温度线性插值电阻百分比。
    • 详细说明:假设表格降序,查找temp区间,计算插值。边界处理。
    • 使用场景:计算电池电阻。
    • 返回值:电阻百分比。
  30. *power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table table, int table_len, int ocv)
    • 目的:根据OCV线性插值容量。
    • 详细说明:类似上,假设表格降序,插值容量。
    • 使用场景:估算电池剩余容量。
    • 返回值:容量值。
  31. **power_supply_find_ocv2cap_table(struct power_supply_battery_info info, int temp, int table_len)
    • 目的:查找最匹配温度的OCV表格。
    • 详细说明:遍历OCV温度,找最小温差,返回表格和大小。
    • 使用场景:温度补偿容量计算。
    • 返回值:表格指针或NULL。
  32. *power_supply_batinfo_ocv2cap(struct power_supply_battery_info info, int ocv, int temp)
    • 目的:使用电池信息计算OCV到容量。
    • 详细说明:调用find_ocv2cap_table,然后ocv2cap_simple。
    • 使用场景:电池容量估算。
    • 返回值:容量或-EINVAL。
  33. **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成功)。
  34. **power_supply_set_property(struct power_supply psy, enum power_supply_property psp, const union power_supply_propval val)
    • 目的:设置电源属性。
    • 详细说明:检查use_cnt和set_property存在,调用它。
    • 使用场景:控制电源,如设置电流限值。
    • 返回值:错误码(0成功)。
  35. *power_supply_property_is_writeable(struct power_supply psy, enum power_supply_property psp)
    • 目的:检查属性是否可写。
    • 详细说明:检查use_cnt和property_is_writeable,调用它。
    • 使用场景:sysfs写权限检查。
    • 返回值:可写状态或错误。
  36. *power_supply_external_power_changed(struct power_supply psy)
    • 目的:通知外部电源变化。
    • 详细说明:检查use_cnt和external_power_changed,调用它。
    • 使用场景:外部事件如AC插入。
    • 返回值:无。
  37. **power_supply_powers(struct power_supply psy, struct device dev)
    • 目的:创建sysfs"powers"链接。
    • 详细说明:链接到dev的kobj。
    • 使用场景:显示电源关系。
    • 返回值:错误码(0成功)。
  38. *power_supply_dev_release(struct device dev)
    • 目的:释放电源设备。
    • 详细说明:kfree psy。
    • 使用场景:device_unregister回调。
    • 返回值:无。
  39. *power_supply_reg_notifier(struct notifier_block nb)
    • 目的:注册通知器。
    • 详细说明:atomic_notifier_chain_register。
    • 使用场景:监听电源事件。
    • 返回值:错误码。
  40. *power_supply_unreg_notifier(struct notifier_block nb)
    • 目的:注销通知器。
    • 详细说明:atomic_notifier_chain_unregister。
    • 使用场景:清理通知器。
    • 返回值:无。
  41. **power_supply_read_temp(struct thermal_zone_device tzd, int temp) (CONFIG_THERMAL)
    • 目的:读取温度。
    • 详细说明:获取TEMP属性,转换为毫摄氏度。
    • 使用场景:热区get_temp回调。
    • 返回值:错误码。
  42. *psy_register_thermal(struct power_supply psy) (CONFIG_THERMAL)
    • 目的:注册热区如果有TEMP属性。
    • 详细说明:遍历属性,找到TEMP则注册thermal_zone_device并启用。
    • 使用场景:注册时调用。
    • 返回值:错误码。
  43. *psy_unregister_thermal(struct power_supply psy) (CONFIG_THERMAL)
    • 目的:注销热区。
    • 详细说明:如果tzd存在,注销。
    • 使用场景:注销时调用。
    • 返回值:无。
  44. **ps_get_max_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
    • 目的:获取最大充电控制限值。
    • 详细说明:获取CHARGE_CONTROL_LIMIT_MAX。
    • 使用场景:冷却设备回调。
    • 返回值:错误码。
  45. **ps_get_cur_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
    • 目的:获取当前充电控制限值。
    • 详细说明:获取CHARGE_CONTROL_LIMIT。
    • 使用场景:冷却设备回调。
    • 返回值:错误码。
  46. *ps_set_cur_charge_cntl_limit(struct thermal_cooling_device tcd, unsigned long state) (CONFIG_THERMAL)
    • 目的:设置当前充电控制限值。
    • 详细说明:设置CHARGE_CONTROL_LIMIT。
    • 使用场景:冷却设备回调。
    • 返回值:错误码。
  47. *psy_register_cooler(struct power_supply psy) (CONFIG_THERMAL)
    • 目的:注册冷却设备如果有CHARGE_CONTROL_LIMIT。
    • 详细说明:遍历属性,找到则注册thermal_cooling_device(of或常规)。
    • 使用场景:延迟注册中调用。
    • 返回值:错误码。
  48. *psy_unregister_cooler(struct power_supply psy) (CONFIG_THERMAL)
    • 目的:注销冷却设备。
    • 详细说明:如果tcd存在,注销。
    • 使用场景:注销时调用。
    • 返回值:无。
  49. **__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。
  50. **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。
  51. **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。
  52. **devm_power_supply_release(struct device dev, void res)
    • 目的:设备管理注销电源。
    • 详细说明:调用power_supply_unregister。
    • 使用场景:devres释放回调。
    • 返回值:无。
  53. **devm_power_supply_register(struct device *parent, const struct power_supply_desc desc, const struct power_supply_config cfg)
    • 目的:设备管理注册支持唤醒的电源。
    • 详细说明:分配devres,调用register,添加devres。
    • 使用场景:自动管理注册。
    • 返回值:电源指针或ERR_PTR。
  54. **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。
  55. *power_supply_unregister(struct power_supply psy)
    • 目的:注销电源。
    • 详细说明:递减use_cnt,设置removing,取消工作,移除链接/热/触发/hwmon,注销设备。
    • 使用场景:驱动移除时。
    • 返回值:无。
  56. *power_supply_get_drvdata(struct power_supply psy)
    • 目的:获取驱动数据。
    • 详细说明:返回psy->drv_data。
    • 使用场景:访问私有数据。
    • 返回值:void*。
  57. power_supply_class_init(void)
    • 目的:初始化电源类。
    • 详细说明:创建类,设置uevent和attrs。
    • 使用场景:模块初始化。
    • 返回值:错误码。
  58. power_supply_class_exit(void)
    • 目的:退出电源类。
    • 详细说明:销毁类。
    • 使用场景:模块退出。
    • 返回值:无。

1️⃣ 核心职责

  1. 注册/注销电源设备

    • 提供 power_supply_register()power_supply_unregister()

    • 这些接口允许驱动将自己(比如电池驱动、充电器驱动)注册到内核电源子系统。

    • 注册时会创建 sysfs 节点,让用户空间可以通过 /sys/class/power_supply 访问电源信息。

  2. 提供统一的查询接口

    • 每个 power_supply 设备都有一个属性集合(struct power_supply_property)。

    • 内核和用户空间可以通过 power_supply_get_property() 获取电池电量、电压、电流、状态等信息。

    • 驱动通过实现 get_property()/set_property() 回调函数来提供实际数据。

  3. 通知机制

    • 当电源状态发生变化(电池电量变化、充电器插入/拔出等),通过 power_supply_changed() 通知内核和用户空间。

    • 内核内部使用 kobject_uevent() 触发 uevent,让用户空间工具(比如 upoweracpi)知道状态变化。

  4. sysfs 接口管理

    • power_supply_core.c 会自动创建对应的 sysfs 节点。

    • 每个属性在 sysfs 下会显示为文件,用户空间可以读取(有些可以写)。

  5. 支持多个电源类型

    • POWER_SUPPLY_TYPE_BATTERY(电池)

    • POWER_SUPPLY_TYPE_USB(USB)

    • POWER_SUPPLY_TYPE_MAINS(交流电源)

    • 还有无线充电、充电器等类型。

    • 统一用 enum power_supply_property 进行描述。

  6. 事件和属性抽象

    • 内核内部不直接依赖具体硬件,而是通过属性和事件接口统一访问电源信息。

    • 驱动只需要关注自身硬件的实现,不需要处理 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,不关心底层通知和接口细节。

简单来说,它是 电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。


文章转载自:

http://B3WF50tD.zypnt.cn
http://KkvuX09Y.zypnt.cn
http://ZoAbVV33.zypnt.cn
http://rfHBMOaL.zypnt.cn
http://C6PC9RIz.zypnt.cn
http://ggh6VoqK.zypnt.cn
http://hefs5GSZ.zypnt.cn
http://Pjuf7nkX.zypnt.cn
http://BEq56Ata.zypnt.cn
http://DFGg2Um3.zypnt.cn
http://jQTef0gO.zypnt.cn
http://exGooMLq.zypnt.cn
http://c6cCCFgM.zypnt.cn
http://DfVeBA7X.zypnt.cn
http://LLXHFB3Y.zypnt.cn
http://7puDhoEc.zypnt.cn
http://MuX1ZrQC.zypnt.cn
http://8VuJ7lZg.zypnt.cn
http://iOjvPwQP.zypnt.cn
http://NfbrDN4l.zypnt.cn
http://ltiplFMM.zypnt.cn
http://WUvhCnaU.zypnt.cn
http://tR8sY2LH.zypnt.cn
http://vjHOfbH8.zypnt.cn
http://xlf20Wve.zypnt.cn
http://h5ndpcnR.zypnt.cn
http://FUu1JioZ.zypnt.cn
http://WrGtJpnV.zypnt.cn
http://KqrqHAe8.zypnt.cn
http://D9yzbtXZ.zypnt.cn
http://www.dtcms.com/a/385138.html

相关文章:

  • 如何做好AI智能体
  • 邻接矩阵幂 A^m 的几何意义
  • PL3381T/PL3383T/PL3384T 12V非隔离降压型芯片(200/300/400mA)
  • 食品科技企业NotCo完成SAP系统升级 构建统一数字化平台
  • LinuxC++项目开发日志——高并发内存池(6-内存回收机制)
  • 数值计算2
  • 硬件 - oring多电源切换
  • RocketMQ-高性能消息中间件的原理
  • DevOps历程--GitLab安装与使用教程(Docker安装和编译安装两种方式)
  • 大屏可视化动图渲染
  • Claude Code生态、实战
  • 系统架构设计师备考第24天——需求工程
  • 逻辑回归模型:基于鸢尾花数据集的多分类任务全流程
  • 实战适配器模式
  • OpenLayers数据源集成 -- 章节十三:EsriJSON图层详解
  • RabbitMQ—运维篇
  • 一站式YOLO目标检测解决方案:训练、测试、推理与数据集转换全流程指南
  • lamp脚本部署
  • 前端构建工具有哪些?常用前端构建工具对比、前端构建工具推荐与最佳实践分析
  • Charles日志分析与流量监控技巧 高效排查接口与性能问题
  • ACM模式的输入部分——input().strip() 与 sys.stdin.readline() 的不同
  • ““.equals(studentID)
  • 【Lesson 3】CUDA 编程模型:线程、块、网格 —— Ubuntu 22.04 + RTX 30/40 系列实战
  • [Windows]C盘瘦身 --- 软件搬家
  • CLIP 完全上手指南:从安装、下载加速、文本/图像编码到图文匹配,一篇全搞定!
  • BKY莱德因:5大黑科技逆转时光
  • 开源嵌入模型推荐与选型指南
  • 科普:Python中为什么“from .utils” 不能写成 “from ./utils”?
  • 客户粘性提升策略是什么?系统化策略提升客户粘性指南
  • Spring 框架从入门到精通(第一篇)—— 框架核心与 IOC 容器实践