Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Готовы для десктопа - 3: backlight

От регулятора яркости монитора требуются всего 2 вещи: неизменность яркости при переключении режимов и перезагрузке и непрерывность регуляции.

Когда-то эти две функции решались хардварно, затем фирмварью монитора, а затем отдали на откуп производителям биоса, и начался адов ад.

Яркость контролируется хардварью и фирмварью дисплейной панели.
Панелью управляют, внимание:

- биос, экспозит интерфейс через ACPI WMI и через /sys/class/backlight/acpi_video0
- видеокарта, экспозит интерфейс через /sys/class/backlight/intel_backlight

За эти 3 ручки дергают:

- systemd в сервисах systemd-backlight
- X11 в xbacklight/xrandr
- acpid из скриптиков обработки магических чисел
- сам биос при нажатии на кнопки

В идеальном мире производители биоса сами обрабатывают кнопки и экспозят интерфейс, который сами респектят. Например: если ноут отключился от розетки, биос по WMI шлет сигнал об отключении, который в ядре получает модуль ac и шлет в юзермод через acpid скриптику. Скриптик через /sys/class/backlight/acpi_video0 говорит фирмваре переставить яркость и разослать уведомление об этом через WMI.

Если юзер нажал на кнопку яркости - то фирмваре обрабатывает кнопку, переставляет яркость и уведомляет по WMI. Сигнал получает скриптик и переставляет свои настройки. Т.е. в режиме от батареи теперь яркость всегда будет другая.

X11 и systemd яркостью вообще не занимаются. Скриптики не переставляют яркость по нажатию на кнопки яркости.

В реале же может быть, что биос не делает свою работу. Поэтому созданы 4 подпорки:
- systemd на случай того, что биос не сохраняет уровень подсветки между перезагрузками
- xbacklight на случай того что X11 запускается на системе без ACPI BIOS и systemd
- скриптики обработки клавиш на случай, если BIOS сам по нажатиям не переставляет
- intel_backlight на случай, если BIOS не предоставляет ACPI-интерфейс перестановки

Так вот, если биос таки работает правильно, эти подпорки начинают конфликтовать друг с другом и биосом, т.к. в системе получается 5 независимых значений яркости.

Например, если я переставлю яркость нажатиями на кнопки до загрузки системы, то systemd эту яркость перезапишет своей. Если я переключу видеорежим - то xrandr перепишет текущую яркость на ту которая была при последнем запуске xbacklight. И т.д.

К счастью, systemd и обработчики кнопок яркости можно отключить. Осталось понять, как отключить intel_backlight и xrandr. Затрудняется это ещё тем, что яркости измеряются в разных единицах и изменяются в разных диапазонах!

acpi_video0 меняет от 0 до 15
intel_backlight меняет от 0 до 39к, при том 0 темнее чем 0 биоса, а 39к ярче чем 15
xrandr меняет от 0 до 100, соответствуя acpi_video0
Tags: все пидарасы а я
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments