123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Mon, 7 Mar 2016 06:07:21 +0100
- Subject: 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>
- Backport of r46271
- 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 0000000000000000000000000000000000000000..1f1b44b2129ce2315943f6a10508eefb66412c48
- --- /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 5a8809d68c89ac0431919f15dad5f5c33351bbf2..6577ecdcde0c856b3e6dd1b9337f23cb782ef2be 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 0000000000000000000000000000000000000000..81d3982ed8bf98e01ce2e161017f088a1d0f60dc
- --- /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
|