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