35b33f0413
Record the state of any hardware LED configured through UCI and use that information to revert the state when applying updated settings while maintaining default behaviour of system LEDs. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
127 lines
3 KiB
Bash
Executable file
127 lines
3 KiB
Bash
Executable file
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2008 OpenWrt.org
|
|
|
|
START=96
|
|
|
|
load_led() {
|
|
local name
|
|
local sysfs
|
|
local trigger
|
|
local dev
|
|
local mode
|
|
local default
|
|
local delayon
|
|
local delayoff
|
|
local interval
|
|
|
|
config_get sysfs $1 sysfs
|
|
config_get name $1 name "$sysfs"
|
|
config_get trigger $1 trigger "none"
|
|
config_get dev $1 dev
|
|
config_get mode $1 mode "link"
|
|
config_get_bool default $1 default "nil"
|
|
config_get delayon $1 delayon
|
|
config_get delayoff $1 delayoff
|
|
config_get interval $1 interval "50"
|
|
config_get port_state $1 port_state
|
|
config_get delay $1 delay "150"
|
|
config_get message $1 message ""
|
|
config_get gpio $1 gpio "0"
|
|
config_get inverted $1 inverted "0"
|
|
|
|
if [ "$trigger" = "rssi" ]; then
|
|
# handled by rssileds userspace process
|
|
return
|
|
fi
|
|
|
|
[ -e /sys/class/leds/${sysfs}/brightness ] && {
|
|
echo "setting up led ${name}"
|
|
|
|
printf "%s %s %d\n" \
|
|
"$sysfs" \
|
|
"$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \
|
|
"$(cat /sys/class/leds/${sysfs}/brightness)" \
|
|
>> /var/run/led.state
|
|
|
|
[ "$default" = 0 ] &&
|
|
echo 0 >/sys/class/leds/${sysfs}/brightness
|
|
|
|
echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null
|
|
ret="$?"
|
|
|
|
[ $default = 1 ] &&
|
|
cat /sys/class/leds/${sysfs}/max_brightness > /sys/class/leds/${sysfs}/brightness
|
|
|
|
[ $ret = 0 ] || {
|
|
echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module"
|
|
return 1
|
|
}
|
|
case "$trigger" in
|
|
"netdev")
|
|
[ -n "$dev" ] && {
|
|
echo $dev > /sys/class/leds/${sysfs}/device_name
|
|
echo $mode > /sys/class/leds/${sysfs}/mode
|
|
}
|
|
;;
|
|
|
|
"timer")
|
|
[ -n "$delayon" ] && \
|
|
echo $delayon > /sys/class/leds/${sysfs}/delay_on
|
|
[ -n "$delayoff" ] && \
|
|
echo $delayoff > /sys/class/leds/${sysfs}/delay_off
|
|
;;
|
|
|
|
"usbdev")
|
|
[ -n "$dev" ] && {
|
|
echo $dev > /sys/class/leds/${sysfs}/device_name
|
|
echo $interval > /sys/class/leds/${sysfs}/activity_interval
|
|
}
|
|
;;
|
|
|
|
"port_state")
|
|
[ -n "$port_state" ] && \
|
|
echo $port_state > /sys/class/leds/${sysfs}/port_state
|
|
;;
|
|
|
|
"morse")
|
|
echo $message > /sys/class/leds/${sysfs}/message
|
|
echo $delay > /sys/class/leds/${sysfs}/delay
|
|
;;
|
|
|
|
"gpio")
|
|
echo $gpio > /sys/class/leds/${sysfs}/gpio
|
|
echo $inverted > /sys/class/leds/${sysfs}/inverted
|
|
;;
|
|
|
|
switch[0-9]*)
|
|
local port_mask speed_mask
|
|
|
|
config_get port_mask $1 port_mask
|
|
[ -n "$port_mask" ] && \
|
|
echo $port_mask > /sys/class/leds/${sysfs}/port_mask
|
|
config_get speed_mask $1 speed_mask
|
|
[ -n "$speed_mask" ] && \
|
|
echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask
|
|
;;
|
|
esac
|
|
}
|
|
}
|
|
|
|
start() {
|
|
[ -e /sys/class/leds/ ] && {
|
|
[ -s /var/run/led.state ] && {
|
|
local led trigger brightness
|
|
while read led trigger brightness; do
|
|
[ -e "/sys/class/leds/$led/trigger" ] && \
|
|
echo "$trigger" > "/sys/class/leds/$led/trigger"
|
|
|
|
[ -e "/sys/class/leds/$led/brightness" ] && \
|
|
echo "$brightness" > "/sys/class/leds/$led/brightness"
|
|
done < /var/run/led.state
|
|
rm /var/run/led.state
|
|
}
|
|
|
|
config_load system
|
|
config_foreach load_led led
|
|
}
|
|
}
|