NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(一)

news2024/12/28 20:17:51

专栏文章目录传送门:返回专栏目录

Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】


目录

1. Power Supply子系统介绍

2. Power Supply子系统框架

3. Power Supply代码分析


本章节主要介绍Linux 下的Power Supply子系统,也就是我们常见的电源管理子系统,将会从的架构框架进行分析,源码进行简单讲述,后续将以一个实际例子去实操,对于添加不同的芯片该如何去把这个电源管理子系统结合起来使用。

学习本章目的:

了解Power Supply子系统框架原理;

对于不同的电源管理芯片可以调试驱动应用在系统上;


1. Power Supply子系统介绍

Linux Power Supply子系统是Linux内核中的一个重要部分,用于管理系统的电源供应管理电池管理。其主要作用是监控和控制设备的能量消耗和供电状态,以确保系统的稳定运行和能效优化。该子系统涵盖了多个方面,包括电源供应、电池管理和电源管理等,对于嵌入式系统的性能和可靠性至关重要。

电源供应管理:这部分涵盖了与系统电源供应相关的功能,包括识别和管理连接到系统的不同类型的电源设备,如AC适配器、USB供电、电池等。它负责监控电源设备的状态、能量消耗和供电能力,以确保系统的稳定运行。该部分还包括与电源设备交互的驱动程序和接口。

电池管理:电池管理部分关注于电池设备的状态和特性。它可以识别和管理连接到系统的电池,包括可充电电池和不可充电电池。这部分的功能包括监控电池的剩余容量、充电状态、健康状况等信息,以便系统可以根据电池的状态做出相应的能源管理决策。

这两个部分紧密协作,共同实现系统的能源管理,确保系统在不同的供电情况下保持稳定运行,同时优化能源利用和电池寿命。通过提供统一的接口和API,Linux Power Supply子系统使开发人员能够轻松地管理电源和电池,从而实现更好的系统性能和能源效率。


2. Power Supply子系统框架

在Power Supply的引入是因为设备通常存在多种PSY设备,它们都是向系统提供电能的实体,可以是电池,适配器,usb接口等等,所以对于这种差异性不同,使用上了Power Supply框架。所以Power Supply是不需要驱动的。

