#!/bin/sh # jtagtest # # requires: # -) arping # -) nmap # # Created by Peter Puppe on 31.07.13. # MAXTIME=75 TMPFILE1="/tmp/testjtag_tmpfile1-$$" TMPFILE2="/tmp/testjtag_tmpfile2-$$" TMPFILE3="/tmp/testjtag_tmpfile3-$$" #give DCSBoard as $1 and NEXTBOARD as $2 and NEXTBOARDMACETHER as $3 power_cycle() { MAXTIME=75 THISDCSBoard=$1 THISNEXTBOARD=$2 THISNEXTBAORMACETHER=$3 #power cycle echo "Starting power cycle for $THISNEXTBOARD" ssh root@$THISDCSBoard "/usr/local/sbin/nextboard 2 > /dev/null ; sleep 2; /usr/local/sbin/nextboard 0 > /dev/null" #Waiting for reboot echo "Waiting for boot of $THISNEXTBOARD..." RET=1 STARTSECS=`date +%s` COUNT=0 #sleep 10 while([ $COUNT -lt $MAXTIME -a $RET -ne 0 ]) do ping -c 1 $THISNEXTBOARD 2>&1 > /dev/null #$2 is NEXTBOARD RET=$? nowsecs=`date +%s` # echo "Second $((nowsecs-STARTSECS))" echo -n "." COUNT=$((COUNT+1)) sleep 1 done if [ $RET -ne 0 ]; then echo "Next board $THISNEXTBOARD with MAC: $NEXTBOARDMACETHER did not boot after $((nowsecs-STARTSECS)) seconds" #echo "$1 JTAG_NOTOK" exit 1 else echo "Next board $THISNEXTBOARD with MAC: $NEXTBOARDMACETHER booted in $((nowsecs-STARTSECS)) seconds" fi #Waiting for ssh echo "Waiting for ssh..." COUNT=0 RET=1 while([ $COUNT -lt $MAXTIME -a $RET -ne 0 ]) do nmap -p22 $THISNEXTBOARD | grep "open ssh" RET=$? echo -n "." COUNT=$((COUNT+1)) sleep 1 done if [ $COUNT -eq $MAXTIME ]; then echo "Error: No ssh connection to restarted board $THISNEXTBOARD with MAC: $THISNEXTBOARDMACETHER" exit 1 else echo "...ssh found." fi return 0 } #end of power_cycle() data_readout() { echo "------------------------------------------------------------------------------------------" echo "Checking JTAG connection from ${DCSBoard} IP: ${BOARDIP} MAC: ${BOARDMAC} to next board..." #login and check JTAG sleep 5 REMOTE=root@$BOARDIP ssh $REMOTE 'echo -e "cable file /dev/jtag\ndetect\nquit" > /tmp/jtagscr ; /usr/local/sbin/jtag /tmp/jtagscr' > $TMPFILE1 grep "Part:" $TMPFILE1 grep "Chain length: 3" $TMPFILE1 if [ $? -ne 0 ]; then echo "Error: No or wrong JTAG chain detected." #echo "$1 JTAG_NOTOK" exit 1 fi #Retrieving next Board IP from JTAG #ISSUE: After this, the board is unreachable via ethernet!!! ssh $REMOTE 'echo -e "cable file /dev/jtag\ndetect\ninitbus epxa1\ndetectflash\nreadmem 0x40000 256 /tmp/nextboardenv" > /tmp/jtagscr ; /usr/local/sbin/jtag /tmp/jtagscr' > $TMPFILE1 scp $REMOTE:/tmp/nextboardenv $TMPFILE2 if [ $? -ne 0 ]; then echo "Error: Could not get next boards environment data via JTAG." #echo "$1 JTAG_NOTOK" exit 1 fi #returning NEXTBOARDMAC as $1 THISNEXTBOARDMAC=`strings $TMPFILE2 | sed "s/ /\n/g" | grep "easynet_mac" | sed 's/^.*=//' | head -1` eval "$1='$THISNEXTBOARDMAC'" filesboardnum=`strings $TMPFILE2 | sed "s/ /\n/g" | grep "easynet_mac" | sed 's/^.*=//' | head -1 | sed 's/^..:..:..://' | sed 's/://g' | sed "s/.*/0x&/" | xargs printf "%d"` NEXTBOARDNUM=`printf "dcs%04d" "$filesboardnum"` echo "At $DCSBoard: next board: $NEXTBOARDNUM MAC: $NEXTBOARDMAC" } #end of data_readout() # retrieve layer from folder name LAYER=${PWD#${PWD%?}} if expr "$LAYER" : '-\?[0-5]\+$' >/dev/null then echo "Testing layer ${LAYER}." else echo "The extracted layer value is not a valid integer between 0 and 5. Please use this script in a layer folder." exit 1 fi # distinguish layer typ (1,3,5) or (0,2,4) if [ $(($LAYER%2)) -eq 0 ]; then # case (0,2,4) #echo "layer: $LAYER modulo 2 is zero" X=1 stack=0 else #this ist for the case (1,3,5) X=-1 stack=4 fi l=$LAYER while [ true ] do ####### #construct DSC Board name DCSBoard="l${l}s$stack" #echo "$DCSBoard" ##### # existence and IP # asks if given host is known by the system IS_IP=`host $DCSBoard | grep -c address` if [ "$IS_IP" == "1" ]; then # the ip is the 4th word ($4) in the answer of the "host...grep address" command # BOARDIP=`host $DCSBoard |grep address | awk '{print $4}'` BOARDIP=`sudo arping -c 1 $DCSBoard | grep -m 1 reply | awk '{print $4}'` # echo "BoardIP $BOARDIP" else echo "ERROR: $DCSBoard is not known by the (ethernet) system." exit 1 fi ######## #DCSBoard alive? ping -c 1 $DCSBoard 2>&1 > /dev/null if [ $? != 0 ]; then echo "No ping response from active Board: ${DCSBoard}." echo "Expected Board IP: ${BOARDIP}." echo "Please check the ethernet connection." exit 1 fi #read out MAC address BOARDMAC=`sudo arping -c 1 $DCSBoard | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` #echo "MAC: $BOARDMAC" NEXTBOARDMAC='' #distinction of cases if [ $stack -eq 4 -a $X -eq 1 ]; then if [ $l -ne $LAYER ]; then #case l=LAYER-1 NEXTBOARDMACETHER=`sudo arping -c 1 l${LAYER}s4 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` data_readout NEXTBOARDMAC #echo jtag data and write NEXTBOARDMAC into NEXTBOARDMAC power_cycle "$DCSBoard" l${LAYER}s4 "$NEXTBAORDMACETHER" if [ "$NEXTBOARDMAC" == "$NEXTBOARDMACETHER" ]; then echo "------------------------------------------------------------------------------------------" echo "JTAG test of layers ${l} and ${LAYER} successfully accomplished." break else echo "Error: Inconsistent JTAG and ethernet order $DCSBoard->l${LAYER}s4." echo "NEXTBOARDMAC JTAG: $NEXTBOARDMAC" echo "NEXTBOARDMAC ethernet: $NEXTBOARDMACETHER" fi else #case l=LAYER let nextlayer=$l+1 NEXTBOARDMACETHER=`sudo arping -c 1 l${LAYER}s0 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` NEXTBOARDMACETHER2=`sudo arping -c 1 l${nextlayer}s4 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` data_readout NEXTBOARDMAC #echo jtag data and write NEXTBOARDMAC into NEXTBOARDMAC if [ "$NEXTBOARDMAC" == "$NEXTBOARDMACETHER" ]; then power_cycle "$DCSBoard" l${LAYER}s0 "$NEXTBAORDMACETHER" echo "------------------------------------------------------------------------------------------" echo "JTAG test of layer ${LAYER} successfully accomplished." break else if [ "$NEXTBOARDMAC" != "$NEXTBOARDMACETHER2" ]; then echo "Error: Inconsistent JTAG and ethernet order l${l}s4->l${nextlayer}s4." exit 1 else power_cycle "$DCSBoard" l${nextlayer}s4 "$NEXTBAORDMACETHER2" echo "--- JTAG connection $DCSBoard->l${nextlayer}s4 verified. ---" X=-1 let l+=1 fi fi fi else if [ $stack -eq 0 -a $X -eq -1 ]; then if [ $l -ne $LAYER ]; then #case l=LAYER+1 NEXTBOARDMACETHER=`sudo arping -c 1 l${LAYER}s0 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` data_readout NEXTBOARDMAC #echo jtag data and write NEXTBOARDMAC into NEXTBOARDMAC if [ "$NEXTBOARDMAC" == "$NEXTBOARDMACETHER" ]; then power_cycle "$DCSBoard" l${LAYER}s0 "$NEXTBAORDMACETHER" echo "------------------------------------------------------------------------------------------" echo "JTAG test of layers ${LAYER} and ${l} successfully accomplished." break else echo "Error: Inconsistent JTAG and ethernet order $DCSBoard->l${LAYER}s0." echo "NEXTBOARDMAC JTAG: $NEXTBOARDMAC" echo "NEXTBOARDMAC ethernet: $NEXTBOARDMACETHER" fi else #case l=LAYER let nextlayer=$l-1 NEXTBOARDMACETHER=`sudo arping -c 1 l${LAYER}s4 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` NEXTBOARDMACETHER2=`sudo arping -c 1 l${nextlayer}s0 | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` data_readout NEXTBOARDMAC #echo jtag data and write NEXTBOARDMAC into NEXTBOARDMAC if [ "$NEXTBOARDMAC" == "$NEXTBOARDMACETHER" ]; then power_cycle "$DCSBoard" l${LAYER}s4 "$NEXTBAORDMACETHER" echo "------------------------------------------------------------------------------------------" echo "JTAG test of layer ${LAYER} successfully accomplished." break else if [ "$NEXTBOARDMAC" != "$NEXTBOARDMACETHER2" ]; then echo "Error: Inconsistent JTAG and ethernet order $DCSBoard->l${nextlayer}s0." exit 1 else power_cycle "$DCSBoard" l${nextlayer}s0 "$NEXTBAORDMACETHER2" X=1 let l-=1 fi fi fi else #normal case let nextstack=$stack+$X NEXTBOARDMACETHER=`sudo arping -c 1 l${l}s${nextstack} | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` if [ "$nextstack" -eq "2" ]; then let nextnextstack=$nextstack+$X NEXTBOARDMACETHER2=`sudo arping -c 1 l${l}s${nextnextstack} | grep -m 1 reply | awk '{print $5}' | sed 's/\[//; s/\]//'` fi data_readout NEXTBOARDMAC #echo jtag data and write NEXTBOARDMAC into NEXTBOARDMAC if [ "$NEXTBOARDMAC" != "$NEXTBOARDMACETHER" ]; then if [ "$nextstack" -eq "2" -a "$NEXTBOARDMAC" == "$NEXTBOARDMACETHER2" ]; then power_cycle "$DCSBoard" l${l}s${nextnextstack} "$NEXTBAORDMACETHER2" echo "--- JTAG connection $DCSBoard->l${l}s${nextnextstack} verified. ---" echo "--- This SM has no stack 2. ---" let stack+=X let stack+=X else echo "Error: Inconsistent JTAG and ethernet order $DCSBoard->l${l}s${nextstack}." echo "NEXTBOARDMAC JTAG: $NEXTBOARDMAC" echo "NEXTBOARDMAC ethernet: $NEXTBOARDMACETHER" exit 1 fi else power_cycle "$DCSBoard" l${l}s${nextstack} "$NEXTBAORDMACETHER" echo "--- JTAG connection $DCSBoard->l${l}s${nextstack} verified. ---" let stack+=X fi fi fi rm -f $TMPFILE1 rm -f $TMPFILE2 #rm -f $TMPFILE3 done