c5bf9a8ced
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>
67 lines
1.3 KiB
Bash
Executable File
67 lines
1.3 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2015 OpenWrt.org
|
|
|
|
START=94
|
|
STOP=10
|
|
USE_PROCD=1
|
|
|
|
|
|
load_gpio_switch()
|
|
{
|
|
local name
|
|
local gpio_pin
|
|
local value
|
|
|
|
config_get gpio_pin "$1" gpio_pin
|
|
config_get name "$1" name
|
|
config_get value "$1" value 0
|
|
|
|
[ -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
|
|
[ -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
|
|
gpio_path="/sys/class/gpio/${gpio_pin}"
|
|
|
|
[ -d "$gpio_path" ] && {
|
|
{ [ "$value" = "0" ] && echo "0" || echo "1"; } \
|
|
>"$gpio_path/value"
|
|
}
|
|
fi
|
|
}
|
|
|
|
service_triggers()
|
|
{
|
|
procd_add_reload_trigger "system"
|
|
}
|
|
|
|
start_service()
|
|
{
|
|
[ -e /sys/class/gpio/ ] && {
|
|
config_load system
|
|
config_foreach load_gpio_switch gpio_switch
|
|
}
|
|
}
|