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) 都代表電池的“容量”,所以此類區分了這些術語。 不要混淆它們!
|
字尾
- _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 處理。