base-files: implemented basic GPIO control

Internal GPIO pins are used for PoE passthrough setups in multi-port
routers. This patch implemnets control over this hardware feature for
Ubiquiti Nanostations and TP-Link CPE510.

Signed-off-by: Lars Kruse <lists@sumpfralle.de>

SVN-Revision: 46271
This commit is contained in:
John Crispin 2015-07-08 14:25:52 +00:00
parent 227aafc4db
commit d65916047b
3 changed files with 91 additions and 0 deletions

View file

@ -0,0 +1,42 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2015 OpenWrt.org
START=98
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
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
echo out >"$gpio_path/direction"
}
# write 0 or 1 to the "value" field
{ [ "$value" = "0" ] && echo "0" || echo "1"; } >"$gpio_path/value"
}
service_triggers()
{
procd_add_reload_trigger "system"
}
start_service()
{
[ -e /sys/class/gpio/ ] && {
config_load system
config_foreach load_gpio_switch gpio_switch
}
}

View file

@ -2,6 +2,7 @@
# Copyright (C) 2011 OpenWrt.org # Copyright (C) 2011 OpenWrt.org
UCIDEF_LEDS_CHANGED=0 UCIDEF_LEDS_CHANGED=0
UCIDEF_GPIO_SWITCHES_CHANGED=0
ucidef_set_led_netdev() { ucidef_set_led_netdev() {
local cfg="led_$1" local cfg="led_$1"
@ -180,6 +181,29 @@ ucidef_commit_leds()
[ "$UCIDEF_LEDS_CHANGED" = "1" ] && uci commit system [ "$UCIDEF_LEDS_CHANGED" = "1" ] && uci commit system
} }
ucidef_set_gpio_switch() {
local cfg="gpio_switch_$1"
local name="$2"
local gpio_pin="$3"
# use "0" as default value
local default="${4:-0}"
uci -q get "system.$cfg" && return 0
uci batch <<EOF
set system.$cfg='gpio_switch'
set system.$cfg.name='$name'
set system.$cfg.gpio_pin='$gpio_pin'
set system.$cfg.value='$default'
EOF
UCIDEF_GPIO_SWITCHES_CHANGED=1
}
ucidef_commit_gpio_switches()
{
[ "$UCIDEF_GPIO_SWITCHES_CHANGED" = "1" ] && uci commit system
}
ucidef_set_interface_loopback() { ucidef_set_interface_loopback() {
uci batch <<EOF uci batch <<EOF
set network.loopback='interface' set network.loopback='interface'

View file

@ -0,0 +1,25 @@
#!/bin/sh
#
# Copyright (C) 2015 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
. /lib/ar71xx.sh
board=$(ar71xx_board_name)
case "$board" in
nanostation-m)
ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "2"
;;
nanostation-m-xw)
ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "8"
;;
cpe510)
ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "20"
;;
esac
ucidef_commit_gpio_switches
exit 0