diff options
author | John Crispin <john@openwrt.org> | 2015-07-08 14:25:52 +0000 |
---|---|---|
committer | John Crispin <john@openwrt.org> | 2015-07-08 14:25:52 +0000 |
commit | d65916047b44d6d157d88d15e8e3d92555c5e6f8 (patch) | |
tree | d56188236b309c68e89d312bddcf006a6e624f48 | |
parent | 227aafc4dbf704e8c2c5e28bbad10a32d9cad6cb (diff) | |
download | mtk-20170518-d65916047b44d6d157d88d15e8e3d92555c5e6f8.zip mtk-20170518-d65916047b44d6d157d88d15e8e3d92555c5e6f8.tar.gz mtk-20170518-d65916047b44d6d157d88d15e8e3d92555c5e6f8.tar.bz2 |
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
3 files changed, 91 insertions, 0 deletions
diff --git a/package/base-files/files/etc/init.d/gpio_switch b/package/base-files/files/etc/init.d/gpio_switch new file mode 100755 index 0000000..1f1b44b --- /dev/null +++ b/package/base-files/files/etc/init.d/gpio_switch @@ -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 + } +} diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh index 5a8809d..6577ecd 100644 --- a/package/base-files/files/lib/functions/uci-defaults.sh +++ b/package/base-files/files/lib/functions/uci-defaults.sh @@ -2,6 +2,7 @@ # Copyright (C) 2011 OpenWrt.org UCIDEF_LEDS_CHANGED=0 +UCIDEF_GPIO_SWITCHES_CHANGED=0 ucidef_set_led_netdev() { local cfg="led_$1" @@ -180,6 +181,29 @@ ucidef_commit_leds() [ "$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() { uci batch <<EOF set network.loopback='interface' diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches new file mode 100644 index 0000000..81d3982 --- /dev/null +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches @@ -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 |