acpi 事件的各个部分的含义是什么?

acpi 事件的各个部分的含义是什么?

我有一台配备双电池的 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,但没有找到任何有用的信息。

答案1

第一栏是设备类别。这些值来自处理相应 ACPI 设备的内核驱动程序。它们的形式要么是“类”(例如“电池”),要么是“类/子类”(例如“按钮/电源”)。

第二栏是内核用于设备的名称。/sys/bus/acpi/devices/每个 ACPI 设备都有一个匹配的文件夹。这些名称的一般规则是设备类型:实例编号。如中所述内核文档,设备类型是

  1. LNX由内核为 BIOS 的 ACPI 表中描述的特殊设备分配的名称,以 开头。
  2. PnP HID(即插即用硬件 ID;其中一些在 5.6.7 节中定义)ACPI规范并且有一些 列表对于在 ACPI DSDT 表中分配了 HID 的其他设备。
  3. device对于任何其他 ACPI 设备。

实例编号是一个递增计数器,用于区分同一类型的不同设备。例如,您的主电池是PNP0C0A:00,辅助电池是PNP0C0A:01

第三栏是事件代码或“通知值”。它们在第 5.6.6 节中定义ACPI规范00000001表示“设备检查”(设备出现或消失)、00000003“弹出请求”和00000080“电池状态已更改”。

第四栏是内核驱动程序生成的补充值。此列的含义因事件代码、驱动程序和设备类型的任意组合而异。 Linux ACPI 电池驱动程序将“电池状态更改”事件的值设置为1“存在”和0“不存在”。

相关内容