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:
		
							
								
								
									
										42
									
								
								package/base-files/files/etc/init.d/gpio_switch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										42
									
								
								package/base-files/files/etc/init.d/gpio_switch
									
									
									
									
									
										Executable 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 | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -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' | ||||||
|   | |||||||
| @@ -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 | ||||||
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin