gpio_switch 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2015 OpenWrt.org
  3. START=94
  4. STOP=10
  5. USE_PROCD=1
  6. load_gpio_switch()
  7. {
  8. local name
  9. local gpio_pin
  10. local value
  11. config_get gpio_pin "$1" gpio_pin
  12. config_get name "$1" name
  13. config_get value "$1" value 0
  14. [ -z "$gpio_pin" ] && {
  15. echo >&2 "Skipping gpio_switch '$name' due to missing gpio_pin"
  16. return 1
  17. }
  18. local gpio_path
  19. if [ -n "$(echo "$gpio_pin" | grep -E "^[0-9]+$")" ]; then
  20. gpio_path="/sys/class/gpio/gpio${gpio_pin}"
  21. # export GPIO pin for access
  22. [ -d "$gpio_path" ] || {
  23. echo "$gpio_pin" >/sys/class/gpio/export
  24. # we need to wait a bit until the GPIO appears
  25. [ -d "$gpio_path" ] || sleep 1
  26. }
  27. # direction attribute only exists if the kernel supports changing the
  28. # direction of a GPIO
  29. if [ -e "${gpio_path}/direction" ]; then
  30. # set the pin to output with high or low pin value
  31. { [ "$value" = "0" ] && echo "low" || echo "high"; } \
  32. >"$gpio_path/direction"
  33. else
  34. { [ "$value" = "0" ] && echo "0" || echo "1"; } \
  35. >"$gpio_path/value"
  36. fi
  37. else
  38. gpio_path="/sys/class/gpio/${gpio_pin}"
  39. [ -d "$gpio_path" ] && {
  40. { [ "$value" = "0" ] && echo "0" || echo "1"; } \
  41. >"$gpio_path/value"
  42. }
  43. fi
  44. }
  45. service_triggers()
  46. {
  47. procd_add_reload_trigger "system"
  48. }
  49. start_service()
  50. {
  51. [ -e /sys/class/gpio/ ] && {
  52. config_load system
  53. config_foreach load_gpio_switch gpio_switch
  54. }
  55. }