在内核当中Power Supply是给驱动提供了一个统一的架构,功能:抽象PSY设备的共性,向用户空间提供统一的API,为底层PSY驱动的编写,提供简单、统一的方式。

  • power supply core,用于抽象核心数据结构,实现通用逻辑。负责管理电源供应设备和电池电源设备的注册、状态管理和事件处理。它提供了一个通用的框架,用于设备的注册和管理,以及电源供应状态的更新和通知。Power Supply Core 与硬件无关,可以管理各种类型的电源供应设备。./drivers/power/supply/power_supply_core.c

  • power supply sysfs,Sysfs 是Linux内核中用于向用户空间提供设备和驱动程序信息的虚拟文件系统。Power Supply子系统通过sysfs提供了一系列虚拟文件,用于访问电源供应设备的属性、状态和配置信息。这使得用户和应用程序可以通过文件操作来监控和控制电源供应设备,实现电源管理的交互。./drivers/power/supply/power_supply_sysfs.c

  • power supply leds,LEDs(Light Emitting Diodes)模块是Power Supply子系统的一个重要扩展,它允许将LED指示灯与电源供应设备状态相关联。通过这个模块,可以根据电源供应设备的状态变化来控制LED的开启和关闭,从而提供更直观的电源状态显示。./drivers/power/supply/power_suppply_leds.c

    这三个模块共同构成了Linux Power Supply子系统的基础架构。Power Supply Core 提供了通用的设备管理和状态处理功能,Power Supply Sysfs 提供了与用户空间的交互接口,而Power Supply LEDs 则扩展了系统状态的显示和反馈方式。这种架构使得Linux内核能够更好地管理各种电源供应设备,提高系统的能效、可靠性和用户体验。


    3. Power Supply代码分析

    关于Power Supply的代码实现都在

    ./drivers/power/supply/

  • ls ./drivers/power/supply/
    88pm860x_battery.c   bd99954-charger.c      cpcap-charger.c        ipaq_micro_battery.c         max8903_charger.c     qcom_smbb.c          tps65217_charger.c
    88pm860x_charger.c   bd99954-charger.h      cros_usbpd-charger.c   isp1704_charger.c            max8925_power.c       rn5t618_power.c      twl4030_charger.c
    ab8500_bmdata.c      bq2415x_charger.c      cw2015_battery.c       Kconfig                      max8997_charger.c     rt5033_battery.c     twl4030_madc_battery.c
    ab8500_btemp.c       bq24190_charger.c      da9030_battery.c       lego_ev3_battery.c           max8998_charger.c     rt9455_charger.c     ucs1002_power.c
    ab8500_charger.c     bq24257_charger.c      da9052-battery.c       lp8727_charger.c             mp2629_charger.c      rx51_battery.c       wilco-charger.c
    ab8500_fg.c          bq24735-charger.c      da9150-charger.c       lp8788-charger.c             olpc_battery.c        s3c_adc_battery.c    wm831x_backup.c
    abx500_chargalg.c    bq2515x_charger.c      da9150-fg.c            lt3651-charger.c             pcf50633-charger.c    sabresd_battery.c    wm831x_power.c
    act8945a_charger.c   bq25890_charger.c      ds2760_battery.c       ltc2941-battery-gauge.c      pda_power.c           sbs-battery.c        wm8350_power.c
    adp5061.c            bq25980_charger.c      ds2780_battery.c       Makefile                     pm2301_charger.c      sbs-charger.c        wm97xx_battery.c
    apm_power.c          bq25980_charger.h      ds2781_battery.c       max14577_charger.c           pm2301_charger.h      sbs-manager.c        z2_battery.c
    axp20x_ac_power.c    bq27xxx_battery.c      ds2782_battery.c       max14656_charger_detector.c  pmu_battery.c         sc2731_charger.c
    axp20x_battery.c     bq27xxx_battery_hdq.c  dummy_battery.c        max17040_battery.c           power_supply_core.c   sc27xx_fuel_gauge.c
    axp20x_usb_power.c   bq27xxx_battery_i2c.c  generic-adc-battery.c  max17042_battery.c           power_supply.h        smb347-charger.c
    axp288_charger.c     charger-manager.c      goldfish_battery.c     max1721x_battery.c           power_supply_hwmon.c  test_power.c
    axp288_fuel_gauge.c  collie_battery.c       gpio-charger.c         max77650-charger.c           power_supply_leds.c   tosa_battery.c
    bd70528-charger.c    cpcap-battery.c        ingenic-battery.c      max77693_charger.c           power_supply_sysfs.c  tps65090-charger.c

    在该文件夹下发现许多.c,其实可以把他们分成几类代码:

    一种是充电驱动,充电器驱动,电源供应驱动,电源供应代,虚拟文件驱动码等;

    电池驱动:这些文件涉及各种电池管理芯片的驱动程序,用于监测电池的电量、温度和状态等信息,从而实现电池的管理和优化。

    • 88pm860x_battery.c

    • ab8500_bmdata.c

    • ab8500_btemp.c

    • ab8500_charger.c

    • ...

    充电器驱动:这些文件包含各种充电器管理芯片的驱动程序,用于控制充电器的工作状态、充电电流和电压等参数,实现对电池的充电。

    • bd99954-charger.c

    • bq2415x_charger.c

    • bq24257_charger.c

    • bq24735-charger.c

    • ...

    电源供应设备驱动:这些文件包含用于管理其他类型电源供应设备的驱动程序,如USB供电、AC适配器等,用于监控和控制设备的供电状态。

    • axp20x_ac_power.c

    • axp20x_usb_power.c

    • axp288_charger.c

    • axp288_fuel_gauge.c

    • ...

    其他辅助驱动和工具:此外,还有一些驱动程序用于辅助电源管理,如充电管理算法、LED指示灯控制等。

    • power_supply_core.c:Power Supply子系统的核心模块,管理电源供应和电池设备的注册和状态。

    • power_supply_sysfs.c:实现电源供应设备在sysfs虚拟文件系统中的接口,用户可以通过文件操作来控制和监测设备。

    • power_supply_leds.c:用于控制LED指示灯以显示电源供应和电池设备的状态。

    这里主要对power supply 重点数据结构分析:

    power supply

    struct power_supply {
            const struct power_supply_desc *desc; //指向电源供应设备的描述信息的指针
    
            char **supplied_to; //当前电源供应设备供应能量给的设备的名称列表
            size_t num_supplicants; //功能设备数量
    
            char **supplied_from;//、、供能设备的数量
            size_t num_supplies;
            struct device_node *of_node;//设备树节点,用于与设备树中的电源设备关联。
    
            /* Driver private data */
            void *drv_data;
    
            /* private */
            struct device dev;
            struct work_struct changed_work;
            struct delayed_work deferred_register_work;
            spinlock_t changed_lock;
            bool changed;
            bool initialized;
            bool removing;
            atomic_t use_cnt;
    #ifdef CONFIG_THERMAL
            struct thermal_zone_device *tzd;
            struct thermal_cooling_device *tcd;
    #endif
    
    #ifdef CONFIG_LEDS_TRIGGERS
           //加入配置了LED触发相关,则有以下相关功能接口
            struct led_trigger *charging_full_trig; //充电满时的LED触发器的名称。
            char *charging_full_trig_name;
            struct led_trigger *charging_trig;
            char *charging_trig_name;
            struct led_trigger *full_trig;
            char *full_trig_name;
            struct led_trigger *online_trig;
            char *online_trig_name;
            struct led_trigger *charging_blink_full_solid_trig;
            char *charging_blink_full_solid_trig_name;
    #endif
    
            ANDROID_KABI_RESERVE(1);
    };

    PSY的相关属性,也就是电源供电类型:

    enum power_supply_type {
            POWER_SUPPLY_TYPE_UNKNOWN = 0,
            POWER_SUPPLY_TYPE_BATTERY, //电池设备供电
            POWER_SUPPLY_TYPE_UPS, //UPS类型供电
            POWER_SUPPLY_TYPE_MAINS, //主供电
            POWER_SUPPLY_TYPE_USB,                  /* Standard Downstream Port */
            POWER_SUPPLY_TYPE_USB_DCP,              /* Dedicated Charging Port */
            POWER_SUPPLY_TYPE_USB_CDP,              /* Charging Downstream Port */
            POWER_SUPPLY_TYPE_USB_ACA,              /* Accessory Charger Adapters */
            POWER_SUPPLY_TYPE_USB_TYPE_C,           /* Type C Port */
            POWER_SUPPLY_TYPE_USB_PD,               /* Power Delivery Port */
            POWER_SUPPLY_TYPE_USB_PD_DRP,           /* PD Dual Role Port */
            POWER_SUPPLY_TYPE_APPLE_BRICK_ID,       /* Apple Charging Method */
            POWER_SUPPLY_TYPE_WIRELESS,             /* Wireless */
    };

    对于充电算法的类型,慢充,快充,平衡充等等

    /* What algorithm is the charger using? */
    enum {
            POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0,
            POWER_SUPPLY_CHARGE_TYPE_NONE,
            POWER_SUPPLY_CHARGE_TYPE_TRICKLE,       /* slow speed */
            POWER_SUPPLY_CHARGE_TYPE_FAST,          /* fast speed */
            POWER_SUPPLY_CHARGE_TYPE_STANDARD,      /* normal speed */
            POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE,      /* dynamically adjusted speed */
            POWER_SUPPLY_CHARGE_TYPE_CUSTOM,        /* use CHARGE_CONTROL_* props */
            POWER_SUPPLY_CHARGE_TYPE_LONGLIFE,      /* slow speed, longer life */
    
            /*
             * force to 50 to minimize the chances of userspace binary
             * incompatibility on newer upstream kernels
             */
            POWER_SUPPLY_CHARGE_TYPE_TAPER = 50,    /* charging in CV phase */
    };

    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 class首要任务,是向PSY driver提供统一的驱动编写接口.

    加入PSY设备发生改变,将通过power_supply_changed进行通知

    extern void power_supply_changed(struct power_supply *psy);

    power supply core收到通知后,将调用PSY中的external_power_changed回调函数。

    对于文件系统体现的相关数据,包括电源供电状态,电池信息等等都是通过power_supply_sysfs.c实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速入门Linux及使用VSCode远程连接Linux服务器

