ACPI modules (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


简介

从 kernel 2.6.20.7 开始,acpi 模块化了, 以避免一些机器上面产生的 acpi 的问题。

本文是对内核的 acpi 模块的一个简单介绍,这些模块可以激活一些特别的 acpi 函数或者添加一些信息到 /proc 下面,以使得 acpid 或者其他监视程序可以处理 acpi 事件。

目前有哪些模块?

  • ac (电源连接情况) => 在启动的时候由 initscripts-0.8-7 自动加载
  • asus_acpi (使用asus/medion 笔记本电脑的时候有用)
  • battery (电池状态) => 在启动的时候由 initscripts-0.8-7 自动加载
  • bay (bay status)
  • button (捕获按键事件,比如合上显示器或者按下电源按钮) => 在启动的时候由 initscripts-0.8-7 自动加载
  • container (container status)
  • dock (docking station status) 有些笔记本可以在下面附加一个dock来提供一些额外的功能,比如sony、dell的很多笔记本都有这个接口。
  • fan (风扇状态) => 在启动的时候由 initscripts-0.8-7 自动加载
  • hotkey (笔记本电脑的热键)
  • i2c_ec (EC SMBus 驱动)
  • ibm_acpi (使用IBM笔记本电脑的时候有用)(2.6.22后是thinkpad_acpi)
  • processor (CPU处理器状态) => 集成到了 kernel 2.6.20.7-2 中
  • sbs (smart battery status)
  • thermal (status of thermal sensors) => 集成到了 kernel 2.6.20.7-2 中
  • toshiba_acpi (使用toshiba笔记本电脑的时候有用)
  • video (视频设备的状态)

当前正在使用的内核支持的acpi模块列表可以用下面命令查看:

# ls -l /usr/lib/modules/$(uname -r)/kernel/drivers/acpi
total 112
-rw-r--r-- 1 root root  2808 Aug 29 23:58 ac.ko.gz
-rw-r--r-- 1 root root  3021 Aug 29 23:58 acpi_ipmi.ko.gz
-rw-r--r-- 1 root root  3354 Aug 29 23:58 acpi_memhotplug.ko.gz
-rw-r--r-- 1 root root  4628 Aug 29 23:58 acpi_pad.ko.gz
drwxr-xr-x 2 root root  4096 Aug 29 23:59 apei
-rw-r--r-- 1 root root  7120 Aug 29 23:58 battery.ko.gz
-rw-r--r-- 1 root root  3700 Aug 29 23:58 button.ko.gz
-rw-r--r-- 1 root root  2181 Aug 29 23:58 container.ko.gz
-rw-r--r-- 1 root root  1525 Aug 29 23:58 custom_method.ko.gz
-rw-r--r-- 1 root root  1909 Aug 29 23:58 ec_sys.ko.gz
-rw-r--r-- 1 root root  2001 Aug 29 23:58 fan.ko.gz
-rw-r--r-- 1 root root  1532 Aug 29 23:58 hed.ko.gz
-rw-r--r-- 1 root root  3241 Aug 29 23:58 pci_slot.ko.gz
-rw-r--r-- 1 root root 17742 Aug 29 23:58 processor.ko.gz
-rw-r--r-- 1 root root  3073 Aug 29 23:58 sbshc.ko.gz
-rw-r--r-- 1 root root  7098 Aug 29 23:58 sbs.ko.gz
-rw-r--r-- 1 root root  6311 Aug 29 23:58 thermal.ko.gz
-rw-r--r-- 1 root root  8891 Aug 29 23:58 video.ko.gz

如何选择正确的模块

你只能自己来测试哪个模块在你机器上面能正常工作:

# modprobe <yourmodule>

然后使用下面命令检查模块是否可用

# dmesg
提示: 可以用 grep 进行过滤
 # dmesg | grep acpi
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x04] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x05] enabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    5.066752] ACPI: acpi_idle yielding to intel_idle
[    5.438998] acpi device:04: registered as cooling_device4

把需要的模块按照 man modules-load.d 加入配置文件/etc/modules-load.d.

问题解决

DSDT 修正

如果装入模块后电源管理问题仍然存在,可能是 Linux 兼容性较差的DSDT导致。请参阅DSDTWiki 文档。

笔记本 ACPI 修正

如果遇到 ACPI: EC: input buffer is not empty, aborting transaction。 可能是 acpi 模块导致。有两个解决方法:

1. "简单" 在 GRUB 的 menu.lst 或者 grub.cfg 中的内核行加入 acpi=off,这将禁用所有 acpi 功能,包括电池充电。

2. "难" 用 bugs.launchpad.net 中的补丁重新编译内核。