Backlight: Difference between revisions

From ArchWiki
m (→‎Backlight utilities: Add comments about light)
m (fix broken links and some style)
 
(43 intermediate revisions by 20 users not shown)
Line 1: Line 1:
[[Category:Display control]]
[[Category:Laptops]]
[[Category:Laptops]]
[[Category:Power management]]
[[ja:バックライト]]
[[ja:バックライト]]
[[ru:Backlight]]
[[ru:Backlight]]
Line 31: Line 31:


{{hc|$ ls /sys/class/backlight/acpi_video0/|
{{hc|$ ls /sys/class/backlight/acpi_video0/|
actual_brightness  brightness        max_brightness    subsystem/    uevent            
actual_brightness  brightness        max_brightness    subsystem/    uevent
bl_power          device/            power/            type
bl_power          device/            power/            type
}}
}}
Line 45: Line 45:
  # echo 5 > /sys/class/backlight/acpi_video0/brightness
  # echo 5 > /sys/class/backlight/acpi_video0/brightness


By default, only {{ic|root}} can change the brightness by this method. To allow users in the {{ic|video}} group to change the brightness, a [[udev]] rule such as the following can be used:
By default, only {{ic|root}} can change the brightness by this method. To allow users in the {{ic|video}} group to change the brightness, a [[udev]] rule such as the following can be used (Logging out/Rebooting may be necessary to changes take effects):


