3

OS : Ubuntu - 18.04 LTS

I have 2 symbolic links in /sys/class/backlight/ directory.

acpi_video0 -> ../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/backlight/acpi_video0/
nv_backlight -> ../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0/card0-LVDS-1/nv_backlight/

The brightness hotkeys change the value of acpi_video0/brightness. But that doesn't actually change the display's brightness.

But, manually changing the value ofnv_backlight/brightness actually change the display's brightness.

So, linking the hotkeys to nv_backlight instead of acpi_video0 will solve my problem, but I don't know how to do it.

Edit: The pop-up slider progress bar appears on the screen on the operation of the Fn keys for brightness(hotkeys).

Edit:

  1. Input:

    cat /sys/class/backlight/nv_backlight/max_brightness
    

    Output:

    100
    
  2. Input:

    cat /sys/class/backlight/nv_backlight/actual_brightness
    

    Output(this value changes automatically to the same value, I manually gave into /sys/class/backlight/nv_backlight/brightness):

    10
    
  3. Input:

    cat /sys/class/backlight/acpi_video0/max_brightness
    

    Output:

    15
    
9
  • When you operate the Fn keys for bright up/down does the pop up slider progress bar display on screen? Jun 11, 2018 at 22:34
  • Did you try acpi_backlight=vendor in the answer below? Did it work? Jun 12, 2018 at 22:48
  • No, when I do acpi_backlisht=vendor, the acpi_video0 option goes away and a new option sony comes in and the hotkeys reflect changes in sony/brightness, with no actual display brightness change. The nv_backlight option remains though and the manual changes to it still give me the actual change in brightness.
    – Alanpatchi
    Jun 13, 2018 at 4:55
  • OK. It's too late tonight but tomorrow night I'll start writing a script that will take changes to acpi_video0 and pump the equivalent percentage into nVidieo backlight. Jun 13, 2018 at 4:58
  • Thanks, WinEunuuchs2Unix. I tried redirecting the symbolic link. But it gives me an unauthorized operation error.
    – Alanpatchi
    Jun 13, 2018 at 5:07

1 Answer 1

5

Bash script redirect-brightness

Your problem is function keys to increase/decrease brightness are updating /sys/class/backlight/acpi_video0/brightness instead of /sys/class/backlight/nv_backlight/brightness

The original request was to intercept the function keys and use them to control the nv_backlight driver. The problem with this is:

  • Tricky udev scripts
  • No pop-up notification slider displaying brightness without complicated Python scripting.

The solution is to use inotify to monitor changes to acpi_video0. Then calculate the brightness percentage and apply that same percentage to nv_backlight.

In the bash script below you need to set:

WatchDriver="/sys/class/backlight/acpi_video0/brightness"
PatchDriver="/sys/class/backlight/nv_backlight/brightness"

Place the script in /usr/local/bin and make it executable using:

chmod a+x /usr/local/bin/redirect-brightness

First run the script from the command line using

redirect-brightness -l

If there is a problem check the log file using:

cat /tmp/redirect-brightness.log

If all works well add redirect-brightness to your startup applications.

redirect-brightness bash script

#!/bin/bash

# NAME: redirect-brightness
# PATH: /usr/local/bin
# DESC: Redirect to correct driver when Ubuntu is adjusting the wrong
#       /sys/class/DRIVER_NAME/brightness

# DATE: June 13, 2018. Modified June 14, 2018.

# NOTE: Written for Ubuntu question:
#       https://askubuntu.com/q/1045624/307523

WatchDriver="/sys/class/backlight/intel_backlight"
PatchDriver="/sys/class/backlight/intel_backlight"

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo >&2 "Root access required. Use: 'sudo redirect-brightness'"
    exit 1
fi

# inotifywait required
type inotifywait >/dev/null 2>&1 || \
    { echo >&2 "'inotifywait' required but it's not installed.  Aborting."; \
      echo >&2 "Use 'sudo apt install inotify-tools' to install it.'"; \
      exit 1; }

