Linux系统处理laptop hotkeys的方式

  我这几天的学习,要想让笔记本上的hotkey完全能够正常工作,要许多方面一起协同才行。   1,硬件厂商在bios中对linux的支持程度。我的机器在启动后,用dmesg| grep -i acpi,就会发现在load acpi 的时候有两三个错误。我想这会导致一些hotkey在系统中,用那些acpi_listen或者xev抓不到按键,即没有输出相应的 keycode。这需要修改dsdt了。硬件厂商不支持,只能做一些hacking的工作,搞过嵌入式驱动开发的朋友,应该都不在话下。风险有,细心就能 对付。

  2,linux kernel对ACPI的支持,现在各种笔记本,如ibm, sony, asus, dell, hp,都有对应_acpi的项目,也会集成到kernel中去,例如debian, linux-image-2.6.21-2-686种就有ibm_acpi, asus_acpi, toshiba_acpi,但没有sony_acpi,这些都是各种laptop的acpi的driver。我的是asus的,实际上内核使用的就是 acp4asus项目提供的,我不得不停掉kernel自带的,去下载编译新的acpi4asus的driver。ACPI应该管理hotkeys,屏幕 亮度,fan,cpu speedstep,cpu temp。

  3,有了driver,只是提供了基本的支持,还需要一个用户空间运行的daemon程序来获得按键的事件,比如现在的acpid,acpi- support提供了acpid响应事件后处理的相关脚本。这种机制就是event/action 的像那个键/值对。问题是,新的acpi driver会导致acpid不能使用,因为kernel自带的driver可能会把信息写到/proc/acpi下,而新的会放到/sys/下,这样 acpid就不能处理按键的事件了(acpi-support的脚本不支持了,因为它们是去找/proc的)。例如,新的acpi4asus(0.42, kernel自带在0.40之前),就是这样做的,也新提供了自己的daemon,叫asus_acpid,而且,不同的acpid daemon之间会有冲突。如,它们都需要使用/var/run/acpid.socket。我现在的系统里面acpid管Fn + F1/F5/F7,而asus_acpid管Fn + F3/F4/F9/F10/F11/F12。

  4,响应了按键事件后的处理,完全是自己配置的事情了,例如完全可以不把Fn+F1配置成休眠的。不过要实现具体的功能,是和具体的驱动/工具有关系的,例如,

  fn +f1,控制休眠,通过suspend2ram, suspend2disk实现。

  Fn +F2,如果仅仅启停wireless led的话,很简单,因为这是电源管理里面的,如果要实际的控制无线的驱动,就需要和ipw3945建立联系了,而这个工作在apcid中并不好做,因为 它不知道具体的无线驱动是什么啊。windows下asus提供了atk0100驱动和wireless的驱动,自然它们可以很容易的整合在一起;

  fn + f3/f4,完全是自己定义的了,我的机器上是启动iceweasel和icedove,很简单的在事件处理脚本中写iceweasel &就可以了。

  Fn +F5/F6,是调整屏幕亮度的,它需要向/proc/,或者/sys下echo 一些值,这就不能简单地写在脚本里面了,一般要用dbus;

  Fn +f7,关闭屏幕的电源,这是acpi直接提供的。

  fn +f8 ,切换扩展显示器,这个没有硬件测试。

  fn +f9,启停touchpad,先要在xorg中写一个支持,然后在事件处理脚本中用synclient,这个工具也是所有用户都可以用的。

  fn + F10,启停声音,Fn+ F11/F12是调整音量的,这个在acpid的事件处理脚本中,就是调用amixer来设置的,而这个命令是任何一个用户都可以调用的,不过 ausu_apcid的处理脚本中默认是通过Front来改变音量的,而我的声卡驱动需要通过PCM来设置,就需要修改了;

  所以,就是hardware vendor –> linux kernel