cppmm 30.09.2010 08:18

Tips & tricksАвтоматическое изменение яркости экрана Asus EeePC 701 4G в Debian

Я обычно работаю на своём нетбуке с яркостью, поднятой на максимум. Но при переходе в режим работы от батареи это даёт очень неслабую нагрузку на неё. Fn-клавиши, конечно, работают, но постоянно повышать/понижать яркость руками лень. Вот я и решил поковырять acpi на предмет автоматизации процесса. В принципе, ничего сложного.

Из man acpid можно узнать принципы работы acpi-скриптов. В /etc/acpi/events/ лежат файлы событий формата
event=событие
action=скрипт, который выполняется на это событие
Чтобы узнать, на какое именно событие реагировать, можно воспользоваться функцией acpi_listen.
В моём случае результат её работы выглядит так при выдёргивании блока питания из розетки:
1
2
3
4
5
6
<root># acpi_listen 
ac_adapter AC0 00000080 00000000
battery BAT0 00000080 00000001
hotkey ATKD 00000051 0000001e
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000000</root>


и вот так при подключении:
1
2
3
4
5
6
<root># acpi_listen 
ac_adapter AC0 00000080 00000001
battery BAT0 00000080 00000001
hotkey ATKD 00000050 0000001c
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000001</root>


Так как мне надо всего лишь сменить яркость, я не стал заморачиваться на параметры и указал реагировать просто на любые изменения в ac_adapter
Итоговый файл события у меня выглядит так:
1
2
3
4
5
6
# /etc/acpi/events/auto_brightness
# Called when ac off and we need to switch brightness down or up when ac on.
#

event=ac_adapter.*
action=/etc/acpi/auto_brightness.sh

Теперь надо написать непосредственно скрипт, меняющий яркость взависимости от того, есть питание или нет. Здесь есть два пути - смотреть напрямую в /proc и парсить то, что там имеется или воспользоваться готовой функцией из acpi-support. Я выбрал второй вариант. Для тех, кому больше по душе первый, текущее положение адаптера отображается в /proc/acpi/ac_adapter/AC0/state

Я же использую функцию getState() из /usr/share/acpi-support/power-funcs. Она при вызове передаёт переменной STATE либо значение AC, либо BATTERY в зависимости от режима работы нетбука.
Осталось только найти способ менять яркость. Тут тоже всё просто. Пробежался быстро по тем же acpi'шным скриптам и выяснил, что уровень яркость указывается в /sys/class/backlight/eeepc/brightness. От 1 до 15, где 15 - максимально яркое, 1 соответсвенно тусклое.
Итоговый скрипт получился такой:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# /etc/acpi/auto_brightness.sh
#

. /usr/share/acpi-support/power-funcs

getState

if < "$STATE" = "AC" >
then
echo 15 > /sys/class/backlight/eeepc/brightness
else
echo 1 > /sys/class/backlight/eeepc/brightness
fi

Всё. Рестартим acpid и радумаемся.


Тэги: acpi debian eeepc Linux
+ 7 -
Похожие Поделиться

goblinyara 30.09.2010 12:41 #
как-то странно это сделано на асусах, ибо мой dell inspiron 1525 всё автоматом переключает сам...
psyX 30.09.2010 14:04 #
думаю это зависит не от модели, а от дистрибутива и окружения.
goblinyara 30.09.2010 14:57 #
ну ладно, убунта - это понятно... но в арче и в генте тоже всё автоматом переключалось, даже после только начальной установки, то есть даже без иксов и всякой прочей обвески
cppmm 30.09.2010 15:51 #
Других ноутов у меня нет, поэтому, как там - не знаю. Но у EeePC, видимо, имеются какие-то особенности, так как для работы хоткеев, к примеру, пришлось ставить отдельный пакет eeepc-acpi-scripts. Причём, что интересно, он конфликтует со стандартными acpi-скриптами, поэтому последние пришлось удалить. Видимо, разработчики пакета не учли этот момент.
Свой скрипт и правило для acpi мантейнерам пакета я отправил на всякий случай.