一、 概述
电源管理整体上可以分为两个部分,一个是电池监控(fuel gauge),另外一个是充放电管理。这两部分在内核中也是分为两个驱动来管理。fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等。同时也向charger驱动提供电池的相关信息。charger驱动主要是负责电源线的插拔检测、充电器类型识别和充放电的过程管理等实务。
Power supply class 是为编写供电设备(power supply ,简称PSY)的驱动提供的统一框架
主要功能包括如下部分:
1. 抽象PSY设备共性,向用户空间提供统一的API
2. 为底层PSY驱动的编写提供简单统一的方式,同时封装并且实现公共逻辑,驱动工程师只要专注与硬件细节部分。
二:power supply class位于drivers/power/目录中,主要由3部分组成:
power supply core,用于抽象核心数据结构、实现公共逻辑。位于drivers/power/power_supply_core.c中。
power supply sysfs,实现sysfs以及uevent功能。位于drivers/power/power_supply_sysfs.c中。
power supply leds,基于linux led class,提供PSY设备状态指示的通用实现。位于drivers/power/power_suppply_leds.c中。
最后,驱动工程师可以基于power supply class,实现具体的PSY drivers,主要处理平台相关、硬件相关的逻辑。这些drivers都位于drivers/power/目录下。
---------------------
作者:jasegg
来源:CSDN
原文:https://blog.csdn.net/u010997852/article/details/90749490
版权声明:本文为博主原创文章,转载请附上博文链接!
3. 核心数据结构
1)struct power_supply
struct power_supply为power supply class的核心数据结构,用于抽象PSY设备。其定义如下:
2)PSY类型
PSY类型由enum power_supply_type定义:
3)PSY属性
power supply class将所有可能PSY属性,以枚举型变量(enum power_supply_property )的形式抽象出来,PSY driver可以根据设备的实际情况,从中选取一些。
3.3 向具体的PSY driver提供的API
power supply class首要任务,是向PSY driver提供统一的驱动编写接口,主要包括:
1)PSY的register/unregister API
2)PSY状态改变时通知power supply core的API
当PSY driver检测到该设备某些属性值改变时,需要调用这个接口,通知power supply core,power supply core会有如下动作:
如果该PSY是其它PSY的供电源,调用这些PSY的external_power_changed回调函数,通知它们(这些PSY具体要做些什么,由它们的自身逻辑决定);
如果配置了CONFIG_LEDS_TRIGGERS,调用power_supply_update_leds,更新该PSY有关的led状态;
发送notifier,通知那些关心PSY设备状态的drivers;
以统一的格式,向用户空间发送uevent(这就是设备模型中class的魅力,对外接口由class core提供,可以节省driver的工作量,同时确保了接口的一致性)。
3)其它杂项接口
3.4 向其它driver提供的用于接收PSY状态改变notifier的API
3.5 向用户空间程序提供的API
power supply class通过两种形式向用户空间提供接口。
1)uevent(具体可参考“Linux设备模型(3)_Uevent”),以“名字=value”的形式,上报所有property的值,格式如下:
uevent一般会在PSY设备添加到kernel时,或者PSY属性发生改变时(可参考3.3中的介绍)发送
2)sysfs
power supply class在power_supply_sysfs.c中,定义了相当多的默认attribute(见下面),如果某个PSY设备具有某个属性,该属性对应的attribute就会体现在sysfs中(一般位于“/sys/class/power_supply/xxx/”中)。
4. 怎样基于power supply class编写PSY driver
最后从PSY driver的角度,说明一下怎么基于power supply class,编写驱动:
1)根据硬件spec,确定该PSY设备具备哪些特性,并把它们和enum power_supply_property 中所定义的property对应。
2)根据实际情况,实现这些properties的get/set接口。
3)定义一个struct power_supply变量,并初始化必要的字段后,调用power_supply_register或者power_supply_register_no_ws,将其注册到kernel中。
4)根据实际情况,启动设备属性变化的监控逻辑,例如中断、轮询等,并在发生改变时,调用power_supply_changed,通知power supply core。