{{hc|/etc/udev/rules.d/backlight.rules|2=
{{hc|/etc/udev/rules.d/backlight.rules|2=
Line 55: Line 55:
==== Kernel command-line options ====
==== Kernel command-line options ====


Sometimes ACPI does not work well due to different motherboard implementations and ACPI quirks. This results in, for instance, inaccurate brightness notifications. This includes some laptops with dual graphics (e.g., Nvidia/Radeon dedicated GPU with Intel/AMD integrated GPU). Additionally, ACPI sometimes needs to register its own {{ic|acpi_video0}} backlight even if one already exists (such as {{ic|intel_backlight}}), which can be done by adding one of the following [[kernel parameters]]:
Sometimes ACPI does not work well due to different motherboard implementations and ACPI quirks. This results in, for instance, inaccurate brightness notifications. This includes some laptops with dual graphics (e.g., NVIDIA/AMD dedicated GPU with Intel/AMD integrated GPU). Additionally, ACPI sometimes needs to register its own {{ic|acpi_video0}} backlight even if one already exists (such as {{ic|intel_backlight}}), which can be done by adding one of the following [[kernel parameters]]:


  acpi_backlight=video
  acpi_backlight=video
  acpi_backlight=vendor
  acpi_backlight=vendor
  acpi_backlight=native
  acpi_backlight=native
If you find that changing the {{ic|acpi_video0}} backlight does not actually change the brightness, you may need to use {{ic|1=acpi_backlight=none}}.


{{Tip|
{{Tip|
Line 67: Line 65:
* On an Asus notebooks you might also need to load the {{ic|asus-nb-wmi}} [[kernel module]].
* On an Asus notebooks you might also need to load the {{ic|asus-nb-wmi}} [[kernel module]].
* Disabling legacy boot on Dell XPS13 breaks backlight support.
* Disabling legacy boot on Dell XPS13 breaks backlight support.
* Since Linux 6.1 the backlight subsystem was [https://hansdegoede.livejournal.com/26427.html revamped], if your backlight does not work after an update first try to remove an existing {{ic|acpi_backlight}} kernel parameter. On some Optimus laptops, you can try booting with {{ic|1=acpi_backlight=nvidia_wmi_ec}}.
}}
}}


Line 92: Line 91:
=== External monitors ===
=== External monitors ===


[[Wikipedia:Display_Data_Channel#DDC.2FCI|DDC/CI]] (Display Data Channel Command Interface) can be used to communicate with external monitors implementing MCCS (Monitor Control Command Set) over I2C. DDC can control brightness, contrast, inputs, etc on supported monitors. Settings available via the OSD (On-Screen Display) panel can usually also be managed via DDC. The [[kernel module]] {{ic|i2c-dev}} may need to be loaded if the {{ic|/dev/i2c-*}} devices do not exist.
''Display Data Channel Command Interface ([[Wikipedia:Display Data Channel#DDC/CI|DDC/CI]])'' can be used to communicate with external monitors implementing ''Monitor Control Command Set (MCCS)'' over [[I2C]]. ''DDC'' can control brightness, contrast, inputs, etc on supported monitors. Settings available via the ''On-Screen Display (OSD)'' panel can usually also be managed via ''DDC''. The [[kernel module]] {{ic|i2c-dev}} may need to be loaded if the {{ic|/dev/i2c-*}} devices do not exist.


{{Pkg|ddcutil}} can be used to query and set brightness settings:
{{Pkg|ddcutil}} can be used to query and set brightness settings:
Line 106: Line 105:
  # ddcutil setvcp 10 70
  # ddcutil setvcp 10 70


Alternatively, one may use {{AUR|ddcci-driver-linux-dkms}} to expose external monitors in sysfs. Then, after loading the {{ic|ddcci}} [[kernel module]], one can use any [[#Backlight utilities|backlight utility]].
Alternatively, one may use {{AUR|ddcci-driver-linux-dkms}} to expose external monitors in ''sysfs''. Then, after loading the {{ic|ddcci}} [[kernel module]], one can use any [[#Backlight utilities|backlight utility]].


{{Note|
{{Note|
* Using {{ic|ddcci}} and {{ic|i2c-dev}} simultaneously may result in resource conflicts such as a {{ic|Device or resource busy}} error.
* Using {{ic|ddcci}} and {{ic|i2c-dev}} simultaneously may result in resource conflicts such as a {{ic|Device or resource busy}} error.
* Users of NVIDIA's proprietary drivers may need to add {{ic|1=Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"}} to the {{ic|Device}} section in {{ic|/etc/X11/xorg.conf.d/20-nvidia.conf}} (generated by ''nvidia-xconfig'') or {{ic|1=options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100}} to {{ic|/etc/modprobe/conf.d/nvidia.conf}}. Confirm that the settings are correctly applied with {{ic|grep RegistryDwords /proc/driver/nvidia/params}} and check that the values are not empty. See [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/33] and [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/61]
* Users of NVIDIA's proprietary drivers may need to add {{ic|1=Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"}} to the {{ic|Device}} section in the [[NVIDIA#Xorg configuration|Xorg configuration]] or the {{ic|1=NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100}} [[kernel module parameter]] for the {{ic|nvidia}} module. See [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/33] and [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/61].
* {{ic|ddcutil}} will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g. [[Wikipedia:Contrast ratio#Dynamic contrast (DC)|Dynamic Contrast Ratio]] or BenQ's ''Eye Care'' technology).
* {{ic|ddcutil}} will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g. [[Wikipedia:Contrast ratio#Dynamic contrast (DC)|Dynamic Contrast Ratio]] or BenQ's ''Eye Care'' technology).
* To facilitate binding screen brightness control to a keyboard shortcut, it may be convenient to enable non-superuser access to the relevant I2C devices. This can be achieved by adding a group {{ic|i2c}} and configuring [[udev]] to set this group as the owner of the I2C devices. See [https://raspberrypi.stackexchange.com/a/4472].
* To facilitate binding screen brightness control to a keyboard shortcut, it may be convenient to enable non-superuser access to the relevant ''I2C'' devices. This can be achieved by adding a group {{ic|i2c}} and configuring [[udev]] to set this group as the owner of the ''I2C'' devices. See [https://raspberrypi.stackexchange.com/a/4472].
* If {{Pkg|ddcutil}} is installed, it provides the {{ic|/usr/share/ddcutil/data/90-nvidia-i2c.conf}} file, which can be copied to {{ic|/etc/X11/xorg.conf.d/}} instead of manually editing [[Xorg]] configuration files. It also provides {{ic|/usr/share/ddcutil/data/45-ddcutil-i2c.rules}} and {{ic|/usr/share/ddcutil/data/45-ddcutil-usb.rules}} for [[udev]] rules.
* If {{Pkg|ddcutil}} is installed, it provides the {{ic|/usr/share/ddcutil/data/90-nvidia-i2c.conf}} file, which can be copied to {{ic|/etc/X11/xorg.conf.d/}} instead of manually editing [[Xorg]] configuration files. It also provides {{ic|/usr/share/ddcutil/data/60-ddcutil-i2c.rules}} and {{ic|/usr/share/ddcutil/data/60-ddcutil-usb.rules}} for [[udev]] rules.
}}
}}


Line 142: Line 141:
{{Note|Some laptops have multiple video cards (e.g. Optimus) and the backlight restoration fails. Try [[systemd#Using units|masking]] an instance of the service (e.g. {{ic|systemd-backlight@backlight:acpi_video1}} for {{ic|acpi_video1}}).}}
{{Note|Some laptops have multiple video cards (e.g. Optimus) and the backlight restoration fails. Try [[systemd#Using units|masking]] an instance of the service (e.g. {{ic|systemd-backlight@backlight:acpi_video1}} for {{ic|acpi_video1}}).}}


Additionally, the {{AUR|brillo}} and {{Pkg|light}} utilities support save and restore functionality. These two may be more useful if one wishes to restore the screen brightness on a per-user basis, however no systemd units are provided to accomplish this.
Additionally, the {{AUR|brillo}} and {{AUR|light}} utilities support save and restore functionality. These two may be more useful if one wishes to restore the screen brightness on a per-user basis, however no systemd units are provided to accomplish this.


== Backlight utilities ==
== Backlight utilities ==


{{Note|The utilities in the following table can be used to control screen brightness. All of them are compatible with Wayland and do not require X. Some (like {{Pkg|brightnessctl}} or {{Pkg|light}}) add udev rules to allow members of the {{ic|video}} (or {{ic|input}}) group to modify brightness.}}
{{Note|The utilities in the following table can be used to control screen brightness. All of them are compatible with Wayland and do not require X. Some (like {{Pkg|brightnessctl}} or {{AUR|light}}) add udev rules to allow members of the {{ic|video}} (or {{ic|input}}) group to modify brightness.}}


{| class="wikitable sortable"
{| class="wikitable sortable"
Line 219: Line 218:
| Reacts to key presses.
| Reacts to key presses.
|-
|-
| {{Pkg|light}}
| {{AUR|light}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
Line 236: Line 235:
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| Bash,Perl
| Bash
| GPL
| GPL
| Macbook screen/keyboard backlight CLI and auto-adjust on ambient light.
| Macbook screen/keyboard backlight CLI and auto-adjust on ambient light.
Line 260: Line 259:
| GPL-2.0
| GPL-2.0
| Small Perl script similar to xbacklight but using sysfs drivers.
| Small Perl script similar to xbacklight but using sysfs drivers.
|-  
|-
| {{AUR|xbacklight-notify}}
| {{AUR|xbacklight-notify}}
| {{No}}
| {{No}}
Line 266: Line 265:
| C
| C
| MIT
| MIT
| Simple notifification daemon
| Simple notification daemon for X11 (reads the RandR backlight property)
|-
| {{AUR|acpi-backlight-notify}}
| {{No}}
| {{No}}
| C
| MIT
| Simple notification daemon for the ACPI interface (reads {{ic|/sys/class/backlight/}})
|}
|}


Line 276: Line 282:


{{Note|1=<nowiki/>
{{Note|1=<nowiki/>
* xbacklight only works with [[Intel]]. Other drivers (e.g. [[Radeon]]) did not add support for the RandR backlight property.  
* xbacklight only works with [[Intel]]. Other drivers did not add support for the RandR backlight property.
* xbacklight currently does not work with the modesetting driver [https://gitlab.freedesktop.org/xorg/xserver/issues/47].
* xbacklight currently does not work with the modesetting driver [https://gitlab.freedesktop.org/xorg/xserver/issues/47].
}}
}}
Line 306: Line 312:
=== light ===
=== light ===


Install {{Pkg|light}} and add your user to the {{ic|video}} group.
{{Note|The [https://web.archive.org/web/20231031165455/https://github.com/haikarainen/light GitHub page for light] states: ''This project is considered orphaned since the 8th of March, 2023. Use is heavily discouraged until such a time that it is adopted by another developer.''}}
 
Install {{AUR|light}} and add your user to the {{ic|video}} [[user group]].


Increase backlight brightness by 5 percent:
Increase backlight brightness by 5 percent:
Line 357: Line 365:


* On [[GNOME]], the built-in [[GNOME#Night Light|Night Light]] can be used.
* On [[GNOME]], the built-in [[GNOME#Night Light|Night Light]] can be used.
* On [[KDE Plasma]], the built-in [[KDE#Night Color]] can be used.
* On [[KDE Plasma]], the built-in [[KDE#Night Light]] can be used.
* On Sway 1.0 and other wlroots-based compositors, as well as Orbital, Redshift fork {{Pkg|gammastep}}, {{AUR|clight}}, {{AUR|wlsunset-git}}, or {{AUR|wl-gammarelay}} can be used.
* On Sway and other wlroots-based compositors, as well as Orbital, Redshift fork {{Pkg|gammastep}}, {{AUR|clight}}, {{AUR|wlsunset-git}}, or {{AUR|wl-gammarelay}} can be used.
 
{{Note|KDE does not have a working night color mode with Wayland on [[NVIDIA]] GPUs, due to NVIDIA’s drivers not supporting some gamma LUT (Look-Up Table) features. See the [https://github.com/NVIDIA/open-gpu-kernel-modules/issues/162 issue 162] on NVIDIA’s opensource driver GitHub and [https://pointieststick.com/2023/05/26/this-week-in-kde-night-color-on-wayland-with-nvidia/ this news] to see KDE devs’ attempts to make it work.}}


=== Xorg: adjust perceived brightness with xrandr ===
=== Xorg: adjust perceived brightness with xrandr ===


[[xrandr]] may be used to adjust the perceived brightness.  
[[xrandr]] may be used to adjust the perceived brightness.


To adjust perceived brightness above its maximum level (the same caveats mentioned above for Nvidia apply):
To adjust perceived brightness above its maximum level (the same caveats mentioned above for Nvidia apply):
Line 378: Line 388:
Users may find it convenient to implement this as an alias:
Users may find it convenient to implement this as an alias:


  $ alias b='echo -e "enter brightness:\n"; read val; xrandr --output ''output name'' --brightness "${val}"'
  $ alias b='echo -e "enter brightness:\n"; read val; xrandr --output ''output name'' --brightness "${val}"'


To automatically call xrandr when a backlight file changes, {{aur|oled_shmoled}} can be used like so:
To automatically call xrandr when a backlight file changes, {{AUR|oled_shmoled}} can be used like so:


  $ oled_shmoled ''output_name''
  $ oled_shmoled ''output_name''
Line 392: Line 402:
=== Backlight PWM modulation frequency (Intel i915 only) ===
=== Backlight PWM modulation frequency (Intel i915 only) ===


{{Accuracy|Modern LED display using IPS panel usually utilize DC dimming instead of PWM dimming. This can be indicated by the two upper bytes of 0xC8254 register 0x0001, which means the frequency is almost infinity.}}
{{Expansion|Modern LED display using IPS panel usually utilize DC dimming instead of PWM dimming. This can be indicated by the two upper bytes of 0xC8254 register 0x0001, which means the frequency is almost infinity.}}


Laptops with LED backlight are known to have screen flicker sometimes. This is because the most efficient way of controlling LED backlight brightness is by turning the LED's on and off very quickly varying the amount of time they are on.  
Laptops with LED backlight are known to have screen flicker sometimes. This is because the most efficient way of controlling LED backlight brightness is by turning the LED's on and off very quickly varying the amount of time they are on.


However, the frequency of the switching, so-called PWM (pulse-width modulation) frequency, may not be high enough for the eye to perceive it as a single brightness and instead see flickering. This causes some people to have symptoms such as headaches and eyestrain.
However, the frequency of the switching, so-called PWM (pulse-width modulation) frequency, may not be high enough for the eye to perceive it as a single brightness and instead see flickering. This causes some people to have symptoms such as headaches and eyestrain.
Line 400: Line 410:
If you have an Intel i915 GPU, then it may be possible to adjust PWM frequency to eliminate flicker.
If you have an Intel i915 GPU, then it may be possible to adjust PWM frequency to eliminate flicker.


Period of PWM (inverse to frequency) is stored in 2 higher bytes of {{ic|0xC8254}} register (if you are using the Intel GM45 chipset use address {{ic|0x61254}} instead). To manipulate registers values install {{Pkg|intel-gpu-tools}} from the official repositories.
Period of PWM (inverse to frequency) is stored in 2 higher bytes of {{ic|0xC8254}} register (if you are using the Intel GM45 chipset use address {{ic|0x61254}} instead). To manipulate registers values, [[install]] the {{Pkg|intel-gpu-tools}} package.


To increase the frequency, period must be reduced. For example:
To increase the frequency, period must be reduced. For example:
Line 420: Line 430:
Symptoms:
Symptoms:


* after installing {{pkg|xf86-video-intel}} systemd-backlight.service turns off the backlight during boot
* after installing {{Pkg|xf86-video-intel}} systemd-backlight.service turns off the backlight during boot
** possible solution: mask systemd-backlight.service
** possible solution: mask systemd-backlight.service
* switching from X to another VT turns the backlight off
* switching from X to another VT turns the backlight off
Line 435: Line 445:
To set the backlight through writes to DPCD registers using the AUX channel set {{ic|1=i915.enable_dpcd_backlight=1}} as a [[kernel parameter]].
To set the backlight through writes to DPCD registers using the AUX channel set {{ic|1=i915.enable_dpcd_backlight=1}} as a [[kernel parameter]].


{{Note|The parameter changed from bool to int in {{pkg|linux}} 5.4.}}
{{Note|The parameter changed from bool to int in {{Pkg|linux}} 5.4.}}


=== sysfs modified but no brightness change ===
=== sysfs modified but no brightness change ===
Line 458: Line 468:
luminance() {
luminance() {
     read -r level < "$path"/actual_brightness
     read -r level < "$path"/actual_brightness
     factor=$((100 / max))
     factor=$(printf "$max" | awk '{print 100/$1}')
     printf '%d\n' "$((level * factor))"
     printf "$level $factor" | awk '{print int($1*$2)}'
}
}


Line 470: Line 480:
done
done
</nowiki>}}
</nowiki>}}
=== sysfs and xbacklight both not working ===
check dmesg if you have seen like this :
{{ic|i915 0000:00:02.0: [drm] *ERROR* [CONNECTOR:114:DSI-1] Failed to get the SoC PWM chip}}
Change {{ic|/etc/mkinitcpio.conf}} to match the following:
{{hc|/etc/mkinitcpio.conf|2=
...
MODULES=(i915 pwm-lpss-platform)
...
}}
Then [[regenerate the initramfs]].


=== Backlight not working in MATE ===
=== Backlight not working in MATE ===
Line 513: Line 539:
[Service]
[Service]
Type=oneshot
Type=oneshot
ExecStart=<path to the script above>
ExecStart=''/path/to/fix-brightness.sh''


[Install]
[Install]
Line 543: Line 569:
[Service]
[Service]
Type=oneshot
Type=oneshot
ExecStart=<path to the script above>
ExecStart=''/path/to/fix-brightness.sh''


[Install]
[Install]
WantedBy=final.target
WantedBy=final.target
}}
=== Allow <5% brightness to persist on reboot (disable backlight clamp) ===
According to {{man|8|systemd-backlight@.service}}, if the udev property {{ic|ID_BACKLIGHT_CLAMP}} is not set to false, the brightness is clamped to a value of at least 1 or 5% of maximum brightness, whichever is greater. This restriction will be removed when the kernel allows user space to reliably set a brightness value which does not turn off the display.
To allow <5% brightness to persist on reboot, create [[udev]] rule:
{{hc|/etc/udev/rules.d/99-backlight_clamp.rules|2=
# Allow <5% brightness to persist on reboot (disable clamped value of 5%)
SUBSYSTEM=="backlight", ENV{ID_BACKLIGHT_CLAMP}="0"
}}
}}

Latest revision as of 14:23, 29 April 2024

Screen brightness might be tricky to control. On some machines physical hardware switches are missing and software solutions may not work well. However, it is generally possible to find a functional method for a given hardware. This article aims to summarize all possible ways to adjust the backlight.

There are many ways to control brightness of a monitor, laptop or integrated panel (such as the iMac). According to these discussions and this wiki page the control method can be divided into these categories:

  • brightness is controlled by vendor-specified hotkey and there is no interface for the OS to adjust the brightness.
  • brightness is controlled by either the ACPI, graphic or platform driver. In this case, backlight control is exposed to the user through /sys/class/backlight which can be used by user-space backlight utilities.
  • brightness is controlled by writing into a graphic card register through setpci.
Note: Since OLED screens have no backlight, brightness cannot be controlled by changing backlight power on laptops equipped with an OLED screen. In this case, perceived screen brightness can be adjusted with a PWM control (not implemented in the Linux kernel) or via software color correction.

Hardware interfaces

ACPI

The brightness of the screen backlight is adjusted by setting the power level of the backlight LEDs or cathodes. The power level can often be controlled using the ACPI kernel module for video. An interface to this module is provided via a sysfs(5) directory at /sys/class/backlight/.

The name of the directory depends on the graphics card model.

$ ls /sys/class/backlight/
acpi_video0

In this case, the backlight is managed by an ATI graphics card. In the case of an Intel card, the directory is called intel_backlight. In the following examples, acpi_video0 is used. If you use an Intel card, simply replace acpi_video0 with intel_backlight in the examples.

The directory contains the following files and subdirectories:

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

The maximum brightness can be displayed by reading from max_brightness, which is often 15.

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

The brightness can be set by writing a number to brightness. Attempting to set a brightness greater than the maximum results in an error.

# echo 5 > /sys/class/backlight/acpi_video0/brightness

By default, only root can change the brightness by this method. To allow users in the video group to change the brightness, a udev rule such as the following can be used (Logging out/Rebooting may be necessary to changes take effects):

/etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness"

The factual accuracy of this article or section is disputed.

Reason: Explain why it is not possible to alter file permissions with GROUP="video", MODE="0664". (Discuss in Talk:Backlight#Udev rules for permissions of brightness doesn't work)

Kernel command-line options

Sometimes ACPI does not work well due to different motherboard implementations and ACPI quirks. This results in, for instance, inaccurate brightness notifications. This includes some laptops with dual graphics (e.g., NVIDIA/AMD dedicated GPU with Intel/AMD integrated GPU). Additionally, ACPI sometimes needs to register its own acpi_video0 backlight even if one already exists (such as intel_backlight), which can be done by adding one of the following kernel parameters:

acpi_backlight=video
acpi_backlight=vendor
acpi_backlight=native
Tip:
  • On Nvidia Optimus laptops, the kernel parameter nomodeset can interfere with the ability to adjust the backlight.
  • On an Asus notebooks you might also need to load the asus-nb-wmi kernel module.
  • Disabling legacy boot on Dell XPS13 breaks backlight support.
  • Since Linux 6.1 the backlight subsystem was revamped, if your backlight does not work after an update first try to remove an existing acpi_backlight kernel parameter. On some Optimus laptops, you can try booting with acpi_backlight=nvidia_wmi_ec.

Udev rule

If the ACPI interface is available, the backlight level can be set at boot using a udev rule:

/etc/udev/rules.d/81-backlight.rules
# Set backlight level to 8
SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="8"
Note: The systemd-backlight service restores the previous backlight brightness level at boot. To prevent conflicts for the above rules, see #Save and restore functionality.
Tip: To set the backlight depending on power state, see Power management#Using a script and an udev rule and use your favourite backlight utility in the script.

setpci

In some cases (e.g. Intel Mobile 945GME [1]), it is possible to set the register of the graphic card to adjust the backlight. It means you adjust the backlight by manipulating the hardware directly, which can be risky and generally is not a good idea. Not all of the graphic cards support this method.

When using this method, you need to use lspci first to find out where your graphic card is.

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

External monitors

Display Data Channel Command Interface (DDC/CI) can be used to communicate with external monitors implementing Monitor Control Command Set (MCCS) over I2C. DDC can control brightness, contrast, inputs, etc on supported monitors. Settings available via the On-Screen Display (OSD) panel can usually also be managed via DDC. The kernel module i2c-dev may need to be loaded if the /dev/i2c-* devices do not exist.

ddcutil can be used to query and set brightness settings:

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

Alternatively, one may use ddcci-driver-linux-dkmsAUR to expose external monitors in sysfs. Then, after loading the ddcci kernel module, one can use any backlight utility.

Note:
  • Using ddcci and i2c-dev simultaneously may result in resource conflicts such as a Device or resource busy error.
  • Users of NVIDIA's proprietary drivers may need to add Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100" to the Device section in the Xorg configuration or the NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100 kernel module parameter for the nvidia module. See [2] and [3].
  • ddcutil will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g. Dynamic Contrast Ratio or BenQ's Eye Care technology).
  • To facilitate binding screen brightness control to a keyboard shortcut, it may be convenient to enable non-superuser access to the relevant I2C devices. This can be achieved by adding a group i2c and configuring udev to set this group as the owner of the I2C devices. See [4].
  • If ddcutil is installed, it provides the /usr/share/ddcutil/data/90-nvidia-i2c.conf file, which can be copied to /etc/X11/xorg.conf.d/ instead of manually editing Xorg configuration files. It also provides /usr/share/ddcutil/data/60-ddcutil-i2c.rules and /usr/share/ddcutil/data/60-ddcutil-usb.rules for udev rules.

Switch off the backlight

This article or section is a candidate for merging with DPMS.

Notes: Same topic. (Discuss in Talk:Backlight)

Switching off the backlight (for example when one locks a notebook) can be useful to conserve battery energy. Ideally the following command should work for any Xorg graphical session:

$ xset dpms force off

The backlight should switch on again on mouse movement or keyboard input. Alternately, xset s could be used for a similar effect.

If the previous commands do not work, there is a chance that vbetool may work. Note, however, that in this case the backlight must be manually activated again. The command is as follows:

$ vbetool dpms off

To activate the backlight again:

$ vbetool dpms on

For example, this can be put to use when closing the notebook lid using acpid.

Save and restore functionality

The systemd package includes the service systemd-backlight@.service, which is enabled by default and "static". It saves the backlight brightness level at shutdown and restores it at boot. The service uses the ACPI method described in #ACPI, generating services for each folder found in /sys/class/backlight/. For example, if there is a folder named acpi_video0, it generates a service called systemd-backlight@backlight:acpi_video0.service. When using other methods of setting the backlight at boot, it is recommended to stop systemd-backlight from restoring the backlight by setting the kernel parameters parameter systemd.restore_state=0. See systemd-backlight@.service(8) for details.

Note: Some laptops have multiple video cards (e.g. Optimus) and the backlight restoration fails. Try masking an instance of the service (e.g. systemd-backlight@backlight:acpi_video1 for acpi_video1).

Additionally, the brilloAUR and lightAUR utilities support save and restore functionality. These two may be more useful if one wishes to restore the screen brightness on a per-user basis, however no systemd units are provided to accomplish this.

Backlight utilities

Note: The utilities in the following table can be used to control screen brightness. All of them are compatible with Wayland and do not require X. Some (like brightnessctl or lightAUR) add udev rules to allow members of the video (or input) group to modify brightness.
Package name Controls keyboard backlights Reacts to ambient brightness Language License Notes
acpilight Yes No Python3 GPL-3.0-or-later "xbacklight" executable provided
backlight_controlAUR No No C MIT Extremely small and simple. Supports relative adjustments.
blightAUR Yes No Python3 ISC Uses logind interface. Restricted to local users, but does not require suid or video group membership.
brightdAUR No No C GPL-2.0 Dims the screen when there is no user input for some time.
brightnessctl Yes No C MIT -
brilloAUR Yes No C GPL-3.0-only Supports smooth and relative adjustments.
clightAUR Yes Yes C GPL-3.0-or-later Manages screen temperature (Xorg only) and smoothly dims brightness after a timeout. Supports ambient light sensors [5]. Can turn webcam into an ambient light sensor.
enlighten-gitAUR Yes No C GPL-3.0-or-later -
illum-gitAUR No No C AGPL-3.0 Reacts to key presses.
lightAUR Yes No C GPL-3.0-only Dependency free. Does not rely on X server.
luxAUR No No Shell MIT -
macbook-lighterAUR Yes Yes Bash GPL Macbook screen/keyboard backlight CLI and auto-adjust on ambient light.
wlr-brightness-gitAUR No No C MIT Also supports newer OLED displays that need gamma adjustment. Uses wlroots.
wlumaAUR Yes Yes Rust ISC Automatic brightness adjustment based on screen contents and ambient light. Can use webcam or time to simulate ambient light sensor. Supports keyboards and external monitors. Uses wlroots.
ybacklightAUR No No Perl GPL-2.0 Small Perl script similar to xbacklight but using sysfs drivers.
xbacklight-notifyAUR No No C MIT Simple notification daemon for X11 (reads the RandR backlight property)
acpi-backlight-notifyAUR No No C MIT Simple notification daemon for the ACPI interface (reads /sys/class/backlight/)
Tip: Commands involving these utilities can be bound to the XF86MonBrightnessUp and XF86MonBrightnessDown keyboard keys as described in Keyboard shortcuts#Xorg.

xbacklight

Brightness can be set using the xorg-xbacklight package.

Note:
  • xbacklight only works with Intel. Other drivers did not add support for the RandR backlight property.
  • xbacklight currently does not work with the modesetting driver [6].

To set brightness to 50% of maximum:

$ xbacklight -set 50

Increments can be used instead of absolute values, for example to increase or decrease brightness by 10%:

$ xbacklight -inc 10
$ xbacklight -dec 10

If you get the "No outputs have backlight property" error, it is because xrandr/xbacklight does not choose the right directory in /sys/class/backlight. You can specify the directory by setting the Backlight option of the device section in /etc/X11/xorg.conf.d/20-video.conf. For instance, if the name of the directory is intel_backlight and using the Intel driver, the device section may be configured as follows:

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
    Identifier  "Intel Graphics"
    Driver      "intel"
    Option      "Backlight"  "intel_backlight"
EndSection
Note: Using this with an iGPU+dGPU setup can cause unpredictable screen update lag and/or flickering in user interface items inside apps that are offloaded to the dGPU. Only use this if all else fails.

See FS#27677 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=651741 for details.

If you have enabled Intel Fastboot you might also get the No outputs have backlight property error. In this case, trying the above method may cause Xorg to crash on start up. You should disable it to fix the issue. It is known to cause issues with brightness control.

light

Note: The GitHub page for light states: This project is considered orphaned since the 8th of March, 2023. Use is heavily discouraged until such a time that it is adopted by another developer.

Install lightAUR and add your user to the video user group.

Increase backlight brightness by 5 percent:

$ light -A 5

Decrease backlight brightness by 5 percent:

$ light -U 5

Set backlight brightness to 100 percent:

$ light -S 100

Using DBus with GNOME

Brightness can also be adjusted as the GNOME controls do. Changes are reflected in the GNOME UI using this method.

$ 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>"

Steps in brightness for keyboard control can be implemented with this method as well.

$ 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

Using DBus with KDE

See https://userbase.kde.org/KDE_Connect/Tutorials/Useful_commands#Brightness_settings.

Color correction

This article or section needs expansion.

Reason: Which utilities require Xorg and which work in Wayland? (Discuss in Talk:Backlight)

Color correction does not change the backlight power, it just modifies the video lookup table: this means that your battery life will be unaffected by the change. Nevertheless, it could be useful when no backlight control is available (desktop PCs or laptops with OLED screens).

  • Clight — User daemon utility that aims to fully manage your display. It can manage the screen temperature depending on the current time of the day, just like redshift does. It tries to use geoclue to retrieve the user position if neither latitude or longitude are set in the configuration file. It also supports fixed times for sunrise and sunset.
https://github.com/FedeDP/Clight || clightAUR
  • icc-brightness — Control OLED display brightness by applying ICC color profiles.
https://github.com/udifuchs/icc-brightness || icc-brightness-gnome-gitAUR
  • Monica — Monitor calibration tool. It works as frontend to xgamma to alter the gamma correction.
https://web.archive.org/web/20090815224839/http://www.pcbypaul.com/software/monica.html || monicaAUR
  • Redshift — Color temperature adjustment tool. It adjusts the color temperature of your screen according to your surroundings. This may help your eyes hurt less if you are working in front of the screen at night. This program is inspired by f.lux.
http://jonls.dk/redshift/ || redshift
  • xcalib — Lightweight monitor calibration loader which can load an ICC monitor profile to be shared across desktop applications.
https://github.com/OpenICC/xcalib || xcalib
  • xgamma — Alter a monitor's gamma correction.
https://xorg.freedesktop.org/ || xorg-xgamma

Wayland

Redshift does not support Wayland (without a patch or fork like redshift-wayland-gitAUR). But it is possible to apply the desired temperature in tty before starting a compositor. For example:

$ redshift -m drm -PO 3000

Otherwise some compositors can apply color correction during runtime:

Note: KDE does not have a working night color mode with Wayland on NVIDIA GPUs, due to NVIDIA’s drivers not supporting some gamma LUT (Look-Up Table) features. See the issue 162 on NVIDIA’s opensource driver GitHub and this news to see KDE devs’ attempts to make it work.

Xorg: adjust perceived brightness with xrandr

xrandr may be used to adjust the perceived brightness.

To adjust perceived brightness above its maximum level (the same caveats mentioned above for Nvidia apply):

$ xrandr --output output_name --brightness 2

This should roughly double luma in the image. It will sacrifice color quality for brightness, nevertheless it is particularly suited for situations where the ambient light is very bright (e.g. sunlight).

This can also be used to reduce perceived brightness in a dark room by specifying some value less than 1 (e.g. 0.5), this is useful when no backlight control is available (e.g. desktop PC).

The output name of the connected device may be determined by calling xrandr:

$ xrandr | grep -w connected | cut -f '1' -d ' '

Users may find it convenient to implement this as an alias:

$ alias b='echo -e "enter brightness:\n"; read val; xrandr --output output name --brightness "${val}"'

To automatically call xrandr when a backlight file changes, oled_shmoledAUR can be used like so:

$ oled_shmoled output_name

NVIDIA settings

Users of NVIDIA's proprietary drivers can change display brightness via the nvidia-settings utility under "X Server Color Correction." However, note that this has absolutely nothing to do with backlight (intensity), it merely adjusts the color output. (Reducing brightness this way is a power-inefficient last resort when all other options fail; increasing brightness spoils your color output completely, in a way similar to overexposed photos.)

Troubleshooting

Backlight PWM modulation frequency (Intel i915 only)

This article or section needs expansion.

Reason: Modern LED display using IPS panel usually utilize DC dimming instead of PWM dimming. This can be indicated by the two upper bytes of 0xC8254 register 0x0001, which means the frequency is almost infinity. (Discuss in Talk:Backlight)

Laptops with LED backlight are known to have screen flicker sometimes. This is because the most efficient way of controlling LED backlight brightness is by turning the LED's on and off very quickly varying the amount of time they are on.

However, the frequency of the switching, so-called PWM (pulse-width modulation) frequency, may not be high enough for the eye to perceive it as a single brightness and instead see flickering. This causes some people to have symptoms such as headaches and eyestrain.

If you have an Intel i915 GPU, then it may be possible to adjust PWM frequency to eliminate flicker.

Period of PWM (inverse to frequency) is stored in 2 higher bytes of 0xC8254 register (if you are using the Intel GM45 chipset use address 0x61254 instead). To manipulate registers values, install the intel-gpu-tools package.

To increase the frequency, period must be reduced. For example:

# intel_reg read 0xC8254
0xC8254 : 0x12281228

Then to double PWM frequency divide 2 higher bytes (4 higher hex digits) by 2 and write back resulting value, keeping lower bytes unchanged:

# intel_reg write 0xC8254 0x09141228

You can use online calculator to calculate desired value https://devbraindom.blogspot.com/2013/03/eliminate-led-screen-flicker-with-intel.html

To set new frequency automatically, consider writing an udev rule or install intelpwm-udevAUR.

Inverted Brightness (Intel i915 only)

Symptoms:

  • after installing xf86-video-intel systemd-backlight.service turns off the backlight during boot
    • possible solution: mask systemd-backlight.service
  • switching from X to another VT turns the backlight off
  • the brightness keys are inverted (i.e. turning up the brightness makes the screen darker)

This problem may be solved by adding i915.invert_brightness=1 to the list of kernel parameters.

Unable to control eDP Panel brightness (Intel i915 only)

Embedded Display Port (eDP) v1.2 introduced a new display panel control protocol for backlight and other controls that works through the AUX channel [7]

By default the i915 driver tries to use PWM to control backlight brightness, which might not work.

To set the backlight through writes to DPCD registers using the AUX channel set i915.enable_dpcd_backlight=1 as a kernel parameter.

Note: The parameter changed from bool to int in linux 5.4.

sysfs modified but no brightness change

Note: This behavior and their workarounds have been confirmed on the Dell M6700 with Nvidia K5000m (BIOS version prior to A10) and Clevo P750ZM (Eurocom P5 Pro Extreme) with Nvidia 980m.

On some systems, the brightness hotkeys on your keyboard correctly modify the values of the acpi interface in /sys/class/backlight/acpi_video0/actual_brightness but the brightness of the screen is not changed. Brightness applets from desktop environments may also show changes to no effect.

If you have tested the recommended kernel parameters and only xbacklight works, then you may be facing an incompatibility between your BIOS and kernel driver.

In this case the only solution is to wait for a fix either from the BIOS or GPU driver manufacturer.

A workaround is to use the inotify kernel api to trigger xbacklight each time the value of /sys/class/backlight/acpi_video0/actual_brightness changes.

First install inotify-tools. Then create a script around inotify that will be launched upon each boot or through autostart.

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

path=/sys/class/backlight/acpi_video0

luminance() {
    read -r level < "$path"/actual_brightness
    factor=$(printf "$max" | awk '{print 100/$1}')
    printf "$level $factor" | awk '{print int($1*$2)}'
}

read -r max < "$path"/max_brightness

xbacklight -set "$(luminance)"

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

sysfs and xbacklight both not working

check dmesg if you have seen like this :

i915 0000:00:02.0: [drm] *ERROR* [CONNECTOR:114:DSI-1] Failed to get the SoC PWM chip

Change /etc/mkinitcpio.conf to match the following:

/etc/mkinitcpio.conf
...
MODULES=(i915 pwm-lpss-platform)
...

Then regenerate the initramfs.

Backlight not working in MATE

Make sure the mate-power-manager package is installed.

Backlight keys not working in Xfce

In xfce4, the Xfce4 Power Manager handles the brightness keys.

In some installations of Xfce, the "Handle display brightness keys" setting may be turned off by default.

To activate the brightness keys again, open the Xfce Power Manager dialog and toggle on "Handle display brightness keys":

$ xfce4-power-manager -c

xbacklight returns : No outputs have backlight property

Depending on the video card installed, sometimes xbacklight from xorg-xbacklight returns the message "No outputs have backlight property". Installing acpilight provides an alternative xbacklight that may work as expected.

Backlight is always at full brightness after a reboot with amdgpu driver

Due to a bug introduced recently in the amdgpu driver, the backlight's actual_brightness value is reported as a 16-bit integer, which is outside the 8-bit range specified in max_brightness. This causes the systemd-backlight service to attempt to restore, at boot time, a value that is too large and ends being truncated to maximum brightness (255).

While the bug is not addressed, one possible workaround is to modify the stored brightness to within the correct range before it is restored. This can be accomplished with a script and a service unit:

fix-brightness.sh
#!/bin/bash

# Change the line below according to your hardware
BRIGHTNESS_FILE="/var/lib/systemd/backlight/pci-0000:04:00.0:backlight:amdgpu_bl0"
BRIGHTNESS=$(cat "$BRIGHTNESS_FILE")
BRIGHTNESS=$(($BRIGHTNESS*255/65535))
BRIGHTNESS=${BRIGHTNESS/.*} # truncating to int, just in case
echo $BRIGHTNESS > "$BRIGHTNESS_FILE"
fix-brightness.service
[Unit]
Description=Convert 16-bit brightness values to 8-bit before systemd-backlight applies it
Before=systemd-backlight@backlight:amdgpu_bl0.service

[Service]
Type=oneshot
ExecStart=/path/to/fix-brightness.sh

[Install]
WantedBy=multi-user.target

On certain systems, the backlight level reported by the driver is in the correct range [0, 255], but systemd still fails to restore the correct value. This is probably due to a race in the kernel. In this case, truncating the brightness level will not help since it is already in the correct range. Instead, saving the brightness level to systemd before shutting down could work as a workaround. This can be accomplished by the following script and service unit:

fix-brightness.sh
#!/bin/sh

# Backlight level from systemd's perspective (change if needed)
readonly SYSTEMD_BACKLIGHT_FILE='/var/lib/systemd/backlight/pci-0000:04:00.0:backlight:amdgpu_bl0'

# Backlight level from AMDGPU driver
readonly AMDGPU_BACKLIGHT_FILE='/sys/class/backlight/amdgpu_bl0/brightness'

# Read current value from the driver and apply it to systemd
readonly AMDGPU_BACKLIGHT_VALUE=$(cat "$AMDGPU_BACKLIGHT_FILE")
echo "$AMDGPU_BACKLIGHT_VALUE" > "$SYSTEMD_BACKLIGHT_FILE"
fix-brightness.service
[Unit]
Description=Save brightness value from AMDGPU
DefaultDependencies=no
After=final.target

[Service]
Type=oneshot
ExecStart=/path/to/fix-brightness.sh

[Install]
WantedBy=final.target

Allow <5% brightness to persist on reboot (disable backlight clamp)

According to systemd-backlight@.service(8), if the udev property ID_BACKLIGHT_CLAMP is not set to false, the brightness is clamped to a value of at least 1 or 5% of maximum brightness, whichever is greater. This restriction will be removed when the kernel allows user space to reliably set a brightness value which does not turn off the display.

To allow <5% brightness to persist on reboot, create udev rule:

/etc/udev/rules.d/99-backlight_clamp.rules
# Allow <5% brightness to persist on reboot (disable clamped value of 5%)
SUBSYSTEM=="backlight", ENV{ID_BACKLIGHT_CLAMP}="0"