xpp: safer compilation
[dahdi/tools.git] / xpp / astribank_upgrade
1 #!/bin/bash
2
3 # astribank_upgrade: force load Xorcom Astribank (XPP) USB firmware
4 # A reduced version of xpp_fxloader for manual upgrades.
5 #
6 # Written by Oron Peled <oron@actcom.co.il>
7 # Copyright (C) 2009 Xorcom
8 #
9 # All rights reserved.
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #
25
26 set -e
27
28 # Make sure fxload is in the path:
29 PATH="$PATH:/usr/local/sbin:/sbin:/usr/sbin"
30 export PATH
31
32 me=`basename $0`
33
34 if [ -t 2 ]; then
35         LOGGER="logger -i -t '$me' -s"
36 else
37         LOGGER="logger -i -t '$me'"
38 fi
39
40 USBFS_PREFIX=/proc/bus/usb
41 DEVUSB_PREFIX=/dev/bus/usb
42 USB_PREFIX=
43
44 USB_FW="${USB_FW:-USB_FW.hex}"
45
46 if [ "$USB_PREFIX" = '' ]; then
47         if [ -d "$DEVUSB_PREFIX" ]; then
48                 USB_PREFIX=$DEVUSB_PREFIX
49         elif [ -r "$USBFS_PREFIX/devices" ]; then
50                 USB_PREFIX=$USBFS_PREFIX
51         fi
52 fi
53
54 # With Kernels older that 2.6.10 it seems to be possible
55 # to trigger a race condition by running fxload or fpga_load 
56 # immediately after the detection of the device.
57 KERNEL_HAS_USB_RACE=0
58 case "`uname -r`" in 2.6.[89]*) KERNEL_HAS_USB_RACE=1;; esac
59 sleep_if_race() {
60   if [ "$KERNEL_HAS_USB_RACE" = '1' ]; then
61     sleep 2
62   fi
63 }
64
65 find_dev() {
66   v_id=$1
67   p_id=$2
68   
69   lsusb | tr -d : | awk "/ ID $v_id$p_id/{printf \"$USB_PREFIX/%s/%s \",\$2,\$4}"
70 }
71
72 run_fxload() {
73   sleep_if_race
74   fxload -t fx2 $* 2>&1 1>/dev/null | $LOGGER
75   status=$PIPESTATUS
76   if [ $status != 0 ]; then
77     $LOGGER "fxload failed with status $status"
78     exit 55
79   fi
80 }
81
82 load_usb_fw() {
83   v_id=$1
84   p_id=$2
85   fw=$3
86   
87   devices=`find_dev $v_id $p_id`
88   for dev in $devices
89   do
90     ver=$(awk '/\$Id:/ { print $4 }' $FIRMWARE_DIR/$fw)
91     $LOGGER "USB Firmware $FIRMWARE_DIR/$fw (Version=$ver) into $dev"
92     run_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1
93   done
94 }
95
96 numdevs() {
97   v_ids="$1"
98   p_ids="$2"
99
100   for v in $v_ids
101   do
102     (
103       for p in $p_ids
104       do
105         find_dev $v $p
106       done
107     )
108   done | wc -w
109 }
110
111 wait_renumeration() {
112   num="$1"
113   v_ids="$2"
114   p_ids="$3"
115
116   while
117     n=`numdevs "$v_ids" "$p_ids"`
118     [ "$num" -gt "$n" ]
119   do
120     echo -n "."
121     sleep 1
122   done
123   echo "Got all $num devices"
124 }
125
126 if [ "$#" -ne 1 ]; then
127         echo >&2 "Usage: $0 <firmware_directory>"
128         exit 1
129 fi
130 FIRMWARE_DIR="$1"
131 [ -f "$FIRMWARE_DIR/$USB_FW" ] || {
132         echo >&2 "$0: Could not find '$FIRMWARE_DIR/$USB_FW'"
133         exit 1
134 }
135 numdevs=`numdevs e4e4 '11[3456][01]'`
136 $LOGGER -- "--------- LOADING NEW USB FIRMWARE: ($1) [$numdevs devices]"
137 load_usb_fw e4e4 1130 $USB_FW
138 load_usb_fw e4e4 1140 $USB_FW
139 load_usb_fw e4e4 1150 $USB_FW
140 load_usb_fw e4e4 1160 $USB_FW
141 load_usb_fw e4e4 1131 $USB_FW
142 load_usb_fw e4e4 1141 $USB_FW
143 load_usb_fw e4e4 1151 $USB_FW
144 load_usb_fw e4e4 1161 $USB_FW
145 load_usb_fw e4e4 1132 $USB_FW
146 load_usb_fw e4e4 1142 $USB_FW
147 load_usb_fw e4e4 1152 $USB_FW
148 load_usb_fw e4e4 1162 $USB_FW
149 wait_renumeration $numdevs e4e4 '11[3456]1'
150 $LOGGER -- "--------- NEW USB FIRMWARE IS LOADED"