[OpenWrt-Devel] [PATCH] implemented basic GPIO control

John Crispin blogic at openwrt.org
Tue Jul 7 06:54:17 EDT 2015


Hi Lars,

patch subject is missing the "base-files: " prefix. please fix and
resend. rest of the patch looks fine.

	John


On 01/07/2015 02:49, Lars Kruse wrote:
> 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 at sumpfralle.de>
> ---
>  package/base-files/files/etc/init.d/gpio_switch    | 42 ++++++++++++++++++++++
>  .../base-files/files/lib/functions/uci-defaults.sh | 24 +++++++++++++
>  .../base-files/etc/uci-defaults/01_gpio-switches   | 25 +++++++++++++
>  3 files changed, 91 insertions(+)
>  create mode 100755 package/base-files/files/etc/init.d/gpio_switch
>  create mode 100644 target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches
> 
> 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
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list