b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 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 | [ "$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 | |
| 171 | start() { |
| 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 | } |