Well, this won't work for me. I don't have a NVidia. But I will search the web if there is a module for my Intel Skylake graphics. Although my brightness script actually works perfect. The only drawback currently: a few apps (e.g. chromium) reset the brightness to max upon their startup. Thanks anyway! Christian On Sun, 2016-11-20 at 03:08 -0600, David C. Rankin wrote:
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.