# Was right watch driver directory name setup correctly?
if [[ ! -d $WatchDriver ]]; then
    echo >&2 "Watch directory: '$WatchDriver'"; \
    echo >&2 "does not exist. Did you spell it correctly? Aborting.'"; \
    exit 1;
fi

# Was right patch driver directory name setup correctly?
if [[ ! -d $PatchDriver ]]; then
    echo >&2 "Redirect to directory: '$PatchDriver'"; \
    echo >&2 "does not exist. Did you spell it correctly? Aborting.'"; \
    exit 1;
fi

# Get maximum brightness values
WatchMax=$(cat $WatchDriver/max_brightness)
PatchMax=$(cat $PatchDriver/max_brightness)

# PARM: 1="-l" or "--log-file" then write each step to log file.
fLogFile=false
if [[ $1 == "-l" ]] || [[ $1 == "--log-file" ]]; then
    fLogFile=true
    LogFile=/tmp/redirect-brightness.log
    echo redirect-brightness LOG FILE > $LogFile
    echo WatchMax: $WatchMax PatchMax: $PatchMax >> $LogFile
fi

SetBrightness () {
    # Calculate watch current percentage
    WatchAct=$(cat $WatchDriver/actual_brightness)
    WatchPer=$(( WatchAct * 100 / WatchMax ))
    [[ $fLogFile == true ]] && echo WatchAct: $WatchAct WatchPer: $WatchPer >> $LogFile
    # Reverse engineer patch brightness to set
    PatchAct=$(( PatchMax * WatchPer / 100 ))
    echo $PatchAct | sudo tee $PatchDriver/brightness
    [[ $fLogFile == true ]] && echo PatchAct: $PatchAct >> $LogFile
}

# When machine boots, set brightness to last saved value
SetBrightness

# Wait forever for user to press Fn keys adjusting brightness up/down.
while (true); do
    inotifywait --event modify $WatchDriver/actual_brightness
    [[ $fLogFile == true ]] && \
        echo "Processing modify event in $WatchDriver/actual_brightness" >> $LogFile
    SetBrightness
done

Original Answer June 11, 2018.

Work In Progress Answer

There are many nVidia users with similar problems in Ubuntu 18.04:


Before writing a script

I can write a script to mimic changes to /acpi_video and populate /nv_backlight but before I do try this:

  • Edit /etc/default/grub.
  • Find quiet splash
  • Add behind splash: acpi_backlight=vendor
  • Save the file
  • Run sudo update-grub

According to this answer it should work for you: Xubuntu 18.04: make Fn brightness keys work with /sys/class/backlight/nv_backlight/


Wayland

Brightness doesn't work under Wayland. Make sure you aren't using it. See: The brightness of laptop screen cannot be adjusted with either the buttons or the slider. Edit

6
  • The script does the work. But there is a small bug in SetBrightness (). It should be PatchAct=$(( PatchMax * WatchPer / 100 )). Thanks to the entire support.
    – Alanpatchi
    Jun 14, 2018 at 12:07
  • 1
    Unfortunately in mobile for next 10 hours. I'll test and revise tonight. Feel free to add new comments in the meantime. Jun 14, 2018 at 12:15
  • @boobalan You were right about the need to swap the watched percentage and 100 variables. I also corrected typos with nv_video (s/b nv_backlight) and extra /brightness in /brightness/brightness. If you are happy remember to click the grey check mark next to the answer. This will give others confidence to try out the script for themselves. It was fun developing this script. Thanks! Jun 14, 2018 at 23:06
  • If the script is run manually it does work. But if it is added to the startup applications, it doesn't work. I guess there is a problem with giving sudo permissions to startup applications. For your information, I gave redirect-brightness as the application command.
    – Alanpatchi
    Jun 15, 2018 at 6:31
  • There are many ways to call during startup. One is with cron. Create the file /etc/cron.d/backlight containing line 1: SHELL=/bin/sh line 2: PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin line 3: @reboot root /usr/local/bin/redirect-brightness Jun 15, 2018 at 10:33

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .