sysfs 檔案命名和資料格式標準¶
libsensors 庫透過 sysfs 介面提供對原始感測器資料的訪問。自 lm-sensors 3.0.0 起,libsensors 完全與晶片無關。它假定所有核心驅動都實現了本文件中描述的標準 sysfs 介面。這使得新增或更新對任何給定晶片的支援都非常容易,因為 libsensors 和使用它的應用程式無需修改。與 lm-sensors 2 相比,這是一個重大改進。
請注意,主機板上與感測器晶片的連線方式差異很大。沒有標準可以確保,例如,第二個溫度感測器連線到 CPU,或者第二個風扇位於 CPU 上。此外,晶片報告的一些值需要經過計算才能完全理解。例如,大多數晶片只能測量 0 到 +4V 之間的電壓。其他電壓則透過外部電阻縮放到該範圍。由於這些電阻的值可能因主機板而異,因此轉換不能硬編碼到驅動程式中,必須在使用者空間中完成。
因此,即使我們致力於開發一個與晶片無關的 libsensors,它仍然需要一個配置檔案(例如 /etc/sensors.conf)來進行正確的值轉換、輸入標籤和隱藏未使用的輸入。
一些程式使用的另一種方法是直接訪問 sysfs 檔案。本文件簡要描述了驅動程式遵循的標準,以便應用程式能夠以簡單一致的方式掃描條目並訪問這些資料。儘管如此,此類程式必須實現輸入的轉換、標籤和隱藏。因此,仍然不建議繞過庫。
每個晶片在 sysfs /sys/devices 樹中都有自己的目錄。要查詢所有感測器晶片,更簡單的方法是遵循 /sys/class/hwmon/hwmon* 中的裝置符號連結。
在 lm-sensors 3.0.0 之前,libsensors 在“物理”裝置目錄中查詢硬體監控屬性。自 lm-sensors 3.0.1 起,hwmon“類”裝置目錄中找到的屬性也受支援。複雜的驅動程式(例如,多功能晶片的驅動程式)可能希望利用此功能來避免名稱空間汙染。唯一的缺點是舊版本的 libsensors 不支援該驅動程式。
所有 sysfs 值都是定點數。
每個檔案只有一個值,這與舊的 /proc 規範不同。檔案命名的通用方案是:<type><number>_<item>。感測器晶片的常見型別有“in”(電壓)、“temp”(溫度)和“fan”(風扇)。常見專案有“input”(測量值)、“max”(高閾值)、“min”(低閾值)。編號通常從 1 開始,除了電壓從 0 開始(因為大多數資料表都使用此編號)。對於可以出現多次的元素,即使給定型別在特定晶片上只有一個元素,也總是使用數字。其他檔案不引用特定元素,因此它們只有一個簡單的名稱,沒有數字。
警報是直接從晶片讀取的指示。驅動程式不進行讀數與閾值的比較。這允許捕獲讀數之間的違規併發出警報。警報的確切定義(例如,是否必須達到或超過閾值才能觸發警報)取決於晶片。
設定 hwmon sysfs 屬性的值時,必須寫入所需值的字串表示形式,請注意,非數字的字串將被解釋為 0!有關寫入字串如何解釋的更多資訊,請參閱此檔案末尾的“sysfs 屬性寫入解釋”部分。
屬性訪問¶
硬體監控 sysfs 屬性由不受限制的使用者空間應用程式顯示。因此,所有標準 ABI 屬性都應為全域性可讀。可寫的標準 ABI 屬性應僅對特權使用者可寫。
[0-*] |
表示從 0 開始的任何正數 |
[1-*] |
表示從 1 開始的任何正數 |
RO |
只讀值 |
WO |
只寫值 |
RW |
讀/寫值 |
讀/寫值對於某些晶片可能是隻讀的,具體取決於硬體實現。
所有條目(名稱除外)都是可選的,並且只有在晶片具有該功能時才應在給定驅動程式中建立。
有關屬性的完整描述,請參閱ABI 檔案測試/sysfs-class-hwmon。
全域性屬性¶
- name
晶片名稱。
- label
一個描述性標籤,允許在系統中唯一標識裝置。
- update_interval
晶片更新讀數的間隔。
電壓¶
- in[0-*]_min
電壓最小值。
- in[0-*]_lcrit
電壓臨界最小值。
- in[0-*]_max
電壓最大值。
- in[0-*]_crit
電壓臨界最大值。
- in[0-*]_input
電壓輸入值。
- in[0-*]_average
平均電壓
- in[0-*]_lowest
歷史最低電壓
- in[0-*]_highest
歷史最高電壓
- in[0-*]_reset_history
重置 inX_lowest 和 inX_highest
- in_reset_history
重置所有感測器的 inX_lowest 和 inX_highest
- in[0-*]_label
建議的電壓通道標籤。
- in[0-*]_enable
啟用或停用感測器。
- cpu[0-*]_vid
CPU 核心參考電壓。
- vrm
電壓調節模組版本號。
- in[0-*]_rated_min
額定最小電壓。
- in[0-*]_rated_max
額定最大電壓。
另請參閱“警報”部分,瞭解與電壓相關的狀態標誌。
風扇¶
- fan[1-*]_min
風扇最小值
- fan[1-*]_max
風扇最大值
- fan[1-*]_input
風扇輸入值。
- fan[1-*]_div
風扇分頻器。
- fan[1-*]_pulses
每轉風扇的轉速計脈衝數。
- fan[1-*]_target
期望的風扇速度
- fan[1-*]_label
建議的風扇通道標籤。
- fan[1-*]_enable
啟用或停用感測器。
另請參閱“警報”部分,瞭解與風扇相關的狀態標誌。
PWM¶
- pwm[1-*]
脈衝寬度調製風扇控制。
- pwm[1-*]_enable
風扇速度控制方法。
- pwm[1-*]_mode
直流或脈衝寬度調製。
- pwm[1-*]_freq
基本 PWM 頻率,單位 Hz。
- pwm[1-*]_auto_channels_temp
選擇在自動模式下哪些溫度通道影響此 PWM 輸出。
- pwm[1-*]_auto_point[1-*]_pwm / pwm[1-*]_auto_point[1-*]_temp / pwm[1-*]_auto_point[1-*]_temp_hyst
定義 PWM 與溫度曲線。
- temp[1-*]_auto_point[1-*]_pwm / temp[1-*]_auto_point[1-*]_temp / temp[1-*]_auto_point[1-*]_temp_hyst
定義 PWM 與溫度曲線。
還有第三種情況,即跳變點與 PWM 輸出通道和溫度通道都相關聯:PWM 值與 PWM 輸出通道相關聯,而溫度值與溫度通道相關聯。在這種情況下,結果由溫度輸入和 PWM 輸出之間的對映決定。當多個溫度輸入對映到給定 PWM 輸出時,這會導致多個候選 PWM 值。實際結果取決於晶片,但通常最高的候選值(最快的風扇速度)勝出。
溫度¶
- temp[1-*]_type
感測器型別選擇。
- temp[1-*]_max
溫度最大值。
- temp[1-*]_min
溫度最小值。
- temp[1-*]_max_hyst
最大限制的溫度滯後值。
- temp[1-*]_min_hyst
最小限制的溫度滯後值。
- temp[1-*]_input
溫度輸入值。
- temp[1-*]_crit
溫度臨界最大值,通常高於相應的 temp_max 值。
- temp[1-*]_crit_hyst
臨界限制的溫度滯後值。
- temp[1-*]_emergency
溫度緊急最大值,適用於支援兩個以上上限溫度的晶片。
- temp[1-*]_emergency_hyst
緊急限制的溫度滯後值。
- temp[1-*]_lcrit
溫度臨界最小值,通常低於相應的 temp_min 值。
- temp[1-*]_lcrit_hyst
臨界最小值限制的溫度滯後值。
- temp[1-*]_offset
晶片新增到溫度讀數中的溫度偏移量。
- temp[1-*]_label
建議的溫度通道標籤。
- temp[1-*]_lowest
歷史最低溫度
- temp[1-*]_highest
歷史最高溫度
- temp[1-*]_reset_history
重置 temp_lowest 和 temp_highest
- temp_reset_history
重置所有感測器的 temp_lowest 和 temp_highest
- temp[1-*]_enable
啟用或停用感測器。
- temp[1-*]_rated_min
額定最小溫度。
- temp[1-*]_rated_max
額定最大溫度。
有些晶片使用外部熱敏電阻和 ADC 測量溫度,並將溫度測量結果報告為電壓。將此電壓轉換回溫度(或反向用於限制)需要核心中不可用的數學函式,因此轉換必須在使用者空間中進行。對於這些晶片,上述所有 temp* 檔案應包含以毫伏而不是毫攝氏度表示的值。換句話說,這些溫度通道由驅動程式作為電壓通道處理。
另請參閱“警報”部分,瞭解與溫度相關的狀態標誌。
電流¶
- curr[1-*]_max
電流最大值。
- curr[1-*]_min
電流最小值。
- curr[1-*]_lcrit
電流臨界低值
- curr[1-*]_crit
電流臨界高值。
- curr[1-*]_input
電流輸入值。
- curr[1-*]_average
平均電流使用量。
- curr[1-*]_lowest
歷史最低電流。
- curr[1-*]_highest
歷史最高電流。
- curr[1-*]_reset_history
重置 currX_lowest 和 currX_highest
WO
- curr_reset_history
重置所有感測器的 currX_lowest 和 currX_highest。
- curr[1-*]_enable
啟用或停用感測器。
- curr[1-*]_rated_min
額定最小電流。
- curr[1-*]_rated_max
額定最大電流。
另請參閱“警報”部分,瞭解與電流相關的狀態標誌。
功率¶
- power[1-*]_average
平均功率使用量。
- power[1-*]_average_interval
功率使用平均間隔。
- power[1-*]_average_interval_max
最大功率使用平均間隔。
- power[1-*]_average_interval_min
最小功率使用平均間隔。
- power[1-*]_average_highest
歷史平均最大功率使用量
- power[1-*]_average_lowest
歷史平均最小功率使用量
- power[1-*]_average_max
當功率使用量上升到此值以上時,會向 power[1-*]_average 傳送輪詢通知。
- power[1-*]_average_min
當功率使用量下降到此值以下時,會向 power[1-*]_average 傳送輪詢通知。
- power[1-*]_input
瞬時功率使用量。
- power[1-*]_input_highest
歷史最大功率使用量
- power[1-*]_input_lowest
歷史最小功率使用量。
- power[1-*]_reset_history
重置 input_highest、input_lowest、average_highest 和 average_lowest。
- power[1-*]_accuracy
功率計的準確度。
- power[1-*]_cap
如果功率使用量上升到此限制以上,系統應採取措施降低功率使用量。
- power[1-*]_cap_hyst
圍繞功率限制和通知構建的滯後裕度。
- power[1-*]_cap_max
可設定的最大功率限制。
- power[1-*]_cap_min
可設定的最小功率限制。
- power[1-*]_max
最大功率。
- power[1-*]_crit
臨界最大功率。
如果功率上升到或超過此限制,系統應採取劇烈措施降低功耗,例如系統關機或強制某些裝置斷電。
單位:微瓦 (microWatt)
RW
- power[1-*]_enable
啟用或停用感測器。
停用時,感測器讀取將返回 -ENODATA。
1:啟用
0:停用
RW
- power[1-*]_rated_min
額定最小功率。
單位:微瓦 (microWatt)
RO
- power[1-*]_rated_max
額定最大功率。
單位:微瓦 (microWatt)
RO
另請參閱“警報”部分,瞭解與功率讀數相關的狀態標誌。
能量¶
- energy[1-*]_input
累計能量使用量
單位:微焦耳 (microJoule)
RO
- energy[1-*]_enable
啟用或停用感測器。
停用時,感測器讀取將返回 -ENODATA。
1:啟用
0:停用
RW
溼度¶
- humidity[1-*]_input
溼度。
- humidity[1-*]_enable
啟用或停用感測器。
- humidity[1-*]_rated_min
額定最小溼度。
- humidity[1-*]_rated_max
額定最大溼度。
警報¶
每個通道或限制可能有一個關聯的警報檔案,其中包含一個布林值。1 表示存在警報條件,0 表示沒有警報。
通常,給定晶片會使用通道相關警報或限制相關警報,而不會同時使用兩者。驅動程式應僅反映硬體實現。
`in[0-*]_alarm`、`curr[1-*]_alarm`、`power[1-*]_alarm`、`fan[1-*]_alarm`、`temp[1-*]_alarm` |
通道警報
|
或者
`in[0-*]_min_alarm`、`in[0-*]_max_alarm`、`in[0-*]_lcrit_alarm`、`in[0-*]_crit_alarm`、`curr[1-*]_min_alarm`、`curr[1-*]_max_alarm`、`curr[1-*]_lcrit_alarm`、`curr[1-*]_crit_alarm`、`power[1-*]_cap_alarm`、`power[1-*]_max_alarm`、`power[1-*]_crit_alarm`、`fan[1-*]_min_alarm`、`fan[1-*]_max_alarm`、`temp[1-*]_min_alarm`、`temp[1-*]_max_alarm`、`temp[1-*]_lcrit_alarm`、`temp[1-*]_crit_alarm`、`temp[1-*]_emergency_alarm` |
限制警報
RO |
每個輸入通道可能有一個關聯的故障檔案。這可用於通知開路二極體、未連線的風扇等(如果硬體支援)。當此布林值為 1 時,該通道的測量值不應被信任。
- fan[1-*]_fault / temp[1-*]_fault
輸入故障條件。
一些晶片還提供在發生警報時發出蜂鳴聲的可能性
- beep_enable
主蜂鳴啟用。
- in[0-*]_beep、curr[1-*]_beep、fan[1-*]_beep、temp[1-*]_beep、
通道蜂鳴。
理論上,晶片可以提供每個限制的蜂鳴遮蔽,但到目前為止尚未見到此類晶片。
舊驅動程式為警報和蜂鳴提供了不同的、非標準介面。這些介面檔案已被棄用,但將保留以保持相容性
- alarms
警報位掩碼。
- beep_mask
蜂鳴位掩碼。
入侵檢測¶
- intrusion[0-*]_alarm
機箱入侵檢測。
- intrusion[0-*]_beep
機箱入侵蜂鳴。
平均取樣配置¶
允許讀取 {in,power,curr,temp}_average 值的裝置可能會匯出屬性來控制用於計算平均值的樣本數。
samples |
設定所有測量型別的平均樣本數。 RW |
in_samples power_samples curr_samples temp_samples |
設定特定測量型別的平均樣本數。 請注意,在某些裝置上,無法將所有這些值設定為不同的值,因此更改其中一個也可能會更改其他一些值。 RW |
sysfs 屬性寫入解釋¶
hwmon sysfs 屬性始終包含數字,因此首先要做的是將輸入轉換為數字,根據數字是否可以是負數有兩種方法
unsigned long u = simple_strtoul(buf, NULL, 10);
long s = simple_strtol(buf, NULL, 10);
其中 buf 是核心傳遞的使用者輸入緩衝區。請注意,我們不使用 strto[u]l 的第二個引數,因此無法判斷何時返回 0,是確實為 0 還是由無效輸入引起。這是有意為之的,因為在所有地方檢查這會給核心增加大量程式碼。
請注意,將轉換後的值始終儲存在 unsigned long 或 long 中非常重要,這樣在進行任何進一步檢查之前就不會發生迴繞。
在將輸入字串轉換為 (unsigned) long 後,應檢查其值是否可接受。在檢查值有效性之前,請注意對值進行進一步轉換,因為這些轉換仍可能在檢查之前導致迴繞。例如,不要將結果相乘,並且只有在加/減之前已進行除法運算時才進行加/減。
如果發現某個值無效,如何處理取決於要設定的 sysfs 屬性的型別。如果它是連續設定,例如 tempX_max 或 inX_max 屬性,則應使用 clamp_val(value, min_limit, max_limit) 將值鉗位到其限制。如果它不是連續的,例如 tempX_type,則當寫入無效值時,應返回 -EINVAL。
示例1,temp1_max,暫存器是帶符號的 8 位值(-128 - 127 攝氏度)
long v = simple_strtol(buf, NULL, 10) / 1000;
v = clamp_val(v, -128, 127);
/* write v to register */
示例2,風扇分頻器設定,有效值為 2、4 和 8
unsigned long v = simple_strtoul(buf, NULL, 10);
switch (v) {
case 2: v = 1; break;
case 4: v = 2; break;
case 8: v = 3; break;
default:
return -EINVAL;
}
/* write v to register */