Lenovo ideapad brightness keys not generating any events in Ubuntu 16.04.1

I have a new Lenovo Ideapad 500S with a fresh Ubuntu 16.04.1 running on it. Unfortunately, the brightness up/down keys don't work. (They work fine in Windows.)

Running acpi_listen shows me generated events for volume up/down keys, but not for brightness up/down. Running xev also did not give me any output for the brightness up/down keys.

After editing the GRUB_CMDLINE_LINUX_DEFAULT line in /etc/default/grub several times with options like acpi_backlight=vendor,video.use_native_backlight=1, acpi_osi=Linux and acpi_osi=, I can confirm that this changes the soft links in /sys/class/backlight/ and I currently only have intel_backlight there.

Running echo <NUM> | sudo tee /sys/class/backlight/intel_backlight/brightness works fine and changes the brightness, and so does changing it from Settings > Brightness and Lock.

Nothing inside Ubuntu seems to be able to detect these keys, so I'm not sure making any changes in the grub config will matter at all.

Please let me know if someone knows how to fix this and also if any additional information will be useful in debugging this issue.

Update:

Adding acpi_osi=Linux acpi_backlight=intel_backlight to the line in grub seems to make the brightness down key generate something in xev (though nothing in acpi_listen yet). The output is:

KeyPress event, serial 37, synthetic NO, window 0x3c00001,
    root 0xd3, subw 0x0, time 391361, (728,884), root:(793,936),
    state 0x0, keycode 120 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x3c00001,
    root 0xd3, subw 0x0, time 391368, (728,884), root:(793,936),
    state 0x0, keycode 120 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Additional outputs:

$ lspci -nnk | grep -iA2 vga
00:02.0 VGA compatible controller [0300]: Intel Corporation Sky Lake Integrated Graphics [8086:1916] (rev 07)
    Subsystem: Lenovo Skylake Integrated Graphics [17aa:3828]
    Kernel driver in use: i915_bpo

Solution 1:

I finally solved this using a couple of workarounds.

The first step was making the keys detectable. I had a laptop of a similar model (Lenovo Z400) and I looked at what keycodes were generated for it. Based on that, I put this in my /etc/rc.local/:

setkeycodes e054 225 # Brightness up -> brightness up
setkeycodes e04c 224 # Brightness down -> brightness down

The second step was making the keys change the brightness. I first noticed that running xdotool key 232 and xdotool key 233 increased and decreased the brightness perfectly (including the change notification in Unity). Then I tried two things to get the brightness to work.

First, I noticed that xev now showed me the events XF86MonBrightnessUp and XF86MonBrightnessDown for the two keys, which means everything was working fine at the X level. So I simply used Ubuntu's shortcut manager and registered the two keys (which were read as their XF86 equivalents) to the xdotool commands. This worked great!

However, some weeks later, due to some packages/drivers I changed, xev stopped reporting the XF86 events and so the above method did not work. However, acpi_listen showed that video/brightnessdown and video/brightnessup events were being generated, so then, after some googling, I put the following in a new file, /etc/acpi/events/ideapad-monitor-brightness-up:

# same event as reported by acpi_listen
event=video/brightnessup BRTUP 00000086 00000000 K
action=su vivek -c "export DISPLAY=:0.0; xdotool getactivewindow && xdotool key 233 2>&1 > /tmp/log"
# The redirection into /tmp/log probably doesn't make any difference

and also an equivalent ideapad-monitor-brightness-down file with xdotool key 232 and that solved the problem. Haven't had any problems since. :)