[zaptel-commits] tzafrir: branch 1.4 r2273 - /branches/1.4/zaptel.init

zaptel-commits at lists.digium.com zaptel-commits at lists.digium.com
Fri Mar 2 15:20:16 MST 2007


Author: tzafrir
Date: Fri Mar  2 16:20:15 2007
New Revision: 2273

URL: http://svn.digium.com/view/zaptel?view=rev&rev=2273
Log:
Support proper loading of the Astribank (xpp) with proper initialization.

Modified:
    branches/1.4/zaptel.init

Modified: branches/1.4/zaptel.init
URL: http://svn.digium.com/view/zaptel/branches/1.4/zaptel.init?view=diff&rev=2273&r1=2272&r2=2273
==============================================================================
--- branches/1.4/zaptel.init (original)
+++ branches/1.4/zaptel.init Fri Mar  2 16:20:15 2007
@@ -42,6 +42,72 @@
 for x in $MODULES; do 
     RMODULES="$x $RMODULES"
 done
+
+# Wait for Astribank to initialize registers:
+wait_for_xpp() {
+	if [ -d /proc/xpp ]
+	then
+		# reading from waitfor_xpds only returns when the device
+		# has finished initilizing its regiters and is available.
+		cat /proc/xpp/XBUS-*/waitfor_xpds 2>/dev/null >/dev/null  || true
+	fi
+}
+
+# Register to zaptel Astribank spans that were not autoomatically registered
+# (useful when you have more than one Astribank)
+zap_reg_xpp() {
+	if [ ! -d /proc/xpp ]; then return; fi
+	
+	# Get a list of connected Astribank devices, sorted by the name of 
+	# the USB connector. That order is rather arbitrary, but will not 
+	# change without changes to the cabling.
+	xbusses=`sort -k 2 /proc/xpp/xbuses | awk -F: '/STATUS=connected/ {print $1}'`
+
+	# get a list of XPDs that were not yet registered as zaptel spans.
+	# this will be the case if you set the parameter zap_autoreg=0 to
+	# the module xpp
+	# Append /dev/null to provide a valid file name in case of an empty pattern.
+	xbusses_pattern=`echo $xbusses| sed -e 's|XBUS-[0-9]*|/proc/xpp/&/XPD-*/zt_registration|g'`' /dev/null'
+	xpds_to_register=`grep -l 0 $xbusses_pattern 2>/dev/null` || true
+	for file in $xpds_to_register; do
+		echo 1 >$file
+	done
+}
+
+# If the system has an Astribank, select the right one as the sync source.
+# TODO: replace the sryptic awk code with 'xpp_sync auto' once it is in.
+fix_asterisbank_sync() {
+	# do nothing if module not present
+	if [ ! -d /proc/xpp ]; then return; fi
+	
+	#if ! grep -q '^HOST' /proc/xpp/sync 2>/dev/null; then return; fi
+
+	case "$XPP_SYNC" in
+	n*|N*) return;;
+	host|HOST) sync_value="HOST";;
+	[0-9]*)sync_value="$XPP_SYNC";;
+	*) 
+		# find the number of the first bus, and sync from it:
+		fxo_pat=`awk -F: '/STATUS=connected/{print $1}' /proc/xpp/xbuses | sed -e 's|.*|/proc/xpp/&/*/fxo_info|'`
+		# find the first FXO unit, and set it as the sync master
+		bus=`ls -1 $fxo_pat 2> /dev/null | head -n1 | cut -d- -f2 | cut -d/ -f1` 
+		
+		if [ "$bus" = '' ]; then
+			# no device with FXO found. Just get the first one
+			bus=`awk -F: '/STATUS=connected/{print $1}' /proc/xpp/xbuses | head -n 1 | cut -d- -f2`
+		fi
+
+		# do nothing if there is no bus:
+		case "$bus" in [0-9]*):;; *) return;; esac
+		sync_value="SYNC=$bus"
+		;;
+	esac
+	# the built-in echo of bash fails to print a proper error on failure
+	if ! /bin/echo "$sync_value" >/proc/xpp/sync
+	then 
+		echo >&2 "Updating XPP sync source failed (tried \"$sync_value\", XPP_SYNC='$XPP_SYNC')"
+	fi
+}
 
 # Check that telephony is up.
 [ "${TELEPHONY}" = "yes" ] || exit 0
@@ -88,7 +154,12 @@
 			echo -n " $x"
 		fi
 	done
-	sleep 3
+	sleep 3 # TODO: remove it
+	
+	wait_for_xpp
+	zap_reg_xpp
+	fix_asterisbank_sync # can actually be run after ztcfg
+	
 	if [ ! -e /proc/zaptel/1 ]; then
 		echo "No functioning zap hardware found in /proc/zaptel, loading ztdummy"
 		modprobe ztdummy >& /dev/null



More information about the zaptel-commits mailing list