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

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

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_THERMALstruct 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;
    #endifANDROID_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.mzph.cn/news/848213.shtml

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

相关文章

vs2019 c++20 规范的头文件 <future> 源码注释和几个结论

(1 探讨一)在多线程中,需要线程返回值的可以用该头文件中的类。该头文件中模板类和模板函数定义很多,用一幅图给出模板类之间的关系,方便从整体上把握和记忆: (2)

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…

GNN与Transformer创新结合!模型性能起飞!

前言 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型分别凭借其独到的优势&#xff0c;在处理复杂数据结构和识别序列间的相互依赖性方面取得了突破性进展&#xff0c;这些优势使得GNN和Transformer的结合成为图表示学习领域的一个有前景的研究方…

IP黑名单与IP白名单是什么?

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

小孩天赋是怎样炼成的 懂孩子比爱孩子更重要 详细天赋评估列表 观察非常细致 培养领导能力的方法

懂孩子比爱孩子更重要 “懂孩子比爱孩子更重要&#xff0c;懂才更准确的去爱” 这句话说得很有道理。理解孩子的内心世界、需求和独特个性&#xff0c;比单纯地给予爱更加重要。以下是一些解释&#xff1a; 理解孩子的需要&#xff1a;懂孩子意味着理解他们的需求、恐惧、欢乐…

大模型时代的具身智能系列专题(十)

Sergey Levine团队 Sergey Levine目前是UC Berkeley电气工程与计算机科学系的副教授&#xff0c;同时是RAIL(Robotic AI&Learning LabBAIR)实验室主任。除了在Berkeley的教职&#xff0c;Levine也是Google Brain的研究员&#xff0c;他也参与了Google知名的机器人大模型PA…

C#——随机类Random类

Random类 C#的Random类是用于生成随机数的类&#xff0c;属于System命名空间&#xff0c;可以生成各种类型的随机数&#xff0c;例如整型、双精度浮点型、布尔型等。 使用方法&#xff1a; 使用random数据类型关键字 声明一个random的变量 值使用new random 来实例化这个变量…

使用python绘制日历热力图

使用python绘制日历热力图 日历热力图效果代码 日历热力图 日历热力图&#xff08;Calendar Heatmap&#xff09;是一种数据可视化图表&#xff0c;用于展示时间数据的分布和趋势。它将数据按天映射到一个日历中&#xff0c;通过颜色的变化表示每天的数据值大小。这种图表常用…

基于GFlowNets的蚁群抽样组合优化

本文将基于GFACS论文&#xff0c;探讨其核心思想、技术细节以及在实际应用中的优势。 GFlowNet&#xff1a;摊销MCMC成本的有效工具 GFACS的核心是GFlowNet&#xff0c;它通过训练学习状态转移的概率分布&#xff0c;从而替代传统的MCMC采样方法。GFlowNet的优势在于&#xff1…

从Series到DataFrame:Python数据操作的转换技巧

在数据分析和处理的过程中&#xff0c;我们经常需要在Pandas库中对Series和DataFrame进行操作。本文将介绍如何将Series转换为DataFrame&#xff0c;以及如何提取DataFrame中的某一列。首先&#xff0c;我们将通过使用to_frame()函数将Series转换为DataFrame。然后&#xff0c;…

SQL实验 连接查询和嵌套查询

一、实验目的 1&#xff0e;掌握Management Studio的使用。 2&#xff0e;掌握SQL中连接查询和嵌套查询的使用。 二、实验内容及要求&#xff08;请同学们尝试每道题使用连接和嵌套两种方式来进行查询&#xff0c;如果可以的话&#xff09; 1&#xff0e;找出所有任教“数据…

知识图谱应用---智慧医疗

文章目录 智慧医疗典型应用 智慧医疗 智慧医疗是利用先进的物联网与移动通信技术、大数据及人工智能等新一代IT技术&#xff0c;实现医疗信息系统与医疗过程的智能化辅助与自动化处理&#xff0c;实现医疗业务流程的数字化运作&#xff0c;实现患者与医务人员、医疗机构、医疗设…

ChatGPT制作一个简单的客服机器人

包含功能&#xff1a; MVP&#xff08;最简可行产品&#xff09;版本的客服机器人应该聚焦于核心功能&#xff0c;以快速上线和测试用户反馈为目标。以下是一个简化的版本&#xff1a; 自动问答&#xff08;FAQ&#xff09;功能&#xff1a; 支持回答常见问题&#xff0c;例如…

转让北京书画院自己名下随时配合变更

北京地区现在已经停批了书画院、科技院、研究院等等只要是带院、中心、所等等都是挺不能新设立也不能核名。要是想经营这类的企业可以选择收购&#xff0c;目前市面上有书画院、教育科技院、教育研究院、中医研究院、信息技术研究院、医学研究院等等因为停批的一个原因导致转让…

基于MetaGPT构建LLM 订阅 Agent

前言 在上一篇文章中&#xff0c;我们学习了如何利用MetaGPT框架构建单智能体和多智能体&#xff0c;并通过一个技术文档撰写Agent和课后作业较为完整的理解一个Agent的需求分析和开发流程&#xff1b;但是技术要和应用结合才能得到更广泛的推广&#xff1b;在本文中&#xff0…

ClickHouse内幕(1)数据存储与过滤机制

本文主要讲述ClickHouse中的数据存储结构&#xff0c;包括文件组织结构和索引结构&#xff0c;以及建立在其基础上的数据过滤机制&#xff0c;从Part裁剪到Mark裁剪&#xff0c;最后到基于SIMD的行过滤机制。 数据过滤机制实质上是构建在数据存储格式之上的算法&#xff0c;所…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

msvcr120.dll是干嘛的?出现找不到msvcr120.dll丢失怎样解决

msvcr120.dll是Microsoft Visual C 2012 Redistributable的核心文件&#xff0c;它是Microsoft Corporation开发的C/C运行时库文件之一。这个文件通常与应用程序一起安装&#xff0c;为应用程序提供许多基本的运行时功能&#xff0c;包括内存管理、异常处理、输入/输出操作等。…

<网络安全>《88 国内主要企业网络安全公司概览(四)》

9 杭州迪普科技股份有限公司&#xff08;简称联软科技&#xff09; 信息内容LOGO成立日期创始于2008年总部浙江省杭州市滨江区月明路595号迪普科技18楼背景民营企业是否上市300768注册资本64,382.9039万主要产品网络安全数据安全交换机简介安全大数据处理引擎与AI智能分析引擎…