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