switch to the new usbport LED trigger
[openwrt/staging/florian.git] / package / base-files / files / etc / init.d / led
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2008 OpenWrt.org
3
4 START=96
5
6 load_led() {
7 local name
8 local sysfs
9 local trigger
10 local dev
11 local ports
12 local mode
13 local default
14 local delayon
15 local delayoff
16 local interval
17
18 config_get sysfs $1 sysfs
19 config_get name $1 name "$sysfs"
20 config_get trigger $1 trigger "none"
21 config_get dev $1 dev
22 config_get mode $1 mode "link"
23 config_get_bool default $1 default "nil"
24 config_get delayon $1 delayon
25 config_get delayoff $1 delayoff
26 config_get interval $1 interval "50"
27 config_get port_state $1 port_state
28 config_get delay $1 delay "150"
29 config_get message $1 message ""
30 config_get gpio $1 gpio "0"
31 config_get inverted $1 inverted "0"
32
33 if [ "$trigger" = "rssi" ]; then
34 # handled by rssileds userspace process
35 return
36 fi
37
38 [ "$trigger" = "usbdev" ] && {
39 # Backward compatibility: translate to the new trigger
40 trigger="usbport"
41 # Translate port of root hub, e.g. 4-1 -> usb4-port1
42 ports=$(echo "$dev" | sed -n 's/^\([0-9]*\)-\([0-9]*\)$/usb\1-port\2/p')
43 # Translate port of extra hub, e.g. 2-2.4 -> 2-2-port4
44 [ -z "$ports" ] && ports=$(echo "$dev" | sed -n 's/\./-port/p')
45 }
46
47 [ -e /sys/class/leds/${sysfs}/brightness ] && {
48 echo "setting up led ${name}"
49
50 printf "%s %s %d\n" \
51 "$sysfs" \
52 "$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \
53 "$(cat /sys/class/leds/${sysfs}/brightness)" \
54 >> /var/run/led.state
55
56 [ "$default" = 0 ] &&
57 echo 0 >/sys/class/leds/${sysfs}/brightness
58
59 echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null
60 ret="$?"
61
62 [ $default = 1 ] &&
63 cat /sys/class/leds/${sysfs}/max_brightness > /sys/class/leds/${sysfs}/brightness
64
65 [ $ret = 0 ] || {
66 echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module"
67 return 1
68 }
69 case "$trigger" in
70 "netdev")
71 [ -n "$dev" ] && {
72 echo $dev > /sys/class/leds/${sysfs}/device_name
73 echo $mode > /sys/class/leds/${sysfs}/mode
74 }
75 ;;
76
77 "timer"|"oneshot")
78 [ -n "$delayon" ] && \
79 echo $delayon > /sys/class/leds/${sysfs}/delay_on
80 [ -n "$delayoff" ] && \
81 echo $delayoff > /sys/class/leds/${sysfs}/delay_off
82 ;;
83
84 "usbport")
85 local p
86
87 for p in $ports; do
88 echo 1 > /sys/class/leds/${sysfs}/ports/$p
89 done
90 ;;
91
92 "port_state")
93 [ -n "$port_state" ] && \
94 echo $port_state > /sys/class/leds/${sysfs}/port_state
95 ;;
96
97 "gpio")
98 echo $gpio > /sys/class/leds/${sysfs}/gpio
99 echo $inverted > /sys/class/leds/${sysfs}/inverted
100 ;;
101
102 switch[0-9]*)
103 local port_mask speed_mask
104
105 config_get port_mask $1 port_mask
106 [ -n "$port_mask" ] && \
107 echo $port_mask > /sys/class/leds/${sysfs}/port_mask
108 config_get speed_mask $1 speed_mask
109 [ -n "$speed_mask" ] && \
110 echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask
111 ;;
112 esac
113 }
114 }
115
116 start() {
117 [ -e /sys/class/leds/ ] && {
118 [ -s /var/run/led.state ] && {
119 local led trigger brightness
120 while read led trigger brightness; do
121 [ -e "/sys/class/leds/$led/trigger" ] && \
122 echo "$trigger" > "/sys/class/leds/$led/trigger"
123
124 [ -e "/sys/class/leds/$led/brightness" ] && \
125 echo "$brightness" > "/sys/class/leds/$led/brightness"
126 done < /var/run/led.state
127 rm /var/run/led.state
128 }
129
130 config_load system
131 config_foreach load_led led
132 }
133 }