diff options
Diffstat (limited to 'kernel/xpp/utils/xpp_fxloader')
-rwxr-xr-x | kernel/xpp/utils/xpp_fxloader | 164 |
1 files changed, 114 insertions, 50 deletions
diff --git a/kernel/xpp/utils/xpp_fxloader b/kernel/xpp/utils/xpp_fxloader index 925ee97..feaf712 100755 --- a/kernel/xpp/utils/xpp_fxloader +++ b/kernel/xpp/utils/xpp_fxloader @@ -2,13 +2,34 @@ # xpp_fxloader: load Xorcom Astribank (XPP) firmware # +# Written by Tzafrir Cohen <tzafrir.cohen@xorcom.com> +# Copyright (C) 2006, 2007, 2008, Xorcom +# +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +# # This script can be run manually or from hotplug/udev. # # Firmware files should be located in $FIRMWARE_DIR which defaults: # 1. /usr/share/zaptel # 2. Can be overidden by setting $FIRMWARE_DIR in the environment -# 3. Can be overidden by setting $FIRMWARE_DIR in /etc/default/zaptel -# +# 3. Can be overidden by setting $FIRMWARE_DIR in /etc/sysconfig/zaptel (Red Hat derivatives) +# or /etc/default/zaptel (Debian derivatives) # Manual Run # ########## # @@ -76,10 +97,9 @@ DEVUSB_PREFIX=/dev/bus/usb USB_PREFIX= FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/zaptel}" +ASTRIBANK_HEXLOAD=${ASTRIBANK_HEXLOAD:-/usr/sbin/astribank_hexload} +ASTRIBANK_TOOL=${ASTRIBANK_TOOL:-/usr/sbin/astribank_tool} -FIRM_FXS=$FIRMWARE_DIR/FPGA_FXS.hex - -FPGA_LOAD=${FPGA_LOAD:-/usr/sbin/fpga_load} USB_FW="${USB_FW:-USB_FW.hex}" if [ -r "$DEFAULTS" ]; then @@ -112,12 +132,37 @@ find_dev() { lsusb | tr -d : | awk "/ ID $v_id$p_id/{printf \"$USB_PREFIX/%s/%s \",\$2,\$4}" } -do_fxload() { +run_fxload() { sleep_if_race - ( fxload -t fx2 $* 2>&1 1>/dev/null || exit 1 ) | $LOGGER + fxload -t fx2 $* 2>&1 1>/dev/null | $LOGGER + status=$PIPESTATUS + if [ $status != 0 ]; then + $LOGGER "fxload failed with status $status" + exit 55 + fi } -load_fw() { +run_astribank_hexload() { + $LOGGER "Running: $ASTRIBANK_HEXLOAD $*" + $ASTRIBANK_HEXLOAD "$@" | $LOGGER + status=$PIPESTATUS + if [ $status != 0 ]; then + $LOGGER "$ASTRIBANK_HEXLOAD failed with status $status" + exit 77 + fi +} + +run_astribank_tool() { + $LOGGER "Running: $ASTRIBANK_TOOL $*" + $ASTRIBANK_TOOL "$@" | $LOGGER + status=$PIPESTATUS + if [ $status != 0 ]; then + $LOGGER "$ASTRIBANK_TOOL failed with status $status" + exit 77 + fi +} + +load_usb_fw() { v_id=$1 p_id=$2 fw=$3 @@ -125,34 +170,48 @@ load_fw() { devices=`find_dev $v_id $p_id` for dev in $devices do - $LOGGER "USB Firmware $FIRMWARE_DIR/$fw into $dev" - do_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1 + ver=$(awk '/\$Id:/ { print $4 }' $FIRMWARE_DIR/$fw) + $LOGGER "USB Firmware $FIRMWARE_DIR/$fw (Version=$ver) into $dev" + run_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1 done } -load_fpga() { +load_fw_device() { + dev=$1 + fw=$2 + $LOGGER "FPGA loading $fw into $dev" + run_astribank_hexload -D "$dev" -F "$FIRMWARE_DIR/$fw" + pic_files=`echo "$FIRMWARE_DIR"/PIC_TYPE_[1-4].hex` + $LOGGER "PIC burning into $dev: $pic_files" + run_astribank_hexload -D "$dev" -p $pic_files + run_astribank_tool -D "$dev" -n # Do renumeration! + $LOGGER "PIC burning finished $pic_files" +} + +# +# Use in manual loading. Parallelize loading +# firmwares to all of our devices +# +firmware_by_id() { v_id=$1 p_id=$2 fw=$3 devices=`find_dev $v_id $p_id` + childs="" for dev in $devices do ( - card_ver=`$FPGA_LOAD -g -D $dev | sed -n 's/^.*Release: *//'` + set -e - $LOGGER "FPGA Firmware into $dev" + load_fw_device "$dev" "$fw" sleep_if_race - $FPGA_LOAD -D "$dev" -I "$FIRMWARE_DIR/$fw" -i | $LOGGER - status=$PIPESTATUS - if [ $status != 0 ]; then - echo "fpga_load failed with status $status" | $LOGGER - exit 77 - fi ) & + childs="$childs $!" sleep 0.4 done - wait + # Wait for specific childs to get their exit status + wait $childs } numdevs() { @@ -188,23 +247,26 @@ wait_renumeration() { reset_fpga() { totaldevs=`numdevs e4e4 '11[3456][012]'` devices=`find_dev e4e4 '11[3456][12]'` - echo "Reseting devices [$totaldevs devices]" + $LOGGER "Reseting devices [$totaldevs devices]" for dev in $devices do $LOGGER "Resetting FPGA Firmware on $dev" sleep_if_race - $FPGA_LOAD -D "$dev" -r 2>&1 >/dev/null | $LOGGER - status=$PIPESTATUS - if [ "$status" != 0 ]; then - echo "fpga_load failed removing with status $status" | $LOGGER - exit 78 - fi + run_astribank_tool -D "$dev" -r full 2>&1 >/dev/null done if [ "$1" = 'wait' ]; then wait_renumeration $totaldevs e4e4 '11[3456]0' fi } +usage() { + echo "$0: Astribank firmware loading script." + echo "Usage: " + echo "$0 load : manual firmware loading." + echo "$0 usb : manual firmware loading: USB firmware only." + echo "$0 help : this text." +} + ######################### ## ## Manual run @@ -226,36 +288,38 @@ reset) ;; xppdetect|load|usb) numdevs=`numdevs e4e4 '11[3456][01]'` - echo "--------- FIRMWARE LOADING: ($1) [$numdevs devices]" + $LOGGER -- "--------- FIRMWARE LOADING: ($1) [$numdevs devices]" - load_fw e4e4 1130 $USB_FW - load_fw e4e4 1140 $USB_FW - load_fw e4e4 1150 $USB_FW - load_fw e4e4 1160 $USB_FW + load_usb_fw e4e4 1130 $USB_FW + load_usb_fw e4e4 1140 $USB_FW + load_usb_fw e4e4 1150 $USB_FW + load_usb_fw e4e4 1160 $USB_FW wait_renumeration $numdevs e4e4 '11[3456]1' if [ "$1" != 'usb' ] then - load_fpga e4e4 1131 FPGA_FXS.hex - load_fpga e4e4 1141 FPGA_1141.hex - load_fpga e4e4 1151 FPGA_1151.hex - load_fpga e4e4 1161 FPGA_1161.hex + firmware_by_id e4e4 1131 FPGA_FXS.hex + firmware_by_id e4e4 1141 FPGA_1141.hex + firmware_by_id e4e4 1151 FPGA_1151.hex + firmware_by_id e4e4 1161 FPGA_1161.hex wait_renumeration $numdevs e4e4 '11[3456]2' fi sleep 3 # Let it stabilize - echo "--------- FIRMWARE IS LOADED" + $LOGGER -- "--------- FIRMWARE IS LOADED" exit 0 ;; help) - echo "$0: Astribank firmware loading script." - echo "Usage: " - echo "$0 load : manual firmware loading." - echo "$0 usb : manual firmware loading: USB firmware only." - echo "$0 help : this text." - echo "" - echo "('xppdetect' is an alias of 'load')" + usage exit 0 ;; +*) + if [ "$ACTION" = '' ]; then # not called from hotplug + echo "$0: Error: unknown command \"$1\"" + echo '' + usage + exit 1 + fi + ;; esac ######################### @@ -274,19 +338,19 @@ then $LOGGER "Trying to find what to do for product $PRODUCT, device $DEVICE" prod_id=`echo "$PRODUCT" | cut -d/ -f2` case "$PRODUCT" in - e4e4/11[345]0/*) + e4e4/11[3456]0/*) FIRM_USB="$FIRMWARE_DIR/$USB_FW" $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'" - do_fxload -D "$DEVICE" -I "$FIRM_USB" + run_fxload -D "$DEVICE" -I "$FIRM_USB" ;; - e4e4/11[345]1/*) + e4e4/11[3456]1/*) if [ "$prod_id" = 1131 ]; then - FIRM_FPGA="$FIRMWARE_DIR/FPGA_FXS.hex" # Legacy + FIRM_FPGA="FPGA_FXS.hex" # Legacy else - FIRM_FPGA="$FIRMWARE_DIR/FPGA_$prod_id.hex" + FIRM_FPGA="FPGA_$prod_id.hex" fi sleep_if_race - $FPGA_LOAD -D "$DEVICE" -I "$FIRM_FPGA" 2>&1 >/dev/null | $LOGGER + load_fw_device "$DEVICE" "$FIRM_FPGA" ;; esac fi |