#!/bin/sh # Backlight control. # # keylaunch binds "Held XF86PowerDown" to `bl toggle`, but no `bl` exists in # this rootfs -- it came from the familiar/iPAQ tools, not from GPE or # Debian, and is not in Psion's tree either. The binding was therefore dead. # # The interface is not guesswork: minilite, the frontlight applet already # installed here, drives the backlight through # /sys/class/backlight//brightness (and .../max_brightness) # /sys/class/lcd//power # /proc/driver/backlight # so this uses the same paths, preferring sysfs and falling back to procfs. # # ipaq-sleep drives this directly -- it runs "/usr/bin/bl " to dim and # "/usr/bin/bl off" to blank, using dim_level from /etc/ipaq-sleep.conf, # which Psion ship set to 2. familiar's bl took a small device level rather # than a percentage, so a bare number of 10 or less is treated as a level on # a 0-10 scale and anything larger as a percentage. # # Usage: bl [toggle|on|off|up|down|] DEV=$(ls /sys/class/backlight 2>/dev/null | head -1) LCD=$(ls /sys/class/lcd 2>/dev/null | head -1) sys_max() { cat "/sys/class/backlight/$DEV/max_brightness" 2>/dev/null || echo 255; } sys_get() { cat "/sys/class/backlight/$DEV/brightness" 2>/dev/null || echo 0; } sys_set() { echo "$1" > "/sys/class/backlight/$DEV/brightness" 2>/dev/null; } if [ -n "$DEV" ]; then MAX=$(sys_max); CUR=$(sys_get) case "${1:-toggle}" in toggle) if [ "$CUR" -gt 0 ]; then echo "$CUR" > /var/run/bl.last 2>/dev/null; sys_set 0 else sys_set "$(cat /var/run/bl.last 2>/dev/null || echo "$MAX")" fi ;; on) sys_set "$MAX" ;; off) echo "$CUR" > /var/run/bl.last 2>/dev/null; sys_set 0 ;; up) v=$((CUR + MAX/8)); [ "$v" -gt "$MAX" ] && v=$MAX; sys_set "$v" ;; down) v=$((CUR - MAX/8)); [ "$v" -lt 0 ] && v=0; sys_set "$v" ;; ''|*[!0-9]*) echo "usage: bl [toggle|on|off|up|down|0-100]" >&2; exit 1 ;; *) if [ "$1" -le 10 ]; then sys_set $(( $1 * MAX / 10 )) else sys_set $(( $1 * MAX / 100 )); fi ;; esac [ -n "$LCD" ] && [ "$(sys_get)" -gt 0 ] && echo 0 > "/sys/class/lcd/$LCD/power" 2>/dev/null exit 0 fi # no sysfs backlight: fall back to the older procfs node minilite also knows if [ -w /proc/driver/backlight ]; then case "${1:-toggle}" in off) echo 0 > /proc/driver/backlight ;; on) echo 100 > /proc/driver/backlight ;; toggle) if [ "$(cat /proc/driver/backlight 2>/dev/null)" = "0" ]; then echo 100 > /proc/driver/backlight else echo 0 > /proc/driver/backlight fi ;; *) if [ "$1" -le 10 ] 2>/dev/null; then echo $(( $1 * 10 )) > /proc/driver/backlight else echo "${1}" > /proc/driver/backlight; fi ;; esac exit 0 fi echo "bl: no backlight control found" >&2 exit 1