[arch-general] Nvidia backlight control - acpi_video0/brightness changes - display doesn't?

David C. Rankin drankinatty at suddenlinkmail.com
Sun Nov 20 09:08:12 UTC 2016


On 11/19/2016 03:38 AM, Christian Klaue wrote:
> I am having exactly the same problem with my HP. I went as far as
> decompiling the ACPI bios. When I tried to compile it again, it threw a
> huge amount of errors. So I gave up. I didn't find any solution for my
> problem. I even tried other distros. I am still kind of convinced the
> error is in the ACPI module(s) of your UEFI. If you try to blame HP (as
> many people on their forum did before) they will ask you to test on
> Windows. Unfortunately there it works. The newest BIOS update doesn't
> fix the problem for my toy.
> 
> I am lucky to have an OLED. Please keep me updated if you find a
> solution.

Christian,

  You may be in luck. I did find a solution and now my backlight functions as
it should using the nvidiabl kernel module (and a small helper script that I
autostart in KDE, but you could just as easily start it in .xinitrc for any
desktop) Basically, you have to use either of the following two packages to
build a kernel module that will work with the proprietary nvidia driver:

nvidia-bl
https://aur.archlinux.org/packages/nvidia-bl/

nvidiabl
https://aur.archlinux.org/packages/nvidiabl/

  I built them both, but haven't tried nvidia-bl, (even though it was easier
to build and should do the same thing)

  To build nvidiabl, just follow the notes on its aur page and it builds fine.
nvidia-bl, builds without issue, just download the tarball, unpack it, and
then a makepkg -s is all that is needed.

  Both provide the kernel module:

/usr/lib/modules/extramodules-4.8-ARCH/nvidiabl.ko

  Just build, then 'modprobe nvidiabl', and you will have backlight control
through:

/sys/class/backlight/nvidia_backlight/brightness

  The kicker is that nothing talks to nvidia_backlight by default, instead all
the normal backlight controls use:

/sys/class/backlight/acpi_video0/brightness

  The way to get your controls to work is to watch the acpi_video0/brightness
values and automatically set nvidia_backlight/brightness any time the earlier
one changes value. This is where the helper script comes into play (actually 2
short scripts -- the second just to ease the sudo redirection issue)

  The first script just maps values (0-20) from acpi_video0/brightness into a
range of (0-127) for nvidia_backlight/brightness (it calls the second script
as a helper). Just launch the first script in whatever desktop you are using,
and your backlight keys should work. If not, then you just have to copy
whatever value you want for your backlight/brightness to
nvidia_backlight/brightness, e.g.

 # echo 90 > /sys/class/backlight/nvidia_backlight/brightness

  Put both scripts in the same directory. You will need to configure sudo
without a password for this to work when called as your normal user (as when
using the laptop keys). The first is a quick modification of the xbacklight
script. It reads the xbacklight value from acpi_video0 and then does a rough
scale for what the nvidia_backlight value should be. Give it some name like
nvbackligh.sh:

#!/bin/sh

path=/sys/class/backlight/acpi_video0
dest=/sys/class/backlight/nvidia_backlight
dmax=$(<$dest/max_brightness)

luminance() {
    read -r level < "$path"/actual_brightness
    factor=$((dmax / max))
    nvbrt=$((level * factor))
    case "$nvbrt" in
        [0-9]       )  printf "%d" $nvbrt;;
        [0-9][0-9]  )  printf "%d" $nvbrt;;
        [1][0-1][0-9] )  printf "%d" $nvbrt;;
        [1][2][0-9] )  printf "127";;
        default     )  printf "error: in value conversion\n"
                       exit 1;;
    esac
}

read -r max < "$path"/max_brightness

inotifywait -me modify --format '' "$path"/actual_brightness | while read; do
    if [ $UID -eq 0 ]; then
        echo $(luminance) > "$dest"/brightness
    else
        sudo ./nvhelper.sh $(luminance)  # helper script
    fi
    printf "luminance %s\n" "$(luminance)"
done

  The second just echos the luminance value into nvidia_backlight/brightness
 which gets around sudo only applying to the echo and not the redirection. An
alternative is calling it with 'su -c' (which you can configure pam to allow
without a password if you are a member of the wheel group and you uncomment
the first two lines in /etc/pam.d/su). The helper script nvhelper.sh is:

#!/bin/sh
[ $1 -lt 0 -o $1 -gt 127 ] && exit 1  ## check value out of range
echo $1 > /sys/class/backlight/nvidia_backlight/brightness

  If you try the aur nvidia-bl package and it works. Let me know, it is a
simpler package to build. I'll try and get time to try it over the next week
or so.

  So now, after a couple of days relearning xrandr, backlight, the sysfs and
what goes with what in the nvidia driver, that xrandr is a software pixel
darkening scheme, we came to understand the kernel model approach is the
correct approach for backlight control here...and it is working perfectly.

(Now, if I could just get this damn HP laptop to boot grub without having to
boot from USB and then boot grub on the hard drive, I'd be in great shape. Let
me know if you have any questions.

-- 
David C. Rankin, J.D.,P.E.


More information about the arch-general mailing list