一、前言:

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更详细点

power supply frameware 框架相关推荐

  1. Power Supply驱动框架

    Power Supply驱动框架和具体驱动 Power Supply驱动程序用于让用户空间可以读取系统中的供电设备信息.供电设备可以是直流电源(AC).USB或者电池等. 17.5.1  Power ...

  2. Linux 4.19.111 供电(power supply )子系统

    Linux 内核中为了方便对 battery 的管理,专门提供了power supply framework.battery 管理分开为两个部分,一个是电池监控(fuelgauge),另一个是充放电管 ...

  3. power supply框架

    概述 对于便携式设备,如手机或者pad来说,battery都是必不可少的一个组成部分.kernel中为了方便对battery的管理,专门提供了power supply framework.batter ...

  4. Power Supply---驱动框架

    1. 前言 power supply class为编写供电设备(power supply,后面简称PSY)的驱动提供了统一的框架,功能包括: 1)抽象PSY设备的共性,向用户空间提供统一的API. 2 ...

  5. Linux Power supply子系统分析

    1.概述 对于便携式设备,如手机或者pad来说,battery都是必不可少的一个组成部分.kernel中为了方便对battery的管理,专门提供了power supply framework. bat ...

  6. power supply是如何上报电池信息的

    一.引文 作为一个内核初学者,经常容易进入"知其然但不知其所以然"的状态,在power supply子系统中就是这样,知道如何去添加一个属性prop,知道psy可以创建一堆文件节点 ...

  7. Linux power supply framwork drvs

    转自 :http://www.wowotech.net/pm_subsystem/psy_class_overview.html 0.涉及文件 framwork drivers\power\power ...

  8. Linux Power supply子系统分析之一

    转自:http://www.wowotech.net/pm_subsystem/psy_class_overview.html 1.概述 对于便携式设备,如手机或者pad来说,battery都是必不可 ...

  9. Linux 中power supply软件架构和相关API

    一. 概述 电源管理整体上可以分为两个部分,一个是电池监控(fuel gauge),另外一个是充放电管理.这两部分在内核中也是分为两个驱动来管理.fuelgauge驱动的功能主要是负责向上层Andro ...

最新文章

  1. 上海网络推广浅析外链对网站优化的影响有多大?需要注意什么?
  2. Oracle-临时表空间(组)解读
  3. “智慧”校园为何难落地?北京理工大学有什么秘密“利器”?
  4. Android动画及滑动事件冲突解决(转载)
  5. 软件设计的火花——Brooks新作及《人月神话》三十五周年讨论会纪要
  6. 信息学奥赛一本通(1092:求出e的值)
  7. 【Kafka】Exiting due to: org/apache/kafka/common/protocol/SecurityProtocol
  8. c语言中状态机的作用,C语言中的状态机
  9. 【FPGA频率计】基于FPGA的高精度数字频率计的详细设计
  10. 网站安全工程师与渗透测试工程师有哪些区别
  11. cad插入块_【CAD教程】创建块和块应用步骤
  12. RGB与CMYK以及加色与减色
  13. 多粒度网络(MGN)的结构设计与技术实现
  14. python小孩的报酬_孩子怎么区分报酬与奖励
  15. 重新起航,研究生生涯开始了。
  16. 固定定位(fixed)和粘性定位(sticky)的比较
  17. python 描边,吊打Pyecharts,这个新Python绘图库也可以这么漂亮!
  18. 在线教育平台搭建的几种方案
  19. 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...
  20. Redirect组件的使用

热门文章

  1. iOS制作framework
  2. Redis典型应用场景实战之抢红包系统
  3. java日志管理(slf4j+logback,tomcat)
  4. android 字符串转小数点,Android实现计算器(计算表达式/计算小数点以及括号)...
  5. Java代码判断是否是回文数
  6. 我的世界网易版服务器文件,我的世界网易版服务器怎么加材质包-我的世界网易版服务器如何加材质包...
  7. MATLAB+GUI:手动修改曲线中的点
  8. 前端开发问题——css设置背景样式效果无法显现
  9. NVidia Maxwell GPU Tile-based 光栅化模式分析
  10. 世界读书日:作为一个优秀的程序员请收藏这份书单