• thinkpad_acpi on R52 laptop

    2007-07-29

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://peterpannju.blogbus.com/logs/7173241.html

     

        哇哇哇哇,看看我一个晚上都干了些什么!

        搞定了我小黑的休眠(sleep)支持,屏幕关闭,并且让原来ibm的热键和合上屏幕的动作全部得到正确相应!

        盛夏一个无比炎热美好的不眠夜!

    IBM ThinkPad R52热键的设置:
    -------------------------------------------

        1. 首先确保已经正确安装acpid。同时,我将内核的thinkpad_acpi编成了模块,并且在rc.conf中自动加载。在/etc/modprobe.conf添加

            options ibm_acpi hotkey=enable,0xffff experimental=1

        来指定加载模块时的参数,hotkey=enable,0xffff指明使用尽可能多的快捷键,experimental=1打开一些在测试中的功能,如控 制cpu风扇等,启用hotkey功能后,Fn+F4组合键将不产生sleep的acpi的事件,而是ibm/hotkey事件。acpid这个东西干什么呢?ThinkWiki介绍说:

        Basically, acpid just executes scripts residing in /etc/acpi/actions. Which script to launch at which event is configured in several files in /etc/acpi/events. All actions are documented in /var/log/acpid.

        2. 编辑/etc/acpi/文件夹 ,让文件结构如下所示(如果没有则自己创建):
            | - apci
            | | - actions
            | | | - instWiFi.sh
            | | | - lcd_switch.sh
            | | | - sleep.sh
            | | - events
            | | | - anything
            | | - handler.sh
     
        3. 将acpi对ibm/hotkey事件的相应加入handler.sh:
                    ibm/hotkey)
                      case "$2" in
                            HKEY)
                            case "$4" in
                                    00001003) #echo "f3" >/dev/tty5
                                            /etc/acpi/actions/lcd_switch.sh
                                            ;;
                                    00001004) #echo "f4" >/dev/tty5
                                            /etc/acpi/actions/sleep.sh
                                            ;;
                                    00001005) #echo "f7" >/dev/tty5
                                            /etc/acpi/actions/instWiFi.sh
                                            ;;
                                    00001007) #echo "f7" >/dev/tty5
                                            echo video_switch > /proc/acpi/ibm/video
                                            ;;
                                    00001008) #echo "f8" >/dev/tty5
                                            echo eject > /proc/acpi/ibm/bay
                                            ;;
                                    0000100c) #echo "f12" >/dev/tty5
                                            /sbin/halt
                                            ;;
                            esac
                            ;;
                            *) logger "ibm_acpi undefined:$2";;
                     esac
                     ;;

        4. 编写actions文件夹下相对应的脚本如下:
            $ cat lcd_switch.sh
            #!/bin/sh
            flag=/tmp/thinkpad_lcd_off
            if [ -e $flag ]; then
                /usr/sbin/radeontool light onrm -f $flag
            else
                /usr/sbin/radeontool light off >$flag
            fi
       
            $ cat instWiFi.sh
            #!/bin/sh
            #echo Feel Freedom,using WiFi!
            if lsmod |grep -q 'ipw2200'
            then rmmod ipw2200 ieee80211 ieee80211_crypt;pkill dhcpcd
            else modprobe ipw2200;iwconfig eth1 essid default key 7db579d6f3;dhcpcd eth1
            fi
     
            $ cat sleep.sh
            #!/bin/sh
            # if launched through a lid event and lid is open, do nothing
            echo "$1" | grep "button/lid" && grep -q open /proc/acpi/button/lid/LID/state && exit 0
            # remove USB 1.1 driver
            rmmod uhci_hcd
            # sync filesystem and clock  
            sync
            /sbin/hwclock --systohc
            # switch to console
            FGCONSOLE=`fgconsole`
            chvt 6
            /usr/sbin/radeontool light off
            # go to sleep
            echo -n "mem" > /sys/power/state
            # readjust the clock (it might be off a bit after suspend)
            /sbin/hwclock --adjust
            /sbin/hwclock --hctosys
            # reload USB 1.1 driver
            modprobe uhci_hcd
            # turn on the backlight and switch back to X
            radeontool light on
            chvt $FGCONSOLE
     
        可以看出,我另添加了三个脚本: 
        --lcd_switch.sh提供了关闭屏幕的功能(需要radeontool的支持);
        --sleep.sh提供了休眠的功能,修改后的休眠脚本(需要radeontool的支持);
        --instWiFi.sh提供了无线连接和断开的功能(需要首先配置好无线:安装wireless_tools和ipw2200-fw,并且编译内核时提供了无线支持)。 
        记得chmod +x /etc/acpi/actions/* 
         
        5. 安装radeontool, http://www.thinkwiki.org/wiki/Radeontool
     
        6. $/etc/rc.d/acpid restart,然后就可以看看各个热键是否起作用了。
     
     
    IBM ThinkPad 合上屏幕休眠的设置:
    --------------------------------------------- 
     
        IBM休眠的快捷方式有两个:
            1. 按Fn+F4
            2. 合上机盖
        分别在handler.sh上对应:
            1.    ibm/hotkey HKEY 00000080 00001004
            2.    ibm/hotkey HKEY 00000080 00005001  #ThinkPad对笔记本加上的热键,只有thinkpad会产生
                  button/lid LID 00000080 00000007     #正常合上机盖所产生的信号,适合于所有的笔记本
        于是,对于情况2,我们在handler.sh中加入相应的处理方法:
            ...
            button/lid)
            #echo "LID switched!">/dev/tty5
                /etc/acpi/actions/sleep.sh #添加这句
                ;;
            ...

        对于情况1,请参考文章开头的《IBM ThinkPad R52热键设置》;
                
    原理:
    -------------------------------------- 
     
        我们来看看acpid的工作原理:
       
        1. 首先,我们按下某热键,此处我们举例Fn+F4 ;
       
        2. acpid监听并截获这个按键组合,我们可以用acpi_listen命令来手动查看不同按键组合产生不同的信号:
            $ acpi_listen
            ibm/hotkey HKEY 00000080 00001004 #这是我的机器上Fn+F4产生的中断信号
       
        3. acpid在/ect/acpi/events/下寻找对应的处理方案,我的该文件夹下面只有一个文件:
            $ cat anything
            event=.*
            action=/etc/acpi/handler.sh %e 
        NOTE: 在这里,我偷了一个懒。我将所有的信号(前面acpi_listen所监听到的)一股脑儿抛给了handler.sh,然后在handler.sh里进行分析处理。其实,你可以创建自己的处理方案,比如,
            $ vim /etc/acpid/events/sleep
            event=ibm/hotkey HKEY 00000080 00001004  #ThinkPad Fn+F4产生的中断信号
            action=/etc/acpi/actions/sleep.sh  #遇到这个中断信号则执行该脚本
       
        4. handler.sh接收到处理信号后,首先进行分析:
            set $*
                case "$1" in
                    ibm/hotkey)
                        case "$2" in
                            HKEY)
                              case "$4" in
                                 00001004) #echo "f4" >/dev/tty5,终于分析完Fn+F4信号了
                                            /etc/acpi/actions/sleep.sh  #激活相应事件处理程序
                                            ;;
            ... 
            NOTE: 其实整个事件过程可以在上面第三步用NOTE中的方法代替。但是这样做的好处是将所有的处理方法都放到一起,便于编辑(就是喜欢ArchLinux的这种风格,在系统启动脚本/etc/rc.*上尤其明显)。
     
        5. /etc/acpi/actions/sleep.sh被执行。 
       
    Links:
    -------------------------------------------
     
        1. 笔记本上使用ArchLinux:
        2.  How to configure acpid:
        3. Radeontool:
        4. Debian GNU/Linux on IBM T41P
        5. Debian + IBM-R40(迅驰)
         
         
    Future Work:
    ----------------------------------------
        1. 现在我的Ctrl+Alt+F1~F8不能用啦,chvt的时候,屏幕会变黑,不停闪动,但是没有字符界面出来;
        2. Ctrl+Alt+BackSpace退出X的时候,出现情况和上面一样,我想是我的图形界面出问题了,并且我猜这个和acpid有关,是我昨天晚上安装了acpid,cpudyn后出现的问题;
        3. 我的ipw2200,ieee80211,ieee80211_crypt模块开机会自启动,也就是说刚刚开机时lsmod就能查看到这些模块,我的rc.conf下没有自启动这些模块,怎么把这些自启动关掉。 
     
        如果各位看官有谁能解决这些问题,在此谢过了。

    历史上的今天:

    cpu调频 2007-07-29

    收藏到:Del.icio.us




    评论

  • 你好,为什么我的没有用阿?我的时X32
  • 兄弟,你的DM是不是KDE的啊?
  • 兄弟,为啥我的R50e怎么不行呢,是不是还有什么设置啊?