Linux 电源类

概要

电源类用于向用户空间表示电池、UPS、交流或直流电源的属性。

它定义了一组核心属性,这些属性应适用于(几乎)所有电源。属性可通过 sysfs 和 uevent 接口获得。

每个属性都有明确定义的含义,包括使用的计量单位。尽管提供的属性被认为是普遍适用于任何电源的,但特定的监控硬件可能无法提供所有属性,因此可以跳过任何属性。

电源类是可扩展的,并允许定义驱动程序自己的属性。核心属性集受标准 Linux 演变的影响(例如,如果发现某些属性适用于多种电源类型或其驱动程序,则可以将其添加到核心集中)。

它还与 LED 框架集成,用于提供电池充电/充满状态和交流/USB 电源在线状态的典型预期反馈。(请注意,指示的具体细节(包括是否使用它)完全由用户和/或特定机器的默认值控制,符合 LED 框架的设计原则)。

属性/特性

电源类具有预定义的属性集,这消除了驱动程序之间的代码重复。电源类坚持重用其预定义的属性它们的单位。

因此,用户空间可以获得一组可预测的属性及其单位,用于任何类型的电源,并且可以以一致的方式处理/呈现给用户。不同电源和机器的结果也具有直接可比性。

有关如何声明和处理属性的示例,请参见 drivers/power/supply/ds2760_battery.c。

单位

引用 include/linux/power_supply.h

所有电压、电流、电荷、能量、时间和温度均以 µV、µA、µAh、µWh、秒和摄氏度十分之一为单位,除非另有说明。驱动程序有责任将其原始值转换为此类操作的单位。

属性/特性详解

电荷/能量/容量 - 如何避免混淆

由于“电荷”(µAh)和“能量”(µWh)都表示电池的“容量”,因此该类会区分这些术语。不要混淆它们!

  • CHARGE_*

    属性仅以 µAh 表示容量。

  • ENERGY_*

    属性仅以 µWh 表示容量。

  • CAPACITY

    属性以百分比表示容量,从 0 到 100。

后缀

_AVG

硬件平均值,如果您的硬件确实能够报告平均值,请使用它。

_NOW

瞬时值。

STATUS

此属性表示运行状态(充电、充满、放电(即为负载供电)等)。这对应于 battery.h 中定义的 BATTERY_STATUS_* 值。

CHARGE_TYPE

电池通常可以以不同的速率充电。这定义了涓流充电和快速充电。对于已经充电或正在放电的电池,可以显示“n/a”(如果状态未知,则显示“unknown”)。

AUTHENTIC

指示连接到平台的电源(电池或充电器)是正品(1)还是非正品(0)。

HEALTH

表示电池的健康状况,值对应于 battery.h 中定义的 POWER_SUPPLY_HEALTH_*。

VOLTAGE_OCV

电池的开路电压。

VOLTAGE_MAX_DESIGN, VOLTAGE_MIN_DESIGN

电源最大和最小电压的设计值。最大/最小表示电池在正常情况下被视为“充满”/“耗尽”时的电压值。是的,电压和电池容量之间没有直接关系,但某些“笨”电池使用电压来非常粗略地计算容量。电池驱动程序也可以使用此属性来告知用户空间给定电池的最大和最小电压阈值。

VOLTAGE_MAX, VOLTAGE_MIN

与 _DESIGN 电压值相同,只是如果硬件只能猜测(测量和保留)给定电源的阈值,则应使用这些值。

VOLTAGE_BOOT

报告启动期间测量的电压

CURRENT_BOOT

报告启动期间测量的电流

CHARGE_FULL_DESIGN, CHARGE_EMPTY_DESIGN

电池被视为充满/耗尽时的设计电荷值。

ENERGY_FULL_DESIGN, ENERGY_EMPTY_DESIGN

与上述相同,但用于能量。

CHARGE_FULL, CHARGE_EMPTY

这些属性表示“电池充满/耗尽时最后记住的电荷值”。它也可以表示“在给定条件(温度、使用年限)下电池被视为充满/耗尽时的电荷值”。也就是说,这些属性表示实际阈值,而不是设计值。

ENERGY_FULL, ENERGY_EMPTY

与上述相同,但用于能量。

CHARGE_COUNTER

当前电荷计数器(以 µAh 为单位)。这很容易为负;没有空值或满值。它仅对相对的、基于时间的测量有用。

PRECHARGE_CURRENT

充电周期预充电阶段的最大充电电流(通常为电池容量的 20%)。

CHARGE_TERM_CURRENT

充电终止电流。当电池电压高于再充电阈值且充电电流低于此设置时(通常为电池容量的 10%),充电周期终止。

CONSTANT_CHARGE_CURRENT

充电器编程的恒定充电电流。

CONSTANT_CHARGE_CURRENT_MAX

电源对象支持的最大充电电流。

CONSTANT_CHARGE_VOLTAGE

充电器编程的恒定充电电压。

CONSTANT_CHARGE_VOLTAGE_MAX

电源对象支持的最大充电电压。

INPUT_CURRENT_LIMIT

充电器编程的输入电流限制。指示从充电源汲取的电流。

INPUT_VOLTAGE_LIMIT

充电器编程的输入电压限制。指示来自充电源的电压限制。

INPUT_POWER_LIMIT

充电器编程的输入功率限制。指示来自充电源的功率限制。

CHARGE_CONTROL_LIMIT

当前充电控制限制设置

CHARGE_CONTROL_LIMIT_MAX

最大充电控制限制设置

CALIBRATE

电池或库仑计数器校准状态

CAPACITY

以百分比表示的容量。

CAPACITY_ALERT_MIN

以百分比表示的最小容量警报值。

CAPACITY_ALERT_MAX

以百分比表示的最大容量警报值。

CAPACITY_LEVEL

容量级别。这对应于 POWER_SUPPLY_CAPACITY_LEVEL_*。

TEMP

电源的温度。

TEMP_ALERT_MIN

最小电池温度警报。

TEMP_ALERT_MAX

最大电池温度警报。

TEMP_AMBIENT

环境温度。

TEMP_AMBIENT_ALERT_MIN

最小环境温度警报。

TEMP_AMBIENT_ALERT_MAX

最大环境温度警报。

TEMP_MIN

最小可操作温度

TEMP_MAX

最大可操作温度

TIME_TO_EMPTY

电池被视为耗尽时剩余的秒数(即,当电池为负载供电时)

TIME_TO_FULL

电池被视为充满电时剩余的秒数(即,当电池正在充电时)

电池 <-> 外部电源交互

通常,电源同时充当供应者和被供应者。电池就是一个很好的例子。因此,电池通常会关心它们是否由外部供电。

对于这种情况,电源类为电池实现了通知机制。

外部电源(交流电)在“supplied_to”结构成员中列出被供应者(电池)的名称,并且由外部电源发出的每个 power_supply_changed() 调用都将通过 external_power_changed 回调通知被供应者。

设备树电池特性

驱动程序应调用 power_supply_get_battery_info() 从设备树电池节点获取电池特性,该节点在 Documentation/devicetree/bindings/power/supply/battery.yaml 中定义。这在 drivers/power/supply/bq27xxx_battery.c 中实现。

struct power_supply_battery_info 中的属性及其在电池节点中的对应项具有与 enum power_supply_property 中的元素对应的名称,以便在 sysfs 属性和电池节点属性之间保持命名一致性。

问答

POWER_SUPPLY_PROP_XYZ 属性在哪里?

如果您找不到适合您的驱动程序需求的属性,请随时添加它并随您的驱动程序一起发送补丁。

当前可用的属性是当前由编写的驱动程序提供的属性。

未来添加的良好候选者:型号/部件号、周期时间、制造商等。

我有一些非常特殊的属性(例如,电池颜色),我应该将此属性添加到标准属性中吗?

很可能,不应该。如果它有用,可以将此类属性放置在驱动程序本身中。当然,如果所讨论的属性适用于由许多驱动程序提供的大量电池,并且/或者来自某些通用的电池规范/标准,那么它可能是添加到核心属性集的候选者。

假设,我的电池监控芯片/固件不提供百分比的容量,而是提供 charge_{now,full,empty}。我应该在驱动程序内部手动计算百分比容量并注册 CAPACITY 属性吗?关于 time_to_empty/time_to_full 的问题相同。

很可能,不应该。此类旨在导出特定可用硬件直接可测量的属性。

使用一些启发式方法或数学模型来推断不可用的属性不是电池驱动程序的工作范畴。 这样的功能应该被分解出来,实际上,apm_power,这个驱动程序用来在电源类之上提供遗留的APM API,它使用一种简单的启发式方法,基于电池的电量、电流、电压等来近似估计剩余电池容量。但是,功能完备的电池模型很可能根本不属于内核的范畴,因为它需要浮点计算来处理诸如微分方程和卡尔曼滤波器之类的事情。这最好由batteryd/libbattery来处理,但它尚未编写完成。