Linux

acpi 事件的各個部分是什麼意思?

  • December 19, 2015

我有一台帶雙電池的 ThinkPad 筆記型電腦,我想為 GNOME 編寫一個指示器應用程序,它在插入/拔出外部電池時執行一個操作。要讀取這些事件,我連接到 acpid 套接字,如下所示:

#!/usr/bin/env python3
import socket

ACPID_SOCKETFILE = "/var/run/acpid.socket"
RECV_SIZE = 4096

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(ACPID_SOCKETFILE)

try:
   while True:
       data = s.recv(RECV_SIZE)
       print(repr(data))
except:
   s.close()
   raise

我得到如下輸出:

b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'

我想第四列是1電池是否插入,以及0是否拔出。但是第二列和第三列到底是什麼意思呢?我試過man acpid了,但沒有找到任何有用的資訊。

第一是設備類。這些值來自處理相應 ACPI 設備的核心驅動程序。它們是“類”(例如“電池”)或“類/子類”(例如“按鈕/電源”)的形式。

第二是核心用於設備的名稱。每個 ACPI 設備都有一個匹配的文件夾/sys/bus/acpi/devices/。這些名稱的一般規則是設備類型**:**實例編號。如核心文件中所述,設備類型是

  1. 由核心分配的名稱,以 , 開頭LNX,用於 BIOS 的 ACPI 表中描述的特殊設備。
  2. 用於在 ACPI DSDT 表中分配了 HID 的其他設備的 PnP HID(即插即用硬體 ID;其中一些在ACPI 規範的第 5.6.7 節中定義,並且網際網路上有一些 列表)。
  3. device對於任何其他 ACPI 設備。

實例編號是一個遞增計數器,用於區分相同類型的不同設備。例如,您的主電池是PNP0C0A:00,而您的輔助電池是PNP0C0A:01

第三是事件程式碼或“通知值”。它們在ACPI 規範第 5.6.6 節中定義。00000001表示“設備檢查”(設備出現或消失)、00000003“彈出請求”和00000080“電池狀態已更改”。

第四列是核心驅動生成的補充值。此列的含義因事件程式碼、驅動程序和設備類型的任意組合而異。Linux ACPI 電池驅動程序將“電池狀態已更改”事件的值設置1為“存在”和0“不存在”。

引用自:https://unix.stackexchange.com/questions/218533