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

2023-11-09

一、 概述

电源管理整体上可以分为两个部分,一个是电池监控(fuel gauge),另外一个是充放电管理。这两部分在内核中也是分为两个驱动来管理。fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等。同时也向charger驱动提供电池的相关信息。charger驱动主要是负责电源线的插拔检测、充电器类型识别和充放电的过程管理等实务。
Power supply class 是为编写供电设备(power supply ,简称PSY)的驱动提供的统一框架
主要功能包括如下部分:
1. 抽象PSY设备共性,向用户空间提供统一的API
2. 为底层PSY驱动的编写提供简单统一的方式,同时封装并且实现公共逻辑,驱动工程师只要专注与硬件细节部分。

设计思路:
PSY driver的主要功能就是向用户空间程序汇总各类状态信息。因此power supply class的思路如下:
PSY driver负责:该PSY设备具有哪些属性,这些属性的值是什么,当属性值发生改变时要通知power supply class
Power supply class负责:将某个PSY设备支持的属性及其value以sysfs的形式提供给用户空间,当属性值改变时以uevent的形式广播给用户空间程序。,另外也会协助处理PSY级联的情况。

软件架构及API接口
Power supply class 位于driver/power目录中,主要由三部分组成:
1. power_supply_core.c 抽象核心数据结构实现公共逻辑
2. power_supply_sysfs.c 实现sysfs和uevent功能
3. power_supply_leds.c 提供PSY设备状态指示的通用实现
核心数据结构:

struct power_supply {
    const struct power_supply_desc *desc;
    char **supplied_to;          //当此电源变化时需要通知的电源模块 name
    size_t num_supplicants;      // supplied_to 数组的大小

    char **supplied_from;        //接收其他电源模块发生变化时的通知 name
    size_t num_supplies;         // supplied_from 数组的大小
    struct device_node *of_node;

    /* Driver private data */
    void *drv_data;

    /* private */
    struct device dev;
//工作队列,相当与一个内核线程,主要思路是该PSY设备状态改变了就启用一个workqueue,查询并通知所有由他发起supplicants 
struct work_struct changed_work;
    struct delayed_work deferred_register_work;
    spinlock_t changed_lock;
    bool changed;
    bool initialized;
    atomic_t use_cnt;
#ifdef CONFIG_THERMAL
    struct thermal_zone_device *tzd;
    struct thermal_cooling_device *tcd;
#endif
#ifdef CONFIG_LEDS_TRIGGERS   //LED相关的操作省略显示。。
#endif
};

其中 power_supply_desc 定义如下:

struct power_supply_desc {
    const char *name;                //电源名称
    enum power_supply_type type;     //电源类型 为电池 USB或者。。
    enum power_supply_property *properties; //该电源的属性
    size_t num_properties;                //该电源属性的数目
    //读取属性值
    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);
    //设置属性为可写的属性
    int (*property_is_writeable)(struct power_supply *psy,
                     enum power_supply_property psp);
    //外部电源发生变化时所做的工作
    void (*external_power_changed)(struct power_supply *psy);
    void (*set_charged)(struct power_supply *psy);
    bool no_thermal;                     //设置本电源会不会产生热源
    int use_for_apm;            //For APM emulation, think legacy userspace.
};

向具体的PSY driver提供的API接口
1. PSY的register/unregister API

power_supply_register(struct device *parent,const struct power_supply_desc *desc,
                       const struct power_supply_config *cfg)
power_supply_register_no_ws(struct device *parent,const struct power_supply_desc *desc,const struct power_supply_config *cfg)
power_supply_unregister(struct power_supply *psy)

power_supply_register 和 power_supply_register_no_ws的区别:
power_supply_register_no_ws 没有weakup系统的能力
2. PSY状态发生改变时的API
power_supply_changed(struct power_supply *psy)
当PSY driver 检测到设备某些属性值发生改变时需要调用这个接口,通知我们的
Power supply core ,Power supply core 会有如下动作:
1) 如果该PSY是其他PSY的供电源,调用这些PSY的external_power_changed回调函数,通知他们。
2) 如果配置了CONFIG_LEDS_TRIGGERS,调用power_supply_update_leds更新该PSY有关的LED状态。
3) 发送notifier ,通知那些关心PSY设备状态的drivers.
4) 以统一的格式向用户空间发送uevent
3.其他杂项接口

extern struct power_supply *power_supply_get_by_name(const char *name); 
extern struct power_supply *power_supply_get_by_phandle(struct device_node *np, 
                                                           const char *property); 
extern int power_supply_am_i_supplied(struct power_supply *psy); 
extern int power_supply_set_battery_charged(struct power_supply *psy); 
extern int power_supply_is_system_supplied(void); 
extern int power_supply_powers(struct power_supply *psy, struct device *dev);

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)。

4.向其它driver提供的用于接收PSY状态改变notifier的API

extern int power_supply_reg_notifier(struct notifier_block *nb); 
extern void power_supply_unreg_notifier(struct notifier_block *nb);

通过notifier注册接口注册notifier之后,系统任何PSY设备的状态发生改变,并调用了power_supply_changed接口,power supply core就是通知notifier的监听者。
5. 向用户空间程序提供的API
power supply class通过两种形式向用户空间提供接口。
1)uevent 以“名字=value”的形式,上报所有property的值
uevent一般会在PSY设备添加到kernel时,或者PSY属性发生改变时(可参考3.3中的介绍)发送。
2)sysfs 如果某个PSY设备具有某个属性,该属性对应的attribute就会体现在sysfs中(一般位于“/sys/class/power_supply/xxx/”中)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中power supply软件架构和相关API 的相关文章

  • 【开发工具】SVN断网续传、续下解决办法

    支持原创 欢迎关注原文地址 http www china10s com blog p 406 当你处在弱网环境下 经常断网 断线 这时候下载SVN代码是个难题 网上搜到的答案也是众说纷纭 那么我就说一下我的解决办法吧 在你确认断网导致SVN
  • 华为OD机试真题- 分割数组的最大差值-2023年OD统一考试(B卷)

    题目描述 给定一个由若干整数组成的数组nums 可以在数组内的任意位置进行分割 将该数组分割成两个非空子数组 即左数组和右数组 分别对子数组求和得到两个值 计算这两个值的差值 请输出所有分割方案中 差值最大的值 输入描述 第一行输入数组中元
  • PAD2Reg和Reg2PAD的时序分析

    PAD2Reg 1 Input delay约束从SOC PAD输入到第一级FF的data path 2 Input delay约束中的 clock指的是launch clock 它一般存在于Device中 对SOC来说是个虚拟时钟 如果发射
  • 从生产到测试,多张表但有相同的业务主键-存储过程的使用

    PL SQL Developer Test script 3 0 32 Created on 2019 4 12 by ADMINISTRATOR declare Local variables here sqh0 varchar2 20
  • CMS V5.7 SP2漏洞复现(CVE-2018-20129)

    0x00 前置 1 CVE中对该漏洞的描述 在 DedeCMS V5 7 SP2 中发现了一个问题 uploads include dialog select images post php 允许远程攻击者通过双扩展名和修改的 php 子字
  • Nodejs学习之Path模块

    一 介绍 Node js path模块提供了一些用于处理文件路径的方法 引入Path模块 var path require path 二 函数介绍 2 1 path normalize 格式化路径 console log normaliza
  • 常见数据结构

    一 数据结构 1 线性 数组 按顺序存储在内存中 每一个节点都有下标 查询快 数组一般用来存储相同类型的数据 可通过数组名和下标进行数据的访问和更新 数组中元素的存储是按照先后顺序进行的 同时在内存中也是按照这个顺序进行连续存放 数组相邻元
  • rtabmap安装与使用

    参考 ubuntu18 04安装Rtabmap 具体详细步骤 教你手把手运行基于ZED的rtab map ZED入门 利用RTAB MAP做SLAM ubuntu16 04 ROS Kinetic rtabmap 源码 非ros版本 安装运
  • freeswitch四、局域网支持

    在局域网内进行的测试 需要进行ACL的配置 conf autoload configs acl conf xml 中 加入下面配置
  • 搭建属于自己的云测试平台

    最近老大给了一个资料让研究 需要搭建一个平台 把公司所有的测试机集中在一起管理 谁需要用的时候 直接在web页面使用 省去了到处找别人借手机等问题 下面先介绍以下这个平台 STF Smartphone Test Farm 是一个Web应用程
  • python爬虫案例(二):大学排名

    小菜鸟从一个个案例来练习爬虫 心路是曲折的 555 在爬虫案例 一 中 是用urllib进行的 本案例中应用的是requests库 它会比urllib更加方便 requests是python实现的最简单易用的HTTP库 建议爬虫使用requ
  • JavaScript学习(四)认识DOM

    文章目录 DOM简介 通过ID获取元素 innerHTML 属性 改变 HTML 样式 display属性 DOM简介 DOM Document Object Model 文档对象模型 定义了访问和处理html文档的标准方法 DOM 将HT
  • 《信号与系统》示例1.单位阶跃信号的matlab实现

    1 已知单位阶跃函数 请用matlab实现单位阶跃信号 step1 打开matlab2014a 版本可以自选 step2 输入相应代码 t 1 0 01 5 ft t gt 0 plot t ft grid on plot函数是绘制二维图形
  • Vue项目运行报错:Module build failed (from ./node_modules/babel-loader/lib/index.js)

    报错分析 今天在npm run serve运行Vue项目时 突然报出了一个依赖构建错误 Module build failed from node modules babel loader lib index js 报错原因是babel的版
  • linux三剑客sed之模式空间与保持空间

    pattern space 模式空间 and hold space 保持空间 H h G g x 模式空间 sed处理文本内容行的一个临时缓冲区 模式空间中的内容会主动打印到标准输出 并自动清空模式空间 保持空间 sed处理文本内容行的另一
  • 【Hexo themes】【闪烁之狐 Matery】【简】

    文章目录 1 Down 2 修改Hexo配置文件 3 预览 4 部署更新 Summary Reference 个性化 PS 上午在 Hexo themes找了一些主题 有的太简单 可以配置的功能少 有些太复杂 以up现有能力要调一会才能开通
  • 从JAVA转.NET

    走路 难免要过河 生活 难免要磕碰 最近由于公司业务调整 把我所在的部门 整体搬迁到另外一个部门 业务自然是要从头开始了 这 我也就忍了 反正业务嘛 对大家都是公平的 而且搞软件开发哪能同一个业务做一辈子啊 除了盖茨啊 郁闷的是 技术也要换
  • 前端基础4——jQuery

    文章目录 一 基本了解 1 1 导入jQuery库 1 2 基本语法 1 3 选择器 二 操作HTML 2 1 隐藏和显示元素 2 2 获取与设置内容 2 3 获取 设置和删除属性 2 4 添加元素 2 5 删除元素 2 6 设置CSS样式
  • 在centos7上安装在线vscode

    最近在二开datahub 而datahub比较适合在linux中部署 就打算使用线上开发工具code server 安装方法比较简单 直接执行脚本进行安装 curl fsSL https code server dev install sh

随机推荐

  • C++模板函数-无法解析的外部符号

    在网上 看到有类似的问题 经常是写一个头文件 如test h 里面这样写 ifndef TEST H define TEST H include using namespace std 给指针data分配height width的内存 te
  • C#连接SQL数据库

    一 连接数据库服务器 1 连接SQL服务器 以下面为例 这里我使用的是SQL Server 身份验证 也可使用windows 身份验证 账户信息如下 登录名 sa 密码 mima 输入时自动隐藏 建立好数据库和表 服务器名 HG66 MSS
  • JavaScript应用——手把手教你做一个页面化猜数字游戏

    一听到猜数字游戏 想必大家都不太陌生吧 是的没错 很多人都用C语言或者Java写过猜数字游戏小程序 博主也不例外 之前写过C语言版本的猜数字游戏 感兴趣的同学可以看看C语言版本猜数字游戏 本篇博客主要介绍如何用JavaScript实现一个页
  • Django配置文件介绍

    本文主要讲一下django的settings文件中各个配置的代表的含义 from pathlib import Path 项目根路径 BASE DIR Path file resolve parent parent 密钥 自动生成的 很复杂
  • 源代码:STM32 SPI “DMA”操作W25QXX(16/32/64/128)系列芯片代码详解

    系列文章目录 文章目录 系列文章目录 前言 一 SPI h 二 SPI c 1 SPI配置 2 DMA配置 3 w25q64 c 4 w25q64 h 五 main c 六 串口打印代码 七 输出结果 前言 框架 自己新建库文件夹 取名li
  • 力扣第一题两数之和 PHP方法

    有事没事 什么都尝试 慢慢积累 都能走很远 很早之前就开始了解算法 然后知道算法是一种很神奇的东西 主要的那种逻辑明白之后你会觉得很秀啊 而各种联系在一起解决实际问题 瞬间感觉算法真的有用 所有开始看力扣中的题目并且尝试去做吧 比较笨拙等写
  • app上线发布流程_上架app的流程,需要提供什么资料,找人代上架靠谱?

    本文转载自姑婆那些事儿APP 注册应用商店账号 申请应用商店上架是APP推广的第一步 这一步没做好 会延迟甚至耽误后续的工作 因此 做好上架工作尤为重要 今天姑婆根据我们自己APP上架的经验进行了整理 分享给大家 希望对大家有所帮助 一 安
  • mongodb显示:‘mongo‘不是内部或外部命令,也不是可运行的程序或批处理文件

    我们在安装完mongodb之后都需要去校验一下是否安装成功 一般都用 mongo 去查看我们的mongodb安装是否成功 正常情况是这样的 但是如果是出现 mongo 不是内部或外部命令 也不是可运行的程序或批处理文件 我们有两个方法去排查
  • 2023前端面试题及答案整理(Vue)

    watch 和 computed 区别 watch 是监听动作 computed 是计算属性 watch 没缓存 只要数据变化就执行 computed 有缓存 只在属性变化的时候才去计算 watch 可以执行异步操作 而 computed
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • 解读三大财务报表

    三张报表是一体化的报表 但在不同的报表里 概念之间有些差异 大家应该适应此情况 这是全球性的问题 三张报表实际上是站在两个不同的角度 实际上 两个体系 维度 描述了同样的经济活动 但它们各自描述经济活动的方式是不一样的
  • java 枚举数据字典_枚举值当数据字典使用

    public interface EnumType enum E TRANCALL AFTER SUBTRAN PROCESS AFTER SUBTRAN PROCESS afterSubtranProcess 子交易处理模板后 Commo
  • 磁盘使用率大于90% 磁盘inode使用率大于90%

    线上机器一直再报 磁盘使用率大于90 发现 var log 下边有个mail文件 很大就直接清理掉 gt mail 但是这个问题反复出现 感觉一个没有什么业务的机器怎么磁盘使用率那么大 就查了下mail日志文件的形成 ps 发现有好多sen
  • Tigase开发笔记6:packet流转机制 -> 一条消息(packet)的请求和响应过程解析

    初看Tigase的packet内部流转机制一开始不是太明白 里面用到了较多的线程 代码不太看得懂 慢慢的通过一条消息的请求和响应的代码跟踪分析 搞清楚了消息流转的过程 前言 本文使用Tigase Server version 7 0 2 进
  • [考研数学]概率论难点总结:样本标准差,样本均值,均值的期望和方差,与t分布、卡方分布和F分布的关系及推导

    首先需要清楚一件事情 样本均值为X拔 上面有个棍 样本的均值是讲从总体中抽样 这些样本的均值 而均值是指所有样本的真实均值 后面部分很好推导 将括号展开后 由三部分组成 中间的部分为2倍的样本和样本均值的乘积 将样本的和变成n倍的样本均值即
  • MVC ——RouteTable.Routes的使用

    public class RouteTable Fields private static RouteCollection instance new RouteCollection Properties public static Rout
  • ubuntu64位安装交叉编译器出现一些问题

    安装交叉编译工具时 因为交叉编译工具为32位的 而我的ubuntu51 10是64位的 使用交叉编译工具时会出错 一般是安装 apt get install lib32ncurses5 再有出错就去安装对应的库吧 如libstdc so 6
  • 50行代码,实现AI文章生成器,牛逼!

    本文共1502字 预计阅读时间 3分钟 据说 AI 已经可以自动写文章 类似的报道屡见不鲜 但是 AI 写出来的文章到底是什么样的 我想没几个人见识过 无意中看到了 Gayhub 上的这个项目 全称就是 狗屁不通文章生成器 英文名字是 Bu
  • mongovue 导入mysql_【mongo】用户添加、导入数据库、连接VUE

    添加用户 1 安装mongo时最好用apt get install 因为这样可以省去很多麻烦 比如一些环境变量 还有一些文档路径等等的问题 2 确认一下自己的mongodb和mongodb clients的版本 要版本一致才可以 查看mon
  • Linux 中power supply软件架构和相关API

    一 概述 电源管理整体上可以分为两个部分 一个是电池监控 fuel gauge 另外一个是充放电管理 这两部分在内核中也是分为两个驱动来管理 fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等 同