Gentoo Linux on T43 (15) Fn + Keys
对于Linux 对Thinkpad Fn 组合键的支持的了解一直比较模糊,有很多内核中的支持以及软件包,不太清楚具体的分工以及关系,今天查阅了一些资料,试图清理一下自己的思路,也把自己的配置共享一下。
下面给一些包及内核Module加一些注释:
内核Thinkpad ACPI
在2.6.20 中叫做IBM ACPI,这里是它的项目主页。如果编译为module,名字为thinkpad_acpi,它的功能是把Fn 组合按键的事件export 到/proc/acpi(在kernel-2.6.24 中应该选择此项:[*] Deprecated /proc/acpi/event support ),但其并不负责处理事件,需要其它userspace 程序来处理。
app-laptop/tp_smapi
来自Tpctl 项目 ,将thinkpad 硬件的信息export 到sysfs,供其它程序使用,目前主要实现了电池管理和HDAPS的功能。Fn keys应该不需要这个软件包,但我一直使用patched kernel + tp_smapi 来驱动HDAPS。
包含moduels:
hdaps thinkpad_ec tp_smapi
app-laptop/thinkpad
也来自Tpctl 项目 ,但目前已经被上面的tp_smapi 所取代,除非使用很古老的笔记本(before 2001),应该不需要这个软件包。
sys-power/acpid
acpid需要配合thinkpad-acpi使用,它默认读取/proc/acpi/event 中的条目,并将其传递给事件处理脚本,作出相应动作,比如关闭屏幕、待机等。 这些条目由/etc/acpi/events/default 捕获,并传递给/etc/acpi/default.sh 处理,但默认的/etc/acpi/default.sh 功能十分有限,必须自己修改。
配置Fn+Keys
这里已经有人写好了一些常用脚本,我根据他的内容整理了一份default.sh,目前可以处理Fn+F3(关屏), Fn+F4(Suspend to ram), Fn+F5(开关蓝牙), Fn+F6(开关wifi),Fn+F12(Suspend to disk) 。这个脚本会用到radeontool,如果系统没有这么命令,merge它(也可以使用xset,但需要自己更改default.sh)。
# emerge -av1 radeontool
另外,我注释了脚本中的xosd 命令,如果你有GUI 程序需要显示Fn控制程序的状态,那么可以去掉注释(需要merge xosd)
调试
共享一下调试Fn 组合键的方法,thinkpad_acpi 会将按键事件写入/proc/acpi/event,但acpid 运行时我们无法读取这个文件,先停掉服务:
# /etc/init.d/acpid stop
然后cat这个文件(确保module thinkpad_acpi 已经装载,或者内建在内核)
# cat /proc/acpi/event
接着按Fn 组合键,console 中会打印出事件条目,括号中是我的注释。default.sh 将解析这些条目,并调用不同的命令进行处理。
ibm/hotkey HKEY 00000080 00001001 (Fn+F1) ibm/hotkey HKEY 00000080 00001002 (Fn+..) ibm/hotkey HKEY 00000080 00001003 ibm/hotkey HKEY 00000080 00001004 ibm/hotkey HKEY 00000080 00001005 ibm/hotkey HKEY 00000080 00001006 ibm/hotkey HKEY 00000080 00001007 ibm/hotkey HKEY 00000080 00001008 ibm/hotkey HKEY 00000080 00001009 ibm/hotkey HKEY 00000080 0000100a ibm/hotkey HKEY 00000080 0000100b ibm/hotkey HKEY 00000080 0000100c (Fn+F12) ibm/hotkey HKEY 00000080 00001018 (Access IBM) ibm/hotkey HKEY 00000080 00001014 (Fn+Space)
在我这里,调整屏幕亮度、屏幕灯、音量几个按键thinkpad_acpi 似乎是捕获不到的,event 没有输出,但功能正常,是不是xmodmap 处理了?
另外,内核中还有一个ACPI Button 支持,如果编译为module,在rmmod thinkpad_acpi之后,并且已经装在button,诸如Fn+F4 的事件会被其捕获,同样写入/proc/acpi/event:
button/sleep SLPB 00000080 00000001 button/sleep SLPB 00000080 00000002
下载
使用default.sh 覆盖acpid 默认的文件/etc/acpi/default.sh 即可,/etc/acpi/events/default 不用更改。
更新 2008-04-09
今天偶然发现hal (0.5.10)中已经包含全系列thinkpad 型号hotkey的policy 配置文件,包括最新的T/X 6系列,这个文件位于:/usr/share/hal/fdi/information/10freedesktop/30-keymap-module-thinkpad-acpi.fdi,对于T4 系列,有如下定义:
<match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains="T4">
<append key="input.keymap.data" type="strlist">0x02:screenlock</append> <!-- Fn+F3 lock -->
<append key="input.keymap.data" type="strlist">0x03:sleep</append> <!-- Fn+F4 suspend -->
<append key="input.keymap.data" type="strlist">0x04:radio</append> <!-- Fn+F5 switch radio -->
<append key="input.keymap.data" type="strlist">0x06:switchvideomode</append> <!-- Fn+F7 switch video output device -->
<append key="input.keymap.data" type="strlist">0x0b:suspend</append> <!-- Fn+F12 hibernate -->
<append key="input.keymap.data" type="strlist">0x0f:brightnessup</append> <!-- Fn+Home -->
<append key="input.keymap.data" type="strlist">0x10:brightnessdown</append> <!-- Fn+End -->
<append key="input.keymap.data" type="strlist">0x13:zoom</append> <!-- Fn+Space -->
<append key="input.keymap.data" type="strlist">0x17:vendor</append> <!-- ThinkPad/ThinkVantage button -->
<append key="info.capabilities" type="strlist">input.keymap</append>
</match>
我猜想如果使用这个配置文件,应该可以免去上面手工配置Fn keys的步骤,或者不再使用/proc/acpi/event 这个interface,代之使用经由hal 提供的事件绑定?
尝试将其copy 至/etc/hal/fdi/policy 或者/usr/share/hal/fdi/policy/10osvendor,然后重启/etc/init.d/hald 服务,同时关闭了可能与其冲突的acpid 服务,但并没有预期的作用。查看lshal,似乎也都符合配置文件:
$ lshal |grep input.product
input.product = 'ThinkPad Extra Buttons' (string) ...
$ lshal |grep system.hardware.vendor
system.hardware.vendor = 'IBM' (string)
$ lshal |grep system.hardware.version
system.hardware.version = 'ThinkPad T43' (string)
继续关注这个问题。
下面添加了一篇Gentoo 配置的参考文章。