Небольшая вводная часть, у меня стационарный компьютер, монитор с поддержкой DDC и клавиатура с мультимедиа клавишами включая яркость (Keychron K2). Задача была банальной - клавиши должны регулировать яркость монитора. И задача была успешно выполнена. У меня на текущий момент стоит Manjaro 20.

И решение выглядит так:

  1. Взять ddcutil, чтобы удобно общаться по DDC
  2. Добавить ddcci-driver-linux-dkms, для создания найденных мониторов в  /sys/class/backlight/ устройства
  3. И приправить illum который даст нам управлять устройствами в /sys/class/backlight/ с помощью кнопок яркости на клавиатуре. Если нативное не заработало

Установка необходимого

Так у меня Manjaro, а он основан на Arch, так же как Ubuntu основана на Debian. Я буду показывать всё для Arch, но можно установить данные программы и в Ubuntu.
А так как я переехал на Fedora, следом будет отдельно для Fedora и Ubuntu

Что мы будем использовать:

rockowitz/ddcutil
Query and change Linux monitor settings using DDC/CI and USB - rockowitz/ddcutil
ddcci-driver-linux / ddcci-driver-linux
GitLab.com

Только Arch-based дистрибутивы

# Вызываем, чтобы узнать какое у нас ядро, понадобится для следующего шага
uname -a

# Устанавливаем заголовки Linux будут нужны для сборки ddcci-driver, устанавливаем для своей версии ядра из информации из прошлого шага 
sudo yay -S linux-headers

# Устанавливаем ddcutil и ddcci-driver
yay -S ddcutil ddcci-driver-linux-dkms

Для Fedora и Ubuntu

# Устанавливаем dkms на Fedora (пропустить если Ubuntu)
sudo dnf install dkms

# Устанавливаем dkms на Ubuntu (пропустить если Fedora)
sudo apt-get install dkms


git clone git@gitlab.com:ddcci-driver-linux/ddcci-driver-linux.git
cd ddcci-driver-linux
sudo make -f Makefile.dkms install

Далее для всех одинаковые команды будут

# Добавляем модуль i2c-dev для общения с монитором
sudo modprobe i2c-dev

# Добавляем группу и сами добавляемся в неё, чтобы мы имели доступ к устройствам
sudo groupadd ddc
sudo usermod -aG ddc $USER

Создаём файл правил раздачи прав для работы с ddcutil

sudo nano /etc/udev/rules.d/45-ddcutil-i2c.rules

KERNEL=="i2c-[0-9]*", GROUP="ddc", MODE="0660", PROGRAM="/usr/bin/ddcutil --bus=%n getvcp 0x10"
45-ddcutil-i2c.rules

Перезагружаем правила sudo udevadm trigger и после мы уже можем проверить какие устройства есть в системе:

ddcutil detect

Проверить, что поддерживается к управлению:

ddcutil capabilities --bus=5 значение bus берем из вывода предыдущей команды например I2C bus: /dev/i2c-5 означает i2c-5 - 5 это нужный bus

И так же можно попробовать уже получить текущую яркость:

ddcutil getvcp 10

И поменять яркость монитора:

ddcutil setvcp 10 50

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

https://www.reddit.com/r/gnome/comments/efkoya/using_ddccidriverlinux_you_can_get_native/
Тут по желанию  можно даже остановиться и установить Gnome extension https://extensions.gnome.org/extension/2645/brightness-control-using-ddcutil/
Вариант рабочий, но не выполняет в полной мере задачу. Нет регулировки с кнопок. Но если яркость нативно не появилась - сойдёт.

Добавим устройства, как подсветку в системе

Добавим два дополнительных файла, правила которые запускают сервис для всех найденных устройств и будут подсоединять устройства в систему если driver не смог:

sudo nano /etc/udev/rules.d/99-ddcci.rules

SUBSYSTEM=="i2c-dev", ACTION=="add",\
	ATTR{name}=="NVIDIA i2c adapter*",\
	TAG+="ddcci",\
	TAG+="systemd",\
	ENV{SYSTEMD_WANTS}+="ddcci@$kernel.service"
99-ddcci.rules

И сервис который мы будем вызывать из правил:

sudo nano /etc/systemd/system/ddcci@.service

[Unit]
Description=ddcci handler
After=graphical.target
Before=shutdown.target
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo Trying to attach ddcci to %i && success=0 && i=0 && id=$(echo %i | cut -d "-" -f 2) && while ((success < 1)) && ((i++ < 5)); do /usr/bin/ddcutil getvcp 10 -b $id && { success=1 && echo ddcci 0x37 > /sys/bus/i2c/devices/%i/new_device && echo "ddcci attached to %i"; } || sleep 5; done'
Restart=no
ddcci@.service

Управление яркостью с помощью кнопок яркости (если после перезагрузки не заработало)

Для этого я просто установил данный проект:

jmesmon/illum
Daemon that wires button presses to screen backlight level - jmesmon/illum
   yay -S illum-git

И запускаем и активируем автозапуск сервиса

   systemctl enable illum.service
   systemctl start illum.service

Перезагружаемся и теперь всё должно заработать и яркость будет изменяться с клавиш яркости.

Бонус!

Если у вас MacOS я рекомендую использовать

the0neyouseek/MonitorControl
🖥 Control your external monitor brightness & volume on your Mac - the0neyouseek/MonitorControl

А если Windows есть схожая, но вот только автор зажал возможность горячих клавиш под платную версию

emoacht/Monitorian
A Windows desktop tool to adjust the brightness of multiple monitors with ease - emoacht/Monitorian

И есть ещё один для windows

xanderfrangos/twinkle-tray
Easily manage the brightness of your monitors in Windows from the system tray - xanderfrangos/twinkle-tray