Linux 电源类

概要

电源类用于向用户空间表示电池、UPS、AC 或 DC 电源的属性。

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

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

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

它还与 LED 框架集成,目的是提供电池充电/充满状态以及 AC/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

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

电池 <-> 外部电源交互

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

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

外部电源 (AC) 在“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 属性和电池节点属性之间保持命名一致性。

QA

POWER_SUPPLY_PROP_XYZ 属性在哪里?

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

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

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

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

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

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

最有可能的是,不应该。 此类的设计目的是导出特定硬件直接可测量的属性。

使用一些启发式方法或数学模型来推断不可用的属性不是电池驱动程序的工作。 这种功能应该被分离出来,事实上,apm_power,即在电源类之上为旧 APM API 服务的驱动程序,使用一种简单的启发式方法来近似剩余电池容量,基于其电荷、电流、电压等。 但功能齐全的电池模型可能根本不是内核的主题,因为它需要浮点计算来处理微分方程和卡尔曼滤波器之类的事情。 这最好由尚未编写的 batteryd/libbattery 处理。