Мобильные юниксы vol.1 Anton Karpov Xakep, номер #066, стр. 066-104-4 event=button/lid action=/etc/acpi/lidbtn.sh Убедимся, что у нас загружен acpi’шный модуль ядра button (если мы его собирали как модуль, разумеется), и заглянем в /proc/acpi/button/lid. Здесь мы найдем папку LID (по количеству дисплеев, а он у нас один) и в ней два файла: info и state. Первый содержит информацию о том, что данная подсистема работает с Lid Switch – переключателем дисплея (из положения открыт/закрыт), второй содержит текущее состояние – open означает, что дисплей открыт. Если мы захлопнем крышку, подсистема ACPI сгенерит изменение состояния, и в файл /proc/acpi/button/lid/LID/state запишется новое состояние – closed. В свою очередь демон acpid отловит изменения в /proc, сопоставит с событиями, которые он должен отслеживать, найдет конфиг lidbtn и запустит скрипт, указанный в поле action - /etc/acpi/lidbtn.sh. Это самый обыкновенный скрипт, читающий состояние из файла /proc/acpi/button/lid/LID/state и гасящий экран, если тот закрыт (в файле записано состояние closed), и включающий обратно – если открыт (состояние - open). Для удобства добавим условие – гасить экран будем, только если ноут питается от батарей, ведь в противном случае беречь энергию некритично. Для этого прочитаем файл /proc/acpi/battery/BAT1/state, содержащий информацию о текущем источнике питания, нас интересует строчка charging state: charging – если заряжаемся, т.е. питаемся от сети, и discharging – если питаемся от аккумулятора. Гашение экрана будет происходить, только когда батарея начнет разряжаться: # vi /etc/acpi/lidbtn.sh #!/bin/sh lid_status=`awk '/^state:/ { print $2 }' /proc/acpi/button/lid/LID/state` batt_status=`awk '/^charging state:/ { print $3 }' /proc/acpi/battery/BAT1/state` case $lid_status in "closed") [ -n $batt_status -a $batt_status = "discharging" ] && \ /usr/local/sbin/radeontool light off exit 0 ;; "open") /usr/local/sbin/radeontool light on exit 0 ;; esac Где radeontool – утилита для контроля яркости ноутбучных мониторов для ATI Mobility Radeon. Можно изменить реакцию по вкусу, например, выключать ноутбук/уходить в standby, если питаемся от аккумулятора, и просто гасить экран, если от сети. Аналогичным образом создается реакция на остальные события. Для себя я написал скрипты, устанавливающие яркость монитора вполовину максимальной при питании от батарей, и переключающие яркость на полную – при втыкании шнурка в розетку, а также корректно выключающие ноутбук при нажатии на кнопку питания. Теперь ты знаешь, как это сделать – нужно всего лишь обработать соответствующий файл в /proc/acpi и иметь самые начальные познания в shell-скриптинге. Специфичные проги Часто бывает, что поддержка ноутбуков определенной фирмы выделена особой опцией в ядре. Это связано не с ACPI, а скорее с тонкостями взаимодействия операционки с железом ноутов конкретного вендора. Так, например, для лаптопов от Sony в Linux есть специальный девайс sonypi, создаваемый одноименным модулем (который, разумеется, должен быть собран во время конфигурирования ядра). Его задача состоит в том, чтобы предоставить интерфейс доступа к железу userland-программам. На ноутбуках же других вендоров он совершенно бесполезен. Для Sony существуют пакеты sjog, picturebook, vaiomagic, которые позволяют пользователю контролировать яркость экрана, просматривать заряд батарей, и делают функциональные клавиши (которые в силу компактности ноутбучных клавиатур есть почти в каждом лаптопе) не такими уж бесполезными в не windows среде. Для ноутов других производителей наверняка должно быть нечто подобное. |