diff options
Diffstat (limited to 'recipes-core/mlinux-scripts/mlinux-scripts-1.2/mlinux-switch-cell-fw')
-rwxr-xr-x | recipes-core/mlinux-scripts/mlinux-scripts-1.2/mlinux-switch-cell-fw | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/recipes-core/mlinux-scripts/mlinux-scripts-1.2/mlinux-switch-cell-fw b/recipes-core/mlinux-scripts/mlinux-scripts-1.2/mlinux-switch-cell-fw new file mode 100755 index 0000000..4065ccb --- /dev/null +++ b/recipes-core/mlinux-scripts/mlinux-scripts-1.2/mlinux-switch-cell-fw @@ -0,0 +1,211 @@ +#!/bin/bash +# This script assumes Verizon SIMS ICCID start with 89148 and is firmware 1. +# This script assumes T-Mobile SIMS start with 8901260 and is firmware 2. + +fwsw_modems=(LE910-NA1 LE910C4-NF) +mt_modems=(lna3 l4n1) +readme=/etc/ppp/peers/README.fwswitch +function setactivefirmware +{ + radio-cmd ${RADIOOPTION} --set-active-firmware $1 +# RESULT=$(radio-cmd ${RADIOOPTION} 'AT#FWSWITCH='$1',1' 2>&1) +# if (($? != 0)) ; then +# >&2 echo "FW Set failed" +# return 1 +# fi +# if [[ $RESULT =~ [Ee][Rr][Rr][Oo][Rr] ]] ; then +# >&2 echo "FW Set failed" +# return 1 +# fi +} + +function getactivefirmware +{ + /usr/bin/radio-query ${RADIOOPTION} --active-firmware +# FW=$(/usr/bin/radio-cmd ${RADIOOPTION} 'AT#FWSWITCH?' 2>/dev/null) +# if (($? != 0)) ; then +# >&2 echo "FW Query failed" +# return 1 +# fi +# [[ $FW =~ \#FWSWITCH:[[:space:]]*([^,]*) ]] +# echo "${BASH_REMATCH[1]}" +} + +# See if string is in array of strings +# parm 1 String +# parm 2 Arrays of strings +function findItem { + local s check="$1" + shift + for s ; do + [[ "$s" == "$check" ]] && return 0; + done + return 1 +} + + +function usage { +>&2 echo " +Usage: $0 <image_id> [timeout] + image_id <0|1|2|-1> : for dual FW image SKU-s, the id of the image to switch to + -1 is based on SIM + timeout : wait time for radio to come up if set (default : 15 sec) + +" + exit 1 +} + +if [ $# -gt 2 ] ; then + usage +fi + +# +# Check if the radio present +# +MODEL=$(radio-query ${RADIOOPTION} --model 2>&1) +result=$? +if [[ $MCONTEXT =~ [Ee][Rr][Rr][Oo][Rr] ]] ; then + RADIOOPTION="${RADIOOPTION2}" + MODEL=$(radio-query ${RADIOOPTION} --model 2>&1) + result=$? +fi + +if ((result != 0)) ; then + [ "$VERBOSE" ] && >&2 echo "Assume no radio on this device." + exit 0 +fi + +# +# Load args (don't wait for the radio by default) +# +FWIMAGE=$1 +if ((FWIMAGE < -2)) || ((FWIMAGE > 2)) ; then + usage +fi +if ! >&2 /usr/sbin/mlinux-cell-radio-ready ; then + [ "$VERBOSE" ] && >&2 echo Radio is not ready + [ "$VERBOSE" ] && >&2 echo Try again later + exit 1 +fi +if ((FWIMAGE == -1)) ; then + iccid=$(radio-query ${RADIOOPTION} --iccid) + if (($? == 0)); then + if ((${#iccid} == 0)) ; then + [ "$VERBOSE" ] && >&2 echo "No carrier. Maybe no SIM?" + [ "$VERBOSE" ] && >&2 echo "ERROR: Cannot decide on firmware" + exit 1 + fi + if [[ $iccid =~ ^89148.* ]] ; then + # Verizon + logger -s -t mlinux-sw-firmware -p daemon.info "Assuming $iccid is a Verizon SIM ICCID using Firmware 1" + ((FWIMAGE=1)) + elif [[ $iccid =~ ^8901260.* ]] ; then + # T-Mobile + logger -s -t mlinux-sw-firmware -p daemon.info "Assuming $iccid is a T-Mobile SIM ICCID using Firmware 2" + ((FWMAGE=2)) + if [[ $MODEL == LE910-NA1 ]] ; then # Assume LNA3 has no firmware image 2 + ((FWIMAGE=0)) + fi + else + # Everybody else + logger -s -t mlinux-sw-firmware -p daemon.info "Assuming $iccid is a possibly AT&T SIM using Firmware 0" + ((FWIMAGE=0)) + fi + else + >&2 echo "Cannot get ICCID from SIM" + >&2 echo "Try again later" + exit 1 + fi +fi + + +TIMEOUT=${2:-15} +if [ "$VERBOSE" != "yes" ]; then + VERBOSE="" +fi + +[ "$VERBOSE" ] && >&2 echo -n "Switching the radio firmware image: " + +# +# Applicable for LTE910-NA1 and LE910C4-NF with dual FW images only +# +if ! findItem "$MODEL" "${fwsw_modems[@]}" ; then + echo "Firmware switch is not supported on ${MODEL}." + exit 1 +fi + +# +# Check if firmware switch is required +# +FWACTIVE=$(getactivefirmware) +if [ $? -ne 0 ] || [ "$FWACTIVE" == "" ]; then + [ "$VERBOSE" ] && >&2 echo "The $MODEL radio does not support firmware switching." + exit 0 +fi + +if (( FWACTIVE == FWIMAGE )); then + echo "Cellular radio firmware has already been switched to $FWIMAGE image." + exit 0 +fi + +# Disable the LNA3 chat script in case of failure. +for f in $mt_modems ; do + linkf=/etc/ppp/peers/${f}_chat + if ! [[ -L ${linkf} ]] || [[ $(basename $(readlink -f ${linkf})) != ${readme} ]] ; then + ln -sf "${readme}" "${linkf}" + echo "Chat script is now disabled." + fi +done + +# +# Switch the firmware +# +RESULT=$(setactivefirmware "$FWIMAGE") +if [ $? -ne 0 ]; then + [ "$VERBOSE" ] && >&2 echo "$RESULT" + exit 1 +fi + + +# +# Exit if no TIMEOUT set +# +# This is somewhat dangerous in that we assume the radio +# will switch. +if ((TIMEOUT == 0)) ; then + if ((FWIMAGE == 0)) ; then + [ "$VERBOSE" ] && >&2 echo "Use mlinux-switch-apn to switch the APN when the radio is ready, before dialing" + exit 0 + fi +fi +# +# +# Wait for the radio to be ready before continuing +# +COUNTER=0 + +[ "$VERBOSE" ] && echo -n "Wait..." + +# +# Give it some time +# +sleep 5 + +while [ $COUNTER -lt $TIMEOUT ]; do + MODEL=$(radio-query ${RADIOOPTION} --model) + if [ $? -eq 0 ]; then + echo "Cellular radio firmware has been switched to $FWIMAGE image." + exit 0 + fi + + let COUNTER=COUNTER+1 + + [ "$VERBOSE" ] && echo -n "." + + sleep 1 +done + +>&2 echo "Cellular radio is not ready." +>&2 echo "When it becomes ready, invoke /usr/sbin/mlinux-switch-apn" +>&2 echo "to set the APN" +exit 1 |