Linux Power Supply架构及代码解析

一、 概述

电源管理整体上可以分为两个部分,一个是电池监控(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。

Power Supply驱动是用于管理和监控供电设备的驱动程序。它负责与硬件交互,提供供电设备的状态信息,并处理供电设备的属性变化。 在Linux系统中,Power Supply驱动的头文件为`include/linux/power_supply.h`,驱动框架的代码位于`drivers/power/power_supply_core.c`和`drivers/power/power_supply_sysfs.c`。\[1\] Power Supply驱动的节点是通过调用`power_supply_register`函数注册的。在初始化过程中,会在`/sys/class`目录下创建`power_supply`目录,并注册uevent回调函数,初始化节点。`power_supply_desc`结构体中的`properties`字段指定了相应的属性类型,根据这些属性类型会注册相应的节点。\[2\] 一个Power Supply驱动需要实现`get_property`和`external_power_changed`这两个函数,这些函数的名称对应于在`/sys/class/power_supply/`目录中创建的子目录。`power_supply_property`是一系列用枚举值表示的属性,对应于供电设备子目录中的文件名。`supplied_to`表示为哪个设备进行供电,通常指某个电池。\[3\] 总结起来,Power Supply驱动是用于管理和监控供电设备的驱动程序,它通过注册节点和属性来提供供电设备的状态信息,并处理供电设备的属性变化。 #### 引用[.reference_title] - *1* *3* [Power Supply驱动框架](https://blog.csdn.net/gnnulzy/article/details/51462762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Linux power_supply子系统](https://blog.csdn.net/qq_39678541/article/details/122964116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值