工作原理
固件通过 ACPI 表描述操作系统无法自行发现的设备,例如电池、按钮、传感器、I²C 控制器或 TPM。每个设备都有一个硬件标识符(_HID),由制造商前缀和该制造商选定的四位十六进制数字组成。
前缀由 UEFI Forum 在两个注册清单中分配:三个字母的 PNP ID 注册清单和四个字符的 ACPI ID 注册清单。本工具会在这两个注册清单中查找前缀;对于由 Microsoft 和 ACPI 规范定义的标准标识符,还会告诉您是什么设备。
示例
ACPI\PNP0A08Microsoft — PCI Express Root BridgeWindows 设备管理器的格式。PNP0xxx 是任何制造商都可以使用的通用标识符。ACPI\VEN_INT&DEV_33A1Intel Corporation — Intel Power Engine Plug-in (Modern Standby)Windows 在硬件 ID 中使用的 VEN_/DEV_ 形式。Intel 在 ACPI ID 注册清单出现之前就已使用 INT 前缀。Name (_HID, EisaId ("PNP0C0A"))PNP0C0A — Control Method Battery — EisaId 0x0A0CD041反汇编后的 DSDT 表中的一行。本工具也接受 EisaId 生成的压缩整数。10EC5640Realtek Semiconductor Co., Ltd.部分制造商使用 PCI-SIG 分配给它们的供应商 ID 作为前缀;此时制造商信息来自 PCI 目录。使用场景
- 识别设备管理器中硬件 ID 以 ACPI\ 开头的未知设备。
- 根据 _HID 为笔记本电脑的传感器、按钮或 I²C 控制器查找正确的驱动程序。
- 在调试固件或编写 ACPI 补丁时,解读 DSDT 或 SSDT 表中声明的设备。
- 了解显示器在 EDID 中报告的三字母制造商代码对应哪家公司。
常见问题
在哪里可以找到设备的 ACPI 标识符?
在 Windows 中,在设备管理器中打开设备的属性,在“详细信息”选项卡的 "硬件 Id" 属性中查看。在 Linux 中,每个设备都显示为 /sys/bus/acpi/devices 下名称中带有其标识符的文件夹,该文件夹中的 hid 文件也包含该标识符。在用 acpidump 和 iasl 反汇编的固件表中,它是每个设备的 _HID 对象。
为什么能找到制造商却找不到设备?
UEFI Forum 的注册清单只分配前缀。其后四位数字的含义由各制造商自行决定,并没有像 PCI 或 USB 那样的公开目录。只有标准标识符(如 Microsoft 的 PNP0xxx 或规范中的 ACPI00xx)以及一些广泛使用的标识符,才能知道对应的设备。
PNP ID 和 ACPI ID 有什么区别?
PNP ID 的前缀为三个字母,源自 20 世纪 90 年代的即插即用;同样的代码也用于在 EDID 中标识显示器制造商。ACPI ID 的前缀为四个字母或数字,是当前使用的格式。两者在前缀之后都带有四位十六进制数字。
什么是压缩的 EisaId?
在 ASL 语言中,EisaId 宏会将 PNP ID 转换为 32 位整数:每个字母占 5 位,产品编号占随后的两个字节。因此,反汇编表时有时会看到 0x0A0CD041 这样的数字,而不是 PNP0C0A。本工具接受这种数字,并显示任意 PNP ID 的压缩形式。
数据多久更新一次?
本工具使用 UEFI Forum 发布的 ACPI ID 和 PNP ID 注册清单的副本,并定期更新。结果旁会显示该副本的日期以及前缀的批准日期。