Управление событиями ACPI
Введение
Управление сие достигается с помощью демона acpid. События заключаются в определённых действиях пользователя:
Настройка
В дистрибутиве 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
Сентябрь 5, 2007 at 7:02 дп
Недавно тоже настраивал ACPI, но по другому поводу: нужна была кнопка Radio Frequency Kill Switch. Работало всё, кроме неё :-) Таки снял свой шаманский бубен и смахнул с него пыль :-)
Сентябрь 5, 2007 at 7:39 дп
У меня в ноутбуке это, как и изменение яркости, работает аппаратно.
Январь 29, 2008 at 12:36 дп
А как узнать коды кнопок, чтобы заставить их работать?
Январь 29, 2008 at 12:40 дп
каких кнопок? Если hotkeys, то это не должно иметь отношения к ACPI.
Январь 30, 2008 at 4:14 дп
Да нет. Как например повесить какое-нибудь действие хотябы на тот же Radio Frequency Kill Switch или кнопку отключения тачпада?
Январь 30, 2008 at 10:40 дп
ну у меня эти кнопки железячные, поэтому на них ничего не навесить. А если нет - то при нажатии на кнопку по умолчанию в виртуальной консоли #5 будет указано, что за кнопка нажата (если это acpi кнопка). Если не acpi, то тогда надо запускать xev или xbindkeys.
P.S. возможно, лучше посмотреть на описание работы в linux такого ноутбука.