base-files: gpio switch: add named GPIO support
authorKuan-Yi Li <kyli@abysm.org>
Sat, 10 Aug 2019 19:23:28 +0000 (03:23 +0800)
committerJo-Philipp Wich <jo@mein.io>
Thu, 18 Jun 2020 18:08:18 +0000 (20:08 +0200)
Previously, gpio_switch only accepts GPIO pin number as input. Once a
GPIO pin is exported and named by device tree, its pin state cannot be
configured and saved across reboots by UCI.

This patch adds support for named GPIO pins. Thus GPIO pin can be
exported by device tree with active high/low correctly configured,
having human-readable name in /sys/class/gpio/ is also now possible.

More importantly, GPIO pins which are referenced by name will be immune
from pin mapping breakage while unintentional pin number changes are
introduced by kernel or driver updates.

Signed-off-by: Kuan-Yi Li <kyli@abysm.org>
package/base-files/Makefile
package/base-files/files/etc/init.d/gpio_switch
package/base-files/files/lib/functions/uci-defaults.sh

index 5bf783d0e8604d05b59413420e268397fd86f315..84fbcacdfcb1f7061e1539dcfbe62be4709b6998 100644 (file)
@@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
 include $(INCLUDE_DIR)/feeds.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=222
+PKG_RELEASE:=223
 PKG_FLAGS:=nonshared
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
index 6b2dcdce41833f8dcbec97f0074a705b41d534f8..24d790b065c1656bbd03ca34d963b4dda1990d63 100755 (executable)
@@ -16,21 +16,39 @@ load_gpio_switch()
        config_get name "$1" name
        config_get value "$1" value 0
 
-       local gpio_path="/sys/class/gpio/gpio${gpio_pin}"
-       # export GPIO pin for access
-       [ -d "$gpio_path" ] || {
-               echo "$gpio_pin" >/sys/class/gpio/export
-               # we need to wait a bit until the GPIO appears
-               [ -d "$gpio_path" ] || sleep 1
+       [ -z "$gpio_pin" ] && {
+               echo >&2 "Skipping gpio_switch '$name' due to missing gpio_pin"
+               return 1
        }
 
-       # direction attribute only exists if the kernel supports changing the
-       # direction of a GPIO
-       if [ -e "${gpio_path}/direction" ]; then
-               # set the pin to output with high or low pin value
-               { [ "$value" = "0" ] && echo "low" || echo "high"; } >"$gpio_path/direction"
+       local gpio_path
+       if [ -n "$(echo "$gpio_pin" | grep -E "^[0-9]+$")" ]; then
+               gpio_path="/sys/class/gpio/gpio${gpio_pin}"
+
+               # export GPIO pin for access
+               [ -d "$gpio_path" ] || {
+                       echo "$gpio_pin" >/sys/class/gpio/export
+                       # we need to wait a bit until the GPIO appears
+                       [ -d "$gpio_path" ] || sleep 1
+               }
+
+               # direction attribute only exists if the kernel supports changing the
+               # direction of a GPIO
+               if [ -e "${gpio_path}/direction" ]; then
+                       # set the pin to output with high or low pin value
+                       { [ "$value" = "0" ] && echo "low" || echo "high"; } \
+                               >"$gpio_path/direction"
+               else
+                       { [ "$value" = "0" ] && echo "0" || echo "1"; } \
+                               >"$gpio_path/value"
+               fi
        else
-               { [ "$value" = "0" ] && echo "0" || echo "1"; } >"$gpio_path/value"
+               gpio_path="/sys/class/gpio/${gpio_pin}"
+
+               [ -d "$gpio_path" ] && {
+                       { [ "$value" = "0" ] && echo "0" || echo "1"; } \
+                               >"$gpio_path/value"
+               }
        fi
 }
 
index e551e8fd574062c5452be74622aff4263f9a7df7..12b900031da865c604887ef49554776aa4814b04 100755 (executable)
@@ -573,7 +573,7 @@ ucidef_add_gpio_switch() {
        json_select_object gpioswitch
                json_select_object "$cfg"
                        json_add_string name "$name"
-                       json_add_int pin "$pin"
+                       json_add_string pin "$pin"
                        json_add_int default "$default"
                json_select ..
        json_select ..