Управление событиями ACPI

Введение

Управление сие достигается с помощью демона acpid. События заключаются в определённых действиях пользователя:

  • нажатие кнопки Power
  • нажатие кнопки Sleep или Hibernate
  • Закрытие крышки ноутбука
  • Выдёргивание шнура питания из ноутбука
  • Настройка

    В дистрибутиве ArchLinux вся настройка демона производится в файле /etc/acpi/handler.sh, в других дистрибутивах реакция на ACPI события может быть в нескольких файлах, как lid.sh, power.sh и других.

    Я приведу свой файл handler.sh и поясню, что, где и зачем в нём находится.

    #!/bin/sh
    # Default acpi script that takes an entry for all actions

    # NOTE: This is a 2.6-centric script. If you use 2.4.x, you’ll have to
    # modify it to not use /sys

    getuser ()
    {
    export DISPLAY=`echo $DISPLAY | cut -c -2`
    user=`who | grep ” $DISPLAY” | awk ‘{print $1}’`
    export XAUTHORITY=/home/$user/.Xauthority
    eval $1=$user
    }

    set $*

    case “$1″ in
    button/power)
    case “$2″ in
    PBTN)
    getuser “$user”
    su $user -c “dcop ksmserver ksmserver logout 0 2 0″
    ;;
    *) logger “ACPI action undefined: $2″ ;;
    esac
    ;;
    button/sleep)
    case “$2″ in
    SLPB) pm-suspend ;;
    *) logger “ACPI action undefined: $2″ ;;
    esac
    ;;
    ac_adapter)
    case “$2″ in
    AC)
    case “$4″ in
    00000000)
    cpufreq-set -g powersave -c 0
    cpufreq-set -g powersave -c 1
    pm-powersave true
    ;;
    00000001)
    cpufreq-set -g performance -c 0
    cpufreq-set -g performance -c 1
    pm-powersave false
    ;;
    esac
    ;;
    *) logger “ACPI action undefined: $2″ ;;
    esac
    ;;
    battery)
    case “$2″ in
    BAT0)
    case “$4″ in
    00000000) #echo “offline” >/dev/tty5
    ;;
    00000001) #echo “online” >/dev/tty5
    ;;
    esac
    ;;
    CPU0)
    ;;
    *) logger “ACPI action undefined: $2″ ;;
    esac
    ;;

    button/lid)
    getuser “$user”
    grep -q closed /proc/acpi/button/lid/*/state
    if [ $? = 0 ]
    then
    xset dpms force off
    su $user -c ‘gajim-remote change_status xa “LID is closed” jabber.no’
    else
    xset dpms force on
    su $user -c ‘gajim-remote change_status online “” jabber.no’
    fi
    ;;
    *)
    logger “ACPI group/action undefined: $1 / $2″
    ;;
    esac

    функция getuser позволяет получить имя пользователя, который в данный момент работает в системе.

    1. при нажатии на кнопку power вызывается через dcop KDE’шное выключение. Надо потом будет сделать проверку на запущенный KDE сеанс и в случае его отсутствия выключать компьютер, например, через halt.

    2. при нажатии на кнопку sleep вызывается pm-suspend, команда из пакета pm-utils, про который я уже писал

    3. при выдёргивании шнура питания процессоры переходят в режим powersave, а при втыкании шнура обратно они переходят в режим производительности.

    4. при закрывании крышки ноутбука выключается дисплей и статус в гаджиме изменяется соответствующим образом. При открывании крышки - статус “онлайн”, а дисплей включается.

    P.S. если кого-то смущает сбившееся форматирование, то файл можно взять по адресу http://cheer6.googlepages.com/handler.sh

    6 коммент. to “Управление событиями ACPI”

    1. virens Says:

      Недавно тоже настраивал ACPI, но по другому поводу: нужна была кнопка Radio Frequency Kill Switch. Работало всё, кроме неё :-) Таки снял свой шаманский бубен и смахнул с него пыль :-)

    2. Igor Says:

      У меня в ноутбуке это, как и изменение яркости, работает аппаратно.

    3. Shade Says:

      А как узнать коды кнопок, чтобы заставить их работать?

    4. Igor Says:

      каких кнопок? Если hotkeys, то это не должно иметь отношения к ACPI.

    5. Shade Says:

      Да нет. Как например повесить какое-нибудь действие хотябы на тот же Radio Frequency Kill Switch или кнопку отключения тачпада?

    6. Igor Says:

      ну у меня эти кнопки железячные, поэтому на них ничего не навесить. А если нет - то при нажатии на кнопку по умолчанию в виртуальной консоли #5 будет указано, что за кнопка нажата (если это acpi кнопка). Если не acpi, то тогда надо запускать xev или xbindkeys.
      P.S. возможно, лучше посмотреть на описание работы в linux такого ноутбука.

    Ответить