blob: 7f05254c2ba3a30f474ddb50f50a5c272d92c044 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh /etc/rc.common
2# Copyright (C) 2008 OpenWrt.org
3
4START=96
5
6led_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
39load_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 [ "$2" ] && [ "$sysfs" != "$2" ] && return
68
69 # execute application led trigger
70 [ -f "/usr/libexec/led-trigger/${trigger}" ] && {
71 . "/usr/libexec/led-trigger/${trigger}"
72 return 0
73 }
74
75 [ "$trigger" = "usbdev" ] && {
76 # Backward compatibility: translate to the new trigger
77 trigger="usbport"
78 # Translate port of root hub, e.g. 4-1 -> usb4-port1
79 ports=$(echo "$dev" | sed -n 's/^\([0-9]*\)-\([0-9]*\)$/usb\1-port\2/p')
80 # Translate port of extra hub, e.g. 2-2.4 -> 2-2-port4
81 [ -z "$ports" ] && ports=$(echo "$dev" | sed -n 's/\./-port/p')
82 }
83
84 [ -e /sys/class/leds/${sysfs}/brightness ] && {
85 echo "setting up led ${name}"
86
87 printf "%s %s %d" \
88 "$sysfs" \
89 "$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \
90 "$(cat /sys/class/leds/${sysfs}/brightness)" \
91 >> /var/run/led.state
92 # Save default color if supported
93 [ -e /sys/class/leds/${sysfs}/multi_intensity ] && {
94 printf " %s" \
95 "$(sed 's/\ /:/g' /sys/class/leds/${sysfs}/multi_intensity)" \
96 >> /var/run/led.state
97 }
98 printf "\n" >> /var/run/led.state
99
100 [ "$default" = 0 ] &&
101 echo 0 >/sys/class/leds/${sysfs}/brightness
102
103 [ $default = 1 ] &&
104 cat /sys/class/leds/${sysfs}/max_brightness > /sys/class/leds/${sysfs}/brightness
105
106 led_color_set "$1" "$sysfs"
107
108 echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null
109 ret="$?"
110 [ $ret = 0 ] || {
111 echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module"
112 return 1
113 }
114 case "$trigger" in
115 "heartbeat")
116 echo "${inverted}" > "/sys/class/leds/${sysfs}/invert"
117 ;;
118
119 "netdev")
120 [ -n "$dev" ] && {
121 echo $dev > /sys/class/leds/${sysfs}/device_name
122 for m in $mode; do
123 [ -e "/sys/class/leds/${sysfs}/$m" ] && \
124 echo 1 > /sys/class/leds/${sysfs}/$m
125 done
126 echo $interval > /sys/class/leds/${sysfs}/interval 2>/dev/null
127 }
128 ;;
129
130 "timer"|"oneshot")
131 [ -n "$delayon" ] && \
132 echo $delayon > /sys/class/leds/${sysfs}/delay_on
133 [ -n "$delayoff" ] && \
134 echo $delayoff > /sys/class/leds/${sysfs}/delay_off
135 ;;
136
137 "usbport")
138 local p
139
140 for p in $ports; do
141 echo 1 > /sys/class/leds/${sysfs}/ports/$p
142 done
143 ;;
144
145 "port_state")
146 [ -n "$port_state" ] && \
147 echo $port_state > /sys/class/leds/${sysfs}/port_state
148 ;;
149
150 "gpio")
151 echo $gpio > /sys/class/leds/${sysfs}/gpio
152 echo $inverted > /sys/class/leds/${sysfs}/inverted
153 ;;
154
155 switch[0-9]*)
156 local port_mask speed_mask
157
158 config_get port_mask $1 port_mask
159 [ -n "$port_mask" ] && \
160 echo $port_mask > /sys/class/leds/${sysfs}/port_mask
161 config_get speed_mask $1 speed_mask
162 [ -n "$speed_mask" ] && \
163 echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask
164 [ -n "$mode" ] && \
165 echo "$mode" > /sys/class/leds/${sysfs}/mode
166 ;;
167 esac
168 }
169}
170
171start() {
172 [ -e /sys/class/leds/ ] && {
173 [ -s /var/run/led.state ] && {
174 local led trigger brightness color
175 while read led trigger brightness color; do
176 [ "$1" ] && [ "$1" != "$led" ] && continue
177 [ -e "/sys/class/leds/$led/trigger" ] && \
178 echo "$trigger" > "/sys/class/leds/$led/trigger"
179
180 [ -e "/sys/class/leds/$led/brightness" ] && \
181 echo "$brightness" > "/sys/class/leds/$led/brightness"
182
183 [ -e "/sys/class/leds/$led/multi_intensity" ] && \
184 echo "$color" | sed 's/:/\ /g' > \
185 "/sys/class/leds/$led/multi_intensity"
186 done < /var/run/led.state
187 if [ "$1" ]; then
188 grep -v "^$1 " /var/run/led.state > /var/run/led.state.new
189 mv /var/run/led.state.new /var/run/led.state
190 else
191 rm /var/run/led.state
192 fi
193 }
194
195 config_load system
196 config_foreach load_led led "$1"
197 }
198}