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