led 5.7 KB

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