79fdd452cecc03457898bcb08224631dedbc0a10
[openwrt/openwrt.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 extra_command "turnon" "Put the LEDs into their default state"
7 extra_command "turnoff" "Turn all LEDs off"
8 extra_command "blink" "Blink all LEDs"
9
10 led_color_set() {
11 local cfg="$1"
12 local sysfs="$2"
13
14 local max_b
15 local colors
16 local color
17 local multi_intensity
18 local value
19 local write
20
21 [ -e /sys/class/leds/${sysfs}/multi_intensity ] || return
22 [ -e /sys/class/leds/${sysfs}/multi_index ] || return
23
24 max_b="$(cat /sys/class/leds/${sysfs}/max_brightness)"
25 colors="$(cat /sys/class/leds/${sysfs}/multi_index | tr " " "\n")"
26 multi_intensity=""
27 for color in $colors; do
28 config_get value $1 "color_${color}" "0"
29 [ "$value" -gt 0 ] && write=1
30 [ "$value" -gt "$max_b" ] && value="$max_b"
31 multi_intensity="${multi_intensity}${value} "
32 done
33
34 # Check if any color is configured
35 [ "$write" = 1 ] || return
36 # Remove last whitespace
37 multi_intensity="${multi_intensity:0:-1}"
38
39 echo "setting '${name}' led color to '${multi_intensity}'"
40 echo "${multi_intensity}" > /sys/class/leds/${sysfs}/multi_intensity
41 }
42
43 load_led() {
44 local name
45 local sysfs
46 local trigger
47 local dev
48 local ports
49 local mode
50 local default
51 local delayon
52 local delayoff
53 local interval
54 local brightness
55
56 config_get sysfs $1 sysfs
57 config_get name $1 name "$sysfs"
58 config_get trigger $1 trigger "none"
59 config_get dev $1 dev
60 config_get ports $1 port
61 config_get mode $1 mode
62 config_get_bool default $1 default "0"
63 config_get delayon $1 delayon
64 config_get delayoff $1 delayoff
65 config_get interval $1 interval "50"
66 config_get port_state $1 port_state
67 config_get delay $1 delay "150"
68 config_get message $1 message ""
69 config_get gpio $1 gpio "0"
70 config_get_bool inverted $1 inverted "0"
71 config_get brightness $1 brightness
72
73 [ "$2" ] && [ "$sysfs" != "$2" ] && return
74
75 # execute application led trigger
76 [ -f "/usr/libexec/led-trigger/${trigger}" ] && {
77 . "/usr/libexec/led-trigger/${trigger}"
78 return 0
79 }
80
81 [ "$trigger" = "usbdev" ] && {
82 # Backward compatibility: translate to the new trigger
83 trigger="usbport"
84 # Translate port of root hub, e.g. 4-1 -> usb4-port1
85 ports=$(echo "$dev" | sed -n 's/^\([0-9]*\)-\([0-9]*\)$/usb\1-port\2/p')
86 # Translate port of extra hub, e.g. 2-2.4 -> 2-2-port4
87 [ -z "$ports" ] && ports=$(echo "$dev" | sed -n 's/\./-port/p')
88 }
89
90 [ -e /sys/class/leds/${sysfs}/brightness ] && {
91 echo "setting up led ${name}"
92
93 printf "%s %s %d" \
94 "$sysfs" \
95 "$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \
96 "$(cat /sys/class/leds/${sysfs}/brightness)" \
97 >> /var/run/led.state
98 # Save default color if supported
99 [ -e /sys/class/leds/${sysfs}/multi_intensity ] && {
100 printf " %s" \
101 "$(sed 's/\ /:/g' /sys/class/leds/${sysfs}/multi_intensity)" \
102 >> /var/run/led.state
103 }
104 printf "\n" >> /var/run/led.state
105
106 [ "$default" = 0 ] &&
107 echo 0 >/sys/class/leds/${sysfs}/brightness
108
109 [ "$default" = 1 ] && {
110 [ -z "$brightness" ] && brightness="$(cat /sys/class/leds/${sysfs}/max_brightness)"
111 echo "$brightness" > /sys/class/leds/${sysfs}/brightness
112 }
113
114 led_color_set "$1" "$sysfs"
115
116 echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null
117 ret="$?"
118 [ $ret = 0 ] || {
119 echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module"
120 return 1
121 }
122 case "$trigger" in
123 "heartbeat")
124 echo "${inverted}" > "/sys/class/leds/${sysfs}/invert"
125 ;;
126
127 "netdev")
128 [ -n "$dev" ] && {
129 echo $dev > /sys/class/leds/${sysfs}/device_name
130 for m in $mode; do
131 [ -e "/sys/class/leds/${sysfs}/$m" ] && \
132 echo 1 > /sys/class/leds/${sysfs}/$m
133 done
134 echo $interval > /sys/class/leds/${sysfs}/interval 2>/dev/null
135 }
136 ;;
137
138 "timer"|"oneshot")
139 [ -n "$delayon" ] && \
140 echo $delayon > /sys/class/leds/${sysfs}/delay_on
141 [ -n "$delayoff" ] && \
142 echo $delayoff > /sys/class/leds/${sysfs}/delay_off
143 ;;
144
145 "usbport")
146 local p
147
148 for p in $ports; do
149 echo 1 > /sys/class/leds/${sysfs}/ports/$p
150 done
151 ;;
152
153 "port_state")
154 [ -n "$port_state" ] && \
155 echo $port_state > /sys/class/leds/${sysfs}/port_state
156 ;;
157
158 "gpio")
159 echo $gpio > /sys/class/leds/${sysfs}/gpio
160 echo $inverted > /sys/class/leds/${sysfs}/inverted
161 ;;
162
163 switch[0-9]*)
164 local port_mask speed_mask
165
166 config_get port_mask $1 port_mask
167 [ -n "$port_mask" ] && \
168 echo $port_mask > /sys/class/leds/${sysfs}/port_mask
169 config_get speed_mask $1 speed_mask
170 [ -n "$speed_mask" ] && \
171 echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask
172 [ -n "$mode" ] && \
173 echo "$mode" > /sys/class/leds/${sysfs}/mode
174 ;;
175 esac
176 }
177 }
178
179 turnoff() {
180 for led in `ls /sys/class/leds/`; do
181 echo 0 > /sys/class/leds/$led/brightness
182 done
183 }
184
185 turnon() {
186 turnoff
187 . /etc/diag.sh
188 set_state done
189 start
190 }
191
192 blink() {
193 for led in `ls /sys/class/leds/`; do
194 echo 0 > /sys/class/leds/$led/brightness
195 echo timer > /sys/class/leds/$led/trigger
196 done
197 }
198
199 start() {
200 [ "$(uci -q get system.@system[-1].leds_off)" = '1' ] && {
201 turnoff
202 exit 0
203 }
204 [ -e /sys/class/leds/ ] && {
205 [ -s /var/run/led.state ] && {
206 local led trigger brightness color
207 while read led trigger brightness color; do
208 [ "$1" ] && [ "$1" != "$led" ] && continue
209 [ -e "/sys/class/leds/$led/trigger" ] && \
210 echo "$trigger" > "/sys/class/leds/$led/trigger"
211
212 [ -e "/sys/class/leds/$led/brightness" ] && \
213 echo "$brightness" > "/sys/class/leds/$led/brightness"
214
215 [ -e "/sys/class/leds/$led/multi_intensity" ] && \
216 echo "$color" | sed 's/:/\ /g' > \
217 "/sys/class/leds/$led/multi_intensity"
218 done < /var/run/led.state
219 if [ "$1" ]; then
220 grep -v "^$1 " /var/run/led.state > /var/run/led.state.new
221 mv /var/run/led.state.new /var/run/led.state
222 else
223 rm /var/run/led.state
224 fi
225 }
226
227 config_load system
228 config_foreach load_led led "$1"
229 }
230 }