Backlight (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Backlight. Дата последней синхронизации: 30 июня 2017. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Контролировать яркость экрана бывает непросто. На многих компьютерах нет физического переключателя, а вместо него используются программные решения, которые не всегда работают как положено. Однако, чаще всего это возможно. Найдите работающий способ для вашего оборудования. Слишком яркие экраны могут привести к потере зрения!

Существует много способов регулировать яркость подсветки монитора, экрана ноутбука или встроенной экранной панели (как в iMac) с помощью программного обеспечения, но в зависимости от оборудования и модели иногда доступны не все варианты. В данной статье предпринимается попытка обобщить все возможные пути регулирования яркости подсветки экрана.

Обзор

Существует несколько способов контролировать яркость. В соответствии с этим обуждением [1] и этой wiki страницей [2], способы контроля делятся на следующие категории:

  • яркость управляется горячей клавишей, определённой производителем, и нет интерфейса для того, чтобы ОС могла настраивать яркость.
  • яркость можно контролировать через ACPI или через графический драйвер.
  • яркость можно контролировать посредством аппаратного регистра с помощью setpci.

Все методы доступны пользователю через /sys/class/backlight и xrandr/xbacklight может выбрать один способ контролировать яркость. Пока еще не совсем понятно, который из способов xbacklight предпочитает по умолчанию.

Смотрите FS#27677 для xbacklight, если вам выдает "No outputs have backlight property." Есть временное решение, в случае если xrandr/xbacklight не выбирает нужную папку в /sys/class/backlight: Вы можете указать ту, которая вам нужна в xorg.conf, внеся имя той папки в поле "Backlight" секции Device (смотрите https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=651741 внизу страницы для более подробной информации).

ACPI

Яркость подсветки экрана регулируется установлением уровня питания светодиодов или катодов. Уровень питания может часто контролироваться с помощью ACPI модуля ядра для видео. Интерфейс к этому модулю доступен через папку sysfs в /sys/class/backlight.

Имя папки зависит от модели видеокарты.

# ls /sys/class/backlight/
acpi_video0

Именно эта подсветка - управляется видеокартой ATI. В видеокарте Intel она называется intel_backlight. В следующем примере используется acpi_video0.

Папка содержит следующие файлы и папки:

# ls /sys/class/backlight/acpi_video0/
actual_brightness  brightness         max_brightness     subsystem/    uevent             
bl_power           device/            power/             type

Максимальную яркость можно прочитать из max_brightness, которая обычно равна 15.

# cat /sys/class/backlight/acpi_video0/max_brightness
15

Яркость может быть изменена, если записать число в brightness. Здесь невозможно использовать число выше максимальной яркости.

# tee /sys/class/backlight/acpi_video0/brightness <<< 5

Параметры ядра

Иногда ACPI не работает должным образом из-за различных реализаций материнских плат и особенностей ACPI, что может приводить, например, к неточным оповещениям о яркости. Этому могут быть подвержены некоторые ноутбуки с двойной графикой (например, выделенный графический процессор Nvidia / Radeon с интегрированным графическим процессором Intel / AMD). Кроме того, иногда может быть необходимо зарегистрировать свою собственную подсветку acpi_video0, даже если другая уже существует (например, intel_backlight), что может быть достигнуто добавлением следующих параметров ядра:

acpi_backlight=video
acpi_backlight=vendor
acpi_backlight=native

Если вы обнаружите, что изменение подсветки acpi_video0 на самом деле не изменяет яркость, вам может потребоваться использовать acpi_backlight=none.

Совет:
  • На ноутбуках Nvidia Optimus параметра ядра nomodeset может препятствовать регулировке подсветки.
  • На ноутбуках Asus вам может также понадобиться загрузить модуль ядра asus-nb-wmi.
  • Отключение legacy-загрузки на Dell XPS13 приводит к невозможности изменить подсветку.

Правило Udev

Если доступен интерфейс ACPI, уровень подсветки может быть установлен во время загрузки с использованием правила udev:

/etc/udev/rules.d/81-backlight.rules
# Установить уровень подсветки равным 8
SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="8"
Примечание: Служба systemd-backlight восстанавливает предыдущий уровень яркости подсветки во время загрузки. Чтобы предотвратить конфликты для указанных выше правил, см. #Служба systemd-backlight.
Совет: Чтобы настроить подсветку в зависимости от состояния питания, см. Power management#Using a script and an udev rule и используйте выбранную вами утилиту в скрипте.

Выключение подсветки

Выключение подсветки (например, при закрытии крышки ноутбука) может быть полезно для сохранения заряда батареи. Выполните следующую команду:

$ sleep 1 && xset dpms force off

Подсветка должна включиться снова при движении мыши или вводе с клавиатуры. Если предыдущая команда не работает, есть шанс, что vbetool заработает. Отметьте, однако, что в этом случае подсветка должна быть вручную активирована снова. Выполните:

$ vbetool dpms off

Чтобы снова включить подсветку:

$ vbetool dpms on

Например, это можно использовать при закрытии крышки ноутбука с помощью Acpid.

Служба systemd-backlight

Пакет systemd содержит "static" службу [email protected], которая включена по умолчанию. Она сохраняет яркость подсветки во время выключения ПК и восстанавливает при включении. Эта служба использует ACPI метод, описанный в #ACPI, создавая службы для каждой папки, найденной в /sys/class/backlight/. Например, если есть папка acpi_video0, она создаст службу systemd-backlight@backlight:acpi_video0.service. Если вы используете другие методы установки яркости во время загрузки, рекомендуется маскировать службу [email protected], чтобы сделать невозможным ее запуск.

Некоторые ноутбуки имеют несколько видеоадаптеров (как Optimus) и восстановление подсветки не выполняется в следствие ошибок. Попробуйте маскировать instance этой службы, например systemd-backlight@backlight\:acpi_video1 в случае acpi_video1.

Из man-страницы [email protected]:

systemd-backlight принимает следующий параметр командной строки:

systemd.restore_state=

Принимает логическое значение. По умолчанию "1".

Если "0", не восстанавливает настройки яркости во время загрузки. Однако, настройки будут всё равно сохраняться при выключении.

Утилиты настройки

xbacklight

Яркость может быть установлена с помощью пакета xorg-xbacklight.

Примечание:
  • xbacklight работает только с intel. Radeon не поддерживает свойство подсветки RandR.
  • xbacklight в настоящий момент не работает с modesetting-драйвером [3].

Чтобы установить яркость в 50% от максимальной:

$ xbacklight -set 50

Приращения могут использоваться вместо абсолютных значений, например, для увеличения или уменьшения яркости на 10%:

$ xbacklight -inc 10
$ xbacklight -dec 10

Гамма может быть установлена с использованием пакета xorg-xrandr или xorg-xgamma. Следующие команды создают одинаковый эффект.

$ xrandr --output LVDS1 --gamma 1.0:1.0:1.0
$ xgamma -rgamma 1 -ggamma 1 -bgamma 1
Совет: Эти команды могут быть привязаны к клавишам клавиатуры, как описано в Extra keyboard keys in Xorg.

Если вы сталкиваетесь с ошибкой "No outputs have backlight property", это потому, что xrandr/xbacklight не выбирает правильную папку в /sys/class/backlight. Вы можете указать папку, настроив опцию Backlight в device-разделе файла xorg.conf. К примеру, если имя папки intel_backlight, раздел device может быть настроен следующим образом:

/etc/X11/xorg.conf
Section "Device"
    Identifier  "Card0"
    Driver      "intel"
    Option      "Backlight"  "intel_backlight"
EndSection

См. FS#27677 и [4] для подробностей.

Другие утилиты

  • brightnessctl — Легковесный инструмент контроля яркости (совместимый с Wayland).
https://github.com/Hummer12007/brightnessctl || brightnessctl
  • light — Light последователь LightScript.
https://github.com/haikarainen/light || light
  • acpilight — acpilight содержит "xbacklight"-совместимую утилиту, которая использует sys файловую систему для установки яркости экрана. Т.к. она не использует X вообще, ее также можно использовать в консоли и с Wayland. Она не имеет проблем с KMS драйверами. Кроме того, на ноутбуках ThinkPad можно также настраивать подсветку клавиатуры.
https://github.com/wavexx/acpilight/ || acpilight
  • illum — ilum следит за клавишами увеличения и уменьшения яркости на всех устройствах ввода (с помощью libevdev) и настраивает яркость по нажатию клавиши (через sysfs). Написана для новых BIOS/UEFI, которые не обрабатывают нажатия этих клавиш за вас. Это альтернатива обработке этих клавиш через acpi или с помощью горячих клавиш x11/wm.
https://github.com/jmesmon/illum || illum-gitAUR
  • brightd — brightd автоматически приглушает (но не переводит в режим ожидания) экран, если в течение какого-то времени пользователь не взаимодействует с ПК. Хорошее дополнение к Display Power Management Signaling для того, чтобы экран не гас внезапно.
https://www.pberndt.com/Programme/Linux/brightd/ || brightdAUR
  • lux — lux это совместимый с POSIX сценарий оболочки для управления яркостью на контролерах подсветки.
https://github.com/Ventto/lux || luxAUR
  • Clight — Вдохновленная calise, но с множеством новых функций и написанная на Си. Её первоначальной целью было превратить веб-камеру в датчик освещенности: она будет регулировать подсветку экрана на основе яркости окружающего пространства.
https://github.com/FedeDP/Clight || clight-gitAUR

setpci

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

Используя этот метод, вам сначала нужно использовать lspci чтобы найти ваш графический адаптер.

# setpci -s 00:02.0 F4.B=0

Использование DBus с Gnome

Яркость также можно регулировать с помощью настроек gnome. При использовании этого метода изменения отражаются в интерфейсе gnome.

gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.freedesktop.DBus.Properties.Set org.gnome.SettingsDaemon.Power.Screen Brightness "<int32 50>"

Пошаговое изменение яркости (для контроля с клавиатуры) также может быть реализовано этим методом.

gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp
gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepDown

Цветовая коррекция

xcalib

Примечание: xcalib не меняет силу подсветки, а просто модифицирует LUT-таблицу: это означает, что время работы от батареи не изменится. Однако, это может быть полезно, когда регулировка подсветки недоступна (настольные ПК). Используйте xcalib -clear, чтобы сбросить LUT.

Пакет xcalib (upstream URL) может использоваться, чтобы уменьшить яркость экрана. Видео-демонстрация доступна на YouTube. Эта программа может корректировать гамму, инвертировать цвета и уменьшать контраст. Например, чтобы уменьшить яркость посредством изменения контраста:

$ xcalib -co 40 -a

Эта программа использует технологию ICC для взаимодействия с X11, и пока экран затенен, вы можете обнаружить, что курсор мыши так же ярок, как и раньше.

Xflux

Xflux это порт f.lux для системы X-Windows. Он меняет оттенок экрана между синим в течение дня и желтым или оранжевым ночью. Это помогает вам адаптироваться к времени суток и перестать поздно ложиться спать из-за вашего яркого монитора.

В AUR существуют различные пакеты, которые используют f.lux.[5] "Основной" пакет - xfluxAUR, который охватывает функционал командной строки f.lux. Существуют различные демоны для автоматического запуска пакета xflux.

redshift

Redshift использует randr, чтобы настроить яркость экрана в зависимости от времени суток и вашего географического положения. Она также может выполнять RGB гамма-коррекцию и задавать цветовые температуры. Как и xcalib, это лишь программное решение, и внешний вид курсора мыши не изменяется. Чтобы выполнить быструю настройку яркости, попробуйте что-то вроде этого:

redshift -o -l 0:0 -b 0.8 -t 6500:6500
Совет: Если ваша долгота западная или широта южная, вы должны ввести ее как отрицательную. Пример для Berkeley, CA:
redshift-gtk -l 37.8717:-122.2728 

NVIDIA settings

Пользователи несвободных драйверов NVIDIA могут менять яркость дисплея с помощью утилиты nvidia-settings в разделе "X Server Color Correction". Однако, заметьте, что это не имеет ничего общего с подсветкой (Интенсивность), она всего лишь регулирует цветность. (Уменьшение яркости таким образом не является энергоэффективным. Используйте его в последнюю очередь, если все другие варианты не срабатывают; увеличение яркости портит цвета на экране полностью, по аналогии с засвеченностью фотографий.)

Увеличение яркости выше максимального уровня

Вы можете испльзовать xrandr для увеличения яркости выше максимального уровня:

$ xrandr --output output_name --brightness 2

Это установит уровень яркости на 200%. Это приведёт к повышению энергопотребления и снижению качества цвета в пользу яркости, тем не менее оно особенно подходит для ситуаций, когда окружающий свет очень яркий (например, солнечный свет).

Внешние мониторы

DDC/CI (Командный интерфейс обмена данными между компьютером и монитором) может использоваться для связи с внешними мониторами, реализующими стандарт MCCS (Monitor Control Command Set) по шине I2C.

DDC может контролировать яркость, контрастность, входы и т.д. на поддерживаемых мониторах. Настройки, доступные с панели OSD (экранное меню), также могут управляться через DDC.

Утилита ddcutil может использоваться, чтобы вывести или поменять настройки яркости:

# ddcutil capabilities | grep Brightness
  Feature: 10 (Brightness)
# ddcutil getvcp 10
VCP code 0x10 (Brightness                    ): current value =    60, max value =   100
# ddcutil setvcp 10 70

Решение проблем

Частота ШИМ-модуляции подсветки (только для Intel i915)

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

Однако, частота переключения, так называемая частота ШИМ (широтно-импульсная модуляция), может быть недостаточно высокой, чтобы глаз воспринимал её как непрерывное свечение, и вместо этого видно мерцание. Это вызывает у некоторых людей такие симптомы, как головные боли и усталость глаз.

Если у вас графический адаптер Intel i915, то возможно настроить частоту ШИМ, чтобы устранить мерцание.

Период ШИМ (обратно пропорциональный частоте) записывается в 4 старших байта регистра 0xC8254 (если вы используете чипсет Intel GM45, вместо этого используйте адрес 0x61254). Чтобы манипулировать значениями регистров, установите intel-gpu-tools из официальных репозиториев.

Чтобы увеличить частоту, период должен быть уменьшен. Например:

# intel_reg read 0xC8254
0xC8254 : 0x12281228

Затем, чтобы удвоить частоту ШИМ, разделите 4 старших байта на 2 и запишите полученное значение, сохраняя нижние байты неизменными:

# intel_reg write 0xC8254 0x09141228

Вы можете использовать онлайн-калькулятор для расчета желаемого значения https://devbraindom.blogspot.com/2013/03/eliminate-led-screen-flicker-with-intel.html

Чтобы установить новую частоту автоматически, попробуйте написать правило udev или установить intelpwm-udevAUR.

Инвертированная яркость (только для Intel i915)

Симптомы:

  • после установки xf86-video-intel systemd-backlight.service выключает подсветку во время загрузки
    • возможное решение: маскировать systemd-backlight.service
  • переключение с X на другую виртуальную консоль выключает подсветку
  • кнопки регулировки подсветки инвертированы (например, увеличение яркости делает экран темнее)

Эта проблема может быть решена добавлением i915.invert_brightness=1 в список параметров ядра.

sysfs изменен, но нет изменения яркости

Примечание: Такое поведение и способы его обхода были подтверждены на Dell M6700 с Nvidia K5000m (версия BIOS до A10) и Clevo P750ZM (Eurocom P5 Pro Extreme) с Nvidia 980m.

На некоторых системах горячие клавиши яркости на клавиатуре корректно изменяют значения интерфейса acpi в /sys/class/backlight/acpi_video0/actual_brightness, но яркость экрана не изменяется. Апплеты яркости в окружениях рабочего стола могут также показывать изменения без результатов.

Если вы протестировали рекомендуемые параметры ядра и только xbacklight работает, вы можете столкнуться с несовместимостью между вашим BIOS и драйвером ядра.

В этом случае единственное решение - дождаться исправления от производителя BIOS или драйвера GPU.

Обходной путь - использовать inotify api ядра для запуска xbacklight каждый раз, когда изменяется значение /sys/class/backlight/acpi_video0/actual_brightness.

Сперва установите inotify-tools. Затем создайте скрипт, который будет запускаться при каждом включении с помощью автозагрузки.

/usr/local/bin/xbacklightmon
#!/bin/sh

path=/sys/class/backlight/acpi_video0

luminance() {
    read -r level < "$path"/actual_brightness
    factor=$((100 / max))
    printf '%d\n' "$((level * factor))"
}

read -r max < "$path"/max_brightness

xbacklight -set "$(luminance)"

inotifywait -me modify --format '' "$path"/actual_brightness | while read; do
    xbacklight -set "$(luminance)"
done