Sorry for the delay in this. I managed to cobble together a solution shortly after posting my original message but haven't gotten around to documenting this until now.
This solution is the product of adapting several other forum posts and bugfixes already in existence. See my references at the following locations:
From my original message, I still contend this issue exists because of a buggy implementation of the toshiba_acpi kernel module as it's distributed with the Linux kernel. I have yet to input a formal bug report, but suppose I should at some point.
As an overview, this solution works by using the toshset utility to poke the system management controller on this laptop to allow the hardware to update the backlight brightness. I'm not sure what happens upon a system suspend but I would be willing to wager some internal register is not reset, as a system hibernate does allow full use of the stock backlight control scheme.
One issue with this solution is that the toshset utility can not interface with the currently-shipped version of the toshiba_acpi kernel module. A workaround can be achieved by patching the source and then building and installing the appropriately-provisioned kernel module.
As mentioned the key to this scheme is toshset
. Assuming you're trying to implement this solution on a Toshiba R700/R705 laptop and running 64-bit Fedora, get the 64-bit binary.
$ cd ~
$ wget 'http://www.schwieters.org/toshset/toshset64.gz'
$ gunzip toshset64.gz
# mv toshset64 /usr/local/bin
Before proceeding, ensure you have the latest kernel-devel
# yum install kernel-devel
Next, get the kernel source files appropriate for your current kernel version:
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v`uname -r | cut -b-3`/linux-`uname -r | cut -f1 -d'-'`.tar.bz2
# tar -xjvf linux-`uname -r | cut -f1 -d'-'`.tar.bz2
Get the patch for the toshiba_acpi kernel module
# wget 'http://www.schwieters.org/toshset/toshiba_acpi-current.patch'
# cd linux-`uname -r | cut -f1 -d'-'`
# patch -p1 < ../toshiba_acpi-current.patch
# cd drivers/platform/x86
Since we're only concerned about building the toshiba_acpi module, either comment out all of the other lines in Makefile
that deal with building everything else or simply:
# echo 'obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o' > Makefile
Now build the modules using the headers for the specific release of Fedora you're running:
# make -C /usr/src/kernels/`uname -r` M=`pwd` modules
Again, to install the modules
# make -C /usr/src/kernels/`uname -r` M=`pwd` modules_install
This should toss the newly-patched toshiba_acpi.ko
Restart to load the new modules
Now, we just need to make the ACPI daemon aware of the magic we're trying to do with toshset so that it will eventually poke the system management controller in the right places.
We're going to make two files in /etc/acpi/events
so the ACPI daemon now has something extensible to hook on to when the hardware buttons are pressed. I used the acpi_listen
program to determine the event code the hardware was coughing up so I knew what to tell the daemon to listen for.
First file, toshiba-brightness-down
event=video/brightnessdown BRTDN 00000087 00000000
Second file, toshiba-brightness-up
event=video/brightnessup BRTUP 00000086 00000000
As you can probably tell, we're going to put a couple of files into /etc/acpi/actions
. Both files will contain the same script that calls upon toshset64
but we're putting them in different files just in case something comes up down the line.
First file, toshiba-brn-down.sh
/usr/local/bin/toshset64 -bl on
Second file, toshiba-brn-up.sh
/usr/local/bin/toshset64 -bl on
Now, give everyone read and execute permissions:
# chmod +rx /etc/acpi/actions/toshiba*
Restart acpid so it ingests the new events:
# /sbin/service acpid restart
...and your backlight keys should work. Note that this solution only makes acpid aware of hardware button keypresses (i.e. Fn+F6, Fn+F7), so the Power Management app in GNOME won't be able to modify the brightness, nor will the "auto dim" feature.
Hope this helps someone else out!