在当前的技术环境中,Linux操作系统因其强大的功能和灵活性而广受欢迎。无论你是开发人员、系统管理员还是技术爱好者,学习Linux都是提升技术技能的重要一步。本文将介绍如何快速入门Linux,并使用Visual Studio Code(VSCode&#x…

【MySQL数据库】:MySQL索引特性

目录 索引的概念 磁盘 磁盘的基本特征 MySQL与磁盘交互的基本单位 索引的理解 建立测试表 理解单个Page 理解多个Page 页目录 单页情况 多页情况 索引的数据结构 聚簇索引 VS 非聚簇索引 索引操作 创建主键索引 创建唯一索引 创建普通索引 创建全文索引 查询…

跨区域文件管控过程中 如何保障安全和效率?

跨区域文件管控是指在跨越不同地域或区域的情况下对文件进行管理和控制的过程。这种控制可能涉及多个方面,包括安全性、合规性和管理效率等。 为了有效进行跨区域文件管控,组织通常需要采取一系列策略和措施,例如: 1、加密和安全…

LeakSearch:针对网络公开凭证的安全扫描与检测工具

关于LeakSearch 在红队演戏过程中,往往需要获取到针对目标域的访问权限。在这个过程中,很多红队人员会选择使用暴露在互联网上的代理服务器来实现目标域的访问,那么此时就需要在互联网上收集公开暴露的凭证信息。 对于蓝队来说,…

项目bug1

大项目测bug的时候让输入数字,如果不是则捕获异常,提示错误,几段很简单的代码: System.out.println("请输入要存入的金额"); Scanner sc new Scanner(System.in); while(true) {try {money sc.nextInt();break;} cat…

Git从入门到放弃

由于我的Git学的不太好,所以为了能够将以后我的学习笔记能够整理的更好,我先要系统的学习一下git,文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网,Git也不例外。ht…

Spring 使用SSE(Server-Sent Events)学习

什么是SSE SSE 即服务器发送事件(Server-Sent Events),是一种服务器推送技术,允许服务器在客户端建立连接后,主动向客户端推送数据。 SSE 基于 HTTP 协议,使用简单,具有轻量级、实时性和断线重…

linux中dd命令以及如何测试读写速度

dd命令详解 dd命令是一个在Unix和类Unix系统中非常常用的命令行工具,它主要用于复制文件和转换文件数据。下面我会详细介绍一些dd命令的常见用法和功能: 基本语法 dd命令的基本语法如下: bash Copy Code dd [option]...主要选项和参数 if…

JS-Fetch

Fetch 是一种用于进行网络请求的现代 JavaScript API。它提供了一种简单、灵活且功能强大的方式,用于从服务器获取资源并处理响应。 Fetch API 在浏览器中原生支持,并且以 Promise 为基础,使得异步请求更加直观和易用。使用 Fetch API&#…

大学搜题软件网课?推荐五个搜题软件和学习工具 #其他#经验分享#知识分享

大学生活中,选择适合自己的学习工具能够提高学习效率,让学习更加轻松愉快。 1.彩虹搜题 这个是公众号 提供了各大教材以及网课平台的练习题答案,强大的平台支持,无论是智慧树还是MOOC,只有老师们用不到,…

【SQLAlChemy】如何定义ORM模型,如何映射到数据库?

定义ORM模型并映射到数据库 创建 ORM 基类 使用 declarative_base 根据 engine 来创建一个 ORM 基类。 from SqlAIchemy.LinkDB.main import engineBase declarative_base()创建自定义类 用上边定义的 Base 类来实现自己的 ORM 类。 __tablename__ 类属性,可以…

Vue 2 + Element UI 选择一个el-select清空另一个el-select选中的值

需求&#xff1a;表单中有两个下拉选择器&#xff0c;先选中第一个&#xff0c;清空第二个选中的值 尝试过this.$refs[form].resetFields(field name);全都失效&#xff01; 效果图如下&#xff1a; 先选择商品分类&#xff0c;再去选择商品列表中的某一件商品 <el-form-…

GDPU JavaWeb Ajax请求

异步请求可以提升用户体验并优化页面性能。 ajax登录 实现ajax异步登录。 注意&#xff0c;ajax用到了jQuery库&#xff0c;先下载好相应的js库&#xff0c;然后复制导入到工程的web目录下&#xff0c;最好与你的前端页面同一层级。然后编写时路径一定要找准&#xff0c;“pag…

天才程序员周弈帆 | Stable Diffusion 解读(一):回顾早期工作

本文来源公众号“天才程序员周弈帆”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Stable Diffusion 解读&#xff08;一&#xff09;&#xff1a;回顾早期工作 在2022年的这波AI绘画浪潮中&#xff0c;Stable Diffusion无疑是最…

视频去水印电脑版,视频去水印软件

视频去水印怎么去&#xff0c;一直是视频编辑者们的热门话题。那么&#xff0c;如何去除频水印呢&#xff1f;接下来&#xff0c;我们将为您详细介绍视频去水印方法。 第一种方法&#xff1a; 首先通过浏览器打开 “ 51视频处理官网” 的网站。打开网站后&#xff0c;我们上传…

C语言---枚举位运算

枚举的定义&#xff1a; 一枚枚的列举 //一个个的列举 枚举的语法&#xff1a; enum 枚举名 { 枚举常量//名字 }&#xff1b; 例子&#xff1a; enum weekay { MON&#xff0c; TUES; WED; THURS; FRI; SAT; SUN;//枚举常量 }; 注意&#xff1a; 1、C语言中…

数据库(28)——联合查询

对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集。 语法 SELECT 字段列表 FROM 表A... UNION [ALL] SELECT 字段列表 FROM 表B...; 演示 select * from user where age > 22 union all select * from user where age < 50; u…

消息队列笔记

异步技术 企业级应用中广泛使用的三种异步消息传递技术 原文链接&#xff1a;https://blog.csdn.net/qq_55917018/article/details/122122218 三种异步消息传递技术 JMS (java message service) 一个Java规范&#xff0c;等同于JDBC规范&#xff0c;提供了与消息服务相关的…

tcp aimd 窗口的推导

旧事重提&#xff0c;今天用微分方程的数值解观测 tcp aimd 窗口值。 设系统 AI&#xff0c;MD 参数分别为 a 1&#xff0c;b 0.5&#xff0c;丢包率由 buffer 大小&#xff0c;red 配置以及线路误码率共同决定&#xff0c;设为 p&#xff0c;窗口为 W&#xff0c;则有&…

docker部署skywalking

skywalking版本下载 1&#xff1a;拉取skywalking的oap镜像(可以选择自己的版本&#xff0c;最好与ui&#xff0c;agent版本一致) docker pull apache/skywalking-oap-server:9.5.02&#xff1a;启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…