Backlight: Difference between revisions
m link to category instead of redirect page |
Hughobrien (talk | contribs) Add section on controlling external monitors |
||
Line 49: | Line 49: | ||
Example: <code>brightnessctl set 5%- -d intel_backlight</code> | Example: <code>brightnessctl set 5%- -d intel_backlight</code> | ||
== External Monitors == | |||
The DDC/CI (I2C) interface may be available to control the brightness of your external monitor. There are two ways to do this: | |||
=== Via <code>ddcutil</code> === | |||
<syntaxhighlight lang=shell> | |||
$ sudo modprobe i2c-dev | |||
$ nix-shell -p ddcutil --command "sudo ddcutil --bus=MYBUSNUM setvcp 10 MYBRIGHTNESSPCT" | |||
</syntaxhighlight> | |||
You can find the correct bus number by examining the paths in <code>/sys/bus/i2c/devices</code>. e.g. to control the <code>DP4</code> device below use device <code>17</code>. | |||
<syntaxhighlight lang=shell> | |||
$ ls -l /sys/bus/i2c/devices/ | |||
lrwxrwxrwx - root 2 Nov 12:34 i2c-13 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-eDP-1/i2c-13 | |||
lrwxrwxrwx - root 2 Nov 12:34 i2c-14 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-1/i2c-14 | |||
lrwxrwxrwx - root 2 Nov 12:34 i2c-15 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-2/i2c-15 | |||
lrwxrwxrwx - root 2 Nov 12:34 i2c-16 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-3/i2c-16 | |||
lrwxrwxrwx - root 2 Nov 12:34 i2c-17 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-4/i2c-17 | |||
</syntaxhighlight> | |||
All together: <syntaxhighlight lang=shell> | |||
nix-shell -p ddcutil --command "sudo ddcutil --bus=17 setvcp 10 65" | |||
</syntaxhighlight> | |||
You can then bind this to a hotkey or similar. <code>sudo</code> may be avoidable if your user is in the correct group, or udev rules have set the appropriate <code>/sys</code> permissions. | |||
=== Via <code>ddcci-driver</code> === | |||
A [https://gitlab.com/ddcci-driver-linux/ddcci-driver-linux driver] exists which exposes the ddcci control as a more standard <code>backlight</code> device, allowing it to be controlled by standard utilities such as <code>brightnessctl</code>. e.g. when setup: | |||
<syntaxhighlight lang=shell> | |||
$ find /sys/class/backlight | |||
/sys/class/backlight | |||
/sys/class/backlight/ddcci17 | |||
/sys/class/backlight/intel_backlight | |||
$ brightnessctl --device=ddcci17 set 100% | |||
Updated device 'ddcci17': | |||
Device 'ddcci17' of class 'backlight': | |||
Current brightness: 100 (100%) | |||
Max brightness: 100 | |||
</syntaxhighlight> | |||
Get the i2c name: | |||
<syntaxhighlight lang=shell> | |||
$ cat /sys/bus/i2c/devices/i2c-17/name | |||
AUX USBC4/DDI TC4/PHY TC4 | |||
</syntaxhighlight> | |||
<syntaxhighlight lang=nix> | |||
boot.extraModulePackages = with config.boot.kernelPackages; [ ddcci-driver ]; | |||
boot.kernelModules = [ "ddcci-backlight" ]; | |||
services.udev.extraRules = let | |||
bash = "${pkgs.bash}/bin/bash"; | |||
ddcciDev = "AUX USBC4/DDI TC4/PHY TC4"; | |||
ddcciNode = "/sys/bus/i2c/devices/i2c-17/new_device"; | |||
in '' | |||
SUBSYSTEM=="i2c", ACTION=="add", ATTR{name}=="${ddcciDev}", RUN+="${bash} -c 'sleep 30; printf ddcci\ 0x37 > ${ddcciNode}'" | |||
''; | |||
</syntaxhighlight> | |||
Device autodetection is tricky with i2c so we need to trigger it manually with the <code>0x37</code> code. The <code>sleep</code> is often unfortunately necessary. | |||
The driver has had some issues with kernels > 6.8, the below overlay should allow it to build if you encounter issues. | |||
<syntaxhighlight lang=nix> | |||
nixpkgs.overlays = [ | |||
(self: super: { | |||
linuxPackages_latest = super.linuxPackages_latest.extend (lpself: lpsuper: { | |||
ddcci-driver = super.linuxPackages_latest.ddcci-driver.overrideAttrs (oldAttrs: { | |||
version = super.linuxPackages_latest.ddcci-driver.version + "-FIXED"; | |||
src = pkgs.fetchFromGitLab { | |||
owner = "ddcci-driver-linux"; | |||
repo = "ddcci-driver-linux"; | |||
rev = "0233e1ee5eddb4b8a706464f3097bad5620b65f4"; | |||
hash = "sha256-Osvojt8UE+cenOuMoSY+T+sODTAAKkvY/XmBa5bQX88="; | |||
}; | |||
patches = [ | |||
(pkgs.fetchpatch { | |||
name = "ddcci-e0605c9cdff7bf3fe9587434614473ba8b7e5f63.patch"; | |||
url = "https://gitlab.com/nullbytepl/ddcci-driver-linux/-/commit/e0605c9cdff7bf3fe9587434614473ba8b7e5f63.patch"; | |||
hash = "sha256-sTq03HtWQBd7Wy4o1XbdmMjXQE2dG+1jajx4HtwBHjM="; | |||
}) | |||
]; | |||
}); | |||
}); | |||
}) | |||
]; | |||
</syntaxhighlight> | |||
== <code>/sys/class/backlight/...</code> == | == <code>/sys/class/backlight/...</code> == |