power supply frameware 框架

一、前言:

power supply framework给power supply(供电设备psy)提供统一框架,来管理battery,psy设备目的就是给系统充电,将一些必要信息给到上层用户,如充电源、电量变化、充放电状态、电池信息等可以分为两部分:
1、电池监控(fuelgauge)fg
2、充放电管理(charger)

fuelgauge驱动:负责向上层android提供当前电池的容量和健康状态等电池信息,也给charger驱动提供电池的信息

charger驱动:负责usb插拔检测、类型识别,充放电管理等

按照前面说的psy设备的主要行为就是向用户提供各种状态信息,所以psy的核心便是:
将这些状态信息抽象为properties属性,通过power supply class向用户提供统一的API,底层psy驱动也提供统一的方式,实现公共逻辑,使用它的工程师只需要完成相关硬件相关部分,和psy关联起来就行

psy驱动设备:需要负责自己的psy设备需要有哪些属性?这些属性值是什么?当属性发生改变时,通知power supply framework,Power supply class

Power supply class:需要负责将psy设备支持的属性和其值通过sysfs的形式提供给用户空间,当属性值改变时,以uevent的形式广播给用户空间程序

二、power supply framework软件框架:

1、psy软件代码位置:…/drivers/power/supply,power supply子系统功能:
抽象psy设备的共性,给用户提供统一的API
给psy设备驱动提供统一简单的编译方式

2、power supply framework主要组成
<1>、power_supply_core.c:电源监控类,抽象核心数据结构,实现公共逻辑
<2>、power_supply_sysfs.c:电源监控类的sysfs接口,实现sysfs和uevent功能
<3>、power_supply_leds.c:psy设备的状态指示通用实现

三、主要结构体:

主要框架结构体定义在include/linux/power_supply.h
1、struct power_supply_config:代表运行时特定的psy配置
2、struct power_supply_desc:有对power supply的一些说明描述
3、struct power_supply:power supply class的核心数据结构,来抽象psy设备
主要框架一些数据枚举也在这里include/linux/power_supply.h
1、enum power_supply_property :里面有一些重要的属性:
POWER_SUPPLY_PROP_STATUS:充电状态
POWER_SUPPLY_PROP_CHARGE_TYPE:充电类型
POWER_SUPPLY_PROP_HEALTH:健康状态
POWER_SUPPLY_PROP_CAPACITY_LEVEL:容量

2、enum power_supply_type:psy设备类型由这里定义:
POWER_SUPPLY_TYPE_BATTERY:主要电池供电设备
POWER_SUPPLY_TYPE_UPS:不间断式供电设备
POWER_SUPPLY_TYPE_MAINS:主供电设备
POWER_SUPPLY_TYPE_USB_xx:usb类型供电
POWER_SUPPLY_TYPE_APPLE_BRICK_ID :苹果供电

3、enum power_supply_usb_type:usb供电类型,sdp,cdp,usb等

四、主要API:

1、向具体的psy驱动提供的统计核心的API:

extern struct power_supply *__must_check
power_supply_register(struct device *parent,  const struct power_supply_desc *desc,  const struct power_supply_config *cfg);
extern struct power_supply *__must_check
power_supply_register_no_ws(struct device *parent, const struct power_supply_desc *desc, const struct power_supply_config *cfg);
extern struct power_supply *__must_check
devm_power_supply_register(struct device *parent, const struct power_supply_desc *desc, const struct power_supply_config *cfg);
extern struct power_supply *__must_check
devm_power_supply_register_no_ws(struct device *parent, const struct power_supply_desc *desc, const struct power_supply_config *cfg);
extern void power_supply_unregister(struct power_supply *psy);
power_supply_register 和 power_supply_register_no_ws 的区别: power_supply_register 注册的设备,具备 wakeup 系统的能力,而 power_supply_register_no_ws 不具备
power_supply_register 和 devm_power_supply_register 的区别:power_supply_register 需要对返回的 power_supply 指针使用 power_supply_unregister 来释放资源,而 devm_power_supply_register 返回的 power_supply 指针将在驱动程序 detach 时自动注销

2、psy设备状态改变时,API:

void power_supply_changed(struct power_supply *psy);
注册psy设备时,工作任务中有关联任务函数power_supply_changed_work,当psy设备检测到设备属性发生改变时调用这个接口,通知power supply core,然后power supply core会有动作:
<1>、如果该psy是其他psy设备的供电源,调用这些psy的void (*external_power_changed)(struct power_supply *psy);回调函数,通知它们
<2>、如果配置了CONFIG_LEDS_TRIGGERS,调用power_supply_update_leds 更新psy相关的led状态
<3>、调用atomic_notifier_call_chain 依次调用通知程序链power_supply_notifier中的每个函数,发送notifier ,函数在原子上下文运行,不阻塞,通知关心psy设备状态的driver,调用kobject_uevent触发change类型的uevent,通知用户空间

3、psy设备向其他driver提供用户接收psy设备状态改变notifier的API:

struct atomic_notifier_head power_supply_notifier;
int power_supply_reg_notifier(struct notifier_block *nb);
void power_supply_unreg_notifier(struct notifier_block *nb);
reg和unreg原子的添加notifier_block到通知链
reg注册notifier之后,psy设备状态发生改变调用changed接口,power supply core就是通知notifier的监听者

4、向用户空间程序提供的API:
power supply class通过两种形式向用户提供接口:
<1>、uevent
uevent以名字=value的形式,上报所有property的值,一般会在psy设备添加到kernel时,或者psy属性改变时发送
<2>、sysfs
如果psy设备具备某个属性,该属性对应的attribute就会体现在sysfs中,一般在“/sys/class/power_supply/xxx/”中

5、power supply属性API:

int power_supply_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val);
int power_supply_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val);
int power_supply_property_is_writeable(struct power_supply *psy, enum power_supply_property psp);
psy设备不会直接使用get_property或者set_property,所以这里使用这些API,简单做下检查,然后 power_supply desc 指向的 power_supply_desc 结构体中的具体实现函数get set去处理

6、其他API:

power_supply_get_by_name,通过名字获取PSY指针。
power_supply_get_by_phandle,从DTS中,解析出对应的PSY指针。
power_supply_am_i_supplied,查询自己是否由其它PSY供电。
power_supply_set_battery_charged,调用指定PSY的set_charged回调。
power_supply_is_system_supplied,查询系统是否有有效的或者处于online状态的PSY,如果没有,可能为桌面系统。
power_supply_powers,在指定设备(通常是该PSY设备)的sysfs目录(/sys/devices/xxx/)下,创建指定PSY的符号链接(/sys/devices/xxx/powers)。
power_supply_get_battery_info 获取电池信息(power_supply_battery_info 代表)。
power_supply_set_input_current_limit_from_supplier 设置来自 power supply 设备的输入电流限制。
power_supply_set_battery_charged 调用指定 power supply 设备的 set_charged 回调。
power_supply_is_system_supplied 查询系统是否有有效的或者处于 online 状态的 power supply 设备,如果没有,可能为桌面系统。
power_supply_external_power_changed 外部供电设备“变化”,调用 external_power_changed 回调函数处理。
power_supply_powers 在指定设备(通常是该 power supply 设备)的 Sysfs 目录(/sys/devices/xxx/)下,创建指定 power supply 设备的符号链接(/sys/devices/xxx/powers)。
power_supply_get_drvdata 获取 power_supply 结构的 driver 私有数据

https://blog.csdn.net/hanguangce/article/details/116270277更详细点

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Switching power supply design pressman是一本关于开关电源设计的经典著作,由Abraham Pressman和Keith Billings共同编写而成。该书介绍了开关电源的基本原理、技术和设计方法,深入剖析了开关电源的开发过程,为学习和应用该领域的工程师提供了较为详尽的指导。 该书的前半部分主要讲述了开关电源的基础知识和设计要点,包括电源拓扑结构、电感和变压器的设计、开关器件的选择和保护措施等。后半部分则着重介绍了高效率、高功率密度、EMI控制等现代开关电源的设计方法,以及多种实际应用案例分析,涵盖了从低压直流/直流转换器到高压交流/直流电源的广泛范围。 总体来说,Switching power supply design pressman是一部非常值得推荐的电源设计经典著作,对于电力电子及相关领域的工程师和研究人员,均有一定的参考价值。 ### 回答2: Switching power supply design在电源设计领域中非常重要,尤其是在需要高效率的应用中。对于Switching power supply设计师来说,Pressman的书籍《Switching Power Supply Design》是一本非常经典的参考书。该书介绍了Switching power supply设计的各个方面,包括基本原理、设计流程、控制电路设计、开关电路设计等。书内还给出了很多实际的Switching power supply电路设计例子和仿真结果。 作为Switching power supply设计的入门读物,Pressman的书籍可以帮助设计师建立起Switching power supply的设计思路和技术基础。对于已经有一定Switching power supply设计经验的设计师来说,Pressman的书籍也可以提供更深入的技术探讨和实践指导。 除了Pressman的书籍外,还有很多关于Switching power supply设计的资料和工具可供参考和使用。比如一些开源的Switching power supply设计软件和仿真工具,可以帮助设计师加速设计过程和优化电路性能。此外,关注Switching power supply技术的新动态和热点问题也是设计师需要关注的方面。 ### 回答3: Switching power supply design Pressman是一本非常经典的电源设计参考书。这本书详尽地介绍了开关电源系统的各种设计方法和技术,包括开关电源变压器的设计、开关电源控制电路设计、稳压电路设计、EMI滤波器设计等方面。 Switching power supply design Pressman不仅讲解了实用的工程技巧,还深入地解析了理论知识,包括磁性器件的特性、PWM控制的原理、输出电压调整的方法等等。此外,书中还介绍了一系列电源设计案例,帮助读者加深对于开关电源设计的理解和应用。 这本书适用于从事开关电源设计的从业人员,同时也是电子技术爱好者学习开关电源知识的好资料。该书的语言通俗易懂,图文并茂,能够帮助初学者快速上手,也能让专业人士深入了解开关电源的各种设计技术和实用技巧。 总之,Switching power supply design Pressman是一本经典的电源设计指南,对于学习和应用开关电源的人群来说,是一本非常实用的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值