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 | ||||
|  | ||||
| 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' | ||||
|   | ||||
| @@ -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