Backlight: Difference between revisions

Klinger (talk | contribs)
m link to category instead of redirect page
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> ==