base-files: gpio switch: add named GPIO support

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>
master
Kuan-Yi Li 5 years ago committed by Jo-Philipp Wich
parent a4c0767fbc
commit c5bf9a8ced

@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
include $(INCLUDE_DIR)/feeds.mk include $(INCLUDE_DIR)/feeds.mk
PKG_NAME:=base-files PKG_NAME:=base-files
PKG_RELEASE:=222 PKG_RELEASE:=223
PKG_FLAGS:=nonshared PKG_FLAGS:=nonshared
PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/

@ -16,7 +16,15 @@ load_gpio_switch()
config_get name "$1" name config_get name "$1" name
config_get value "$1" value 0 config_get value "$1" value 0
local gpio_path="/sys/class/gpio/gpio${gpio_pin}" [ -z "$gpio_pin" ] && {
echo >&2 "Skipping gpio_switch '$name' due to missing gpio_pin"
return 1
}
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 # export GPIO pin for access
[ -d "$gpio_path" ] || { [ -d "$gpio_path" ] || {
echo "$gpio_pin" >/sys/class/gpio/export echo "$gpio_pin" >/sys/class/gpio/export
@ -28,9 +36,19 @@ load_gpio_switch()
# direction of a GPIO # direction of a GPIO
if [ -e "${gpio_path}/direction" ]; then if [ -e "${gpio_path}/direction" ]; then
# set the pin to output with high or low pin value # set the pin to output with high or low pin value
{ [ "$value" = "0" ] && echo "low" || echo "high"; } >"$gpio_path/direction" { [ "$value" = "0" ] && echo "low" || echo "high"; } \
>"$gpio_path/direction"
else else
{ [ "$value" = "0" ] && echo "0" || echo "1"; } >"$gpio_path/value" { [ "$value" = "0" ] && echo "0" || echo "1"; } \
>"$gpio_path/value"
fi
else
gpio_path="/sys/class/gpio/${gpio_pin}"
[ -d "$gpio_path" ] && {
{ [ "$value" = "0" ] && echo "0" || echo "1"; } \
>"$gpio_path/value"
}
fi fi
} }

@ -573,7 +573,7 @@ ucidef_add_gpio_switch() {
json_select_object gpioswitch json_select_object gpioswitch
json_select_object "$cfg" json_select_object "$cfg"
json_add_string name "$name" json_add_string name "$name"
json_add_int pin "$pin" json_add_string pin "$pin"
json_add_int default "$default" json_add_int default "$default"
json_select .. json_select ..
json_select .. json_select ..

Loading…
Cancel
Save