Beaglebone Novatel USB760 Freeze

I’ve been running tests on a BBB using a Novatel USB760 cellular modem. The test I am running is rather simple-- just pinging the modem for it’s RSSI settings so that I can modify some BB led’s to show reception levels [4 ‘bars’].

After some time the modem freezes and stops communicating. Breaking the script and restarting doesn’t help-- all communication to the USB stick is dead and a reboot is required. I’m doubtful it is the USB stick itself since there’s been a lot of internet chatter of issues with the USB drivers on Linux [but I could be wrong].

My boot command line:

cmdline=console=ttyO0,115200n8 root=/dev/mmcblk0p1 quiet loglevel=3 usbcore.autosuspend=-1

I am using:

4.1.15-ti-rt-r48

I added “autosuspend” as a suggestion from another site [and have yet to test it].

The last test I ran [without autosuspend] got me to 15,577 seconds (4 hours) and an iteration count of 70,741. At that point, a lock up occurred. lsusb still showed the USB stick was present.

Anyone have any suggestions?

Here’s my script:

#!/bin/bash
leddir="/sys/class/gpio"
cmdport="/dev/ttyUSB0"

Specify which GPIOs belong to which LEDs.

led_1_gpio=46
led_2_gpio=27
led_3_gpio=65
led_4_gpio=22

Locale of GPIO pins in fsys

led_1_bar="$leddir/gpio$led_1_gpio"
led_2_bar="$leddir/gpio$led_2_gpio"
led_3_bar="$leddir/gpio$led_3_gpio"
led_4_bar="$leddir/gpio$led_4_gpio"

function traperr {
while read -t 0 var < $cmdport; do continue; done
echo “err”
}
trap traperr ERR

function setup_gpios {

If GPIOs are not already exported, export them here.

Set their directions to output.

if [ ! -e $led_1_bar ]; then
echo $led_1_gpio > $leddir/export
echo out > $led_1_bar/direction
fi
if [ ! -e $led_2_bar ]; then
echo $led_2_gpio > $leddir/export
echo out > $led_2_bar/direction
fi
if [ ! -e $led_3_bar ]; then
echo $led_3_gpio > $leddir/export
echo out > $led_3_bar/direction
fi
if [ ! -e $led_4_bar ]; then
echo $led_4_gpio > $leddir/export
echo out > $led_4_bar/direction
fi
}

function flush_modem {
echo “Flushing buffers…”
input="$cmdport"
echo -e -n “\r”
while read -t 0 var < $cmdport; do continue; done
}

function get_attention {
input="$cmdport"
echo “Detecting modem…”

Get modem attention

echo -e -n “\n\n”
tries=1

until [[ “$line” == “OK” && “$tries” -lt 10 ]]
do
echo -e -n “Try #$tries\r”
echo -e -n “\nAT\n” > $cmdport
read -r -t 2 line
tries=$((tries+1))
done < “$input”

echo -e “\n”
if [ “$tries” -eq 10 ]; then
echo “Could not establish communication to modem, giving up.”
exit 1
fi
}

function query_modem {
input="$cmdport"

Communicate to the USB Wireless adaptor modem.

Query for RSSI - Receive Signal Strength Indicator

echo -e -n “\nAT$NWRSSI\n” > $cmdport

Command USB for RSSI info

while read -r -t 2 line; do
if [[ -z $line ]]; then
continue;
elif [[ “$line” == “OK” ]]; then
break;
else
rssi=${line#*=}
echo “$counter>$rssi”
counter=$((counter+1))

Change LEDS - Only channel 1 is used on Onyxx

110+ : No leds (bad quality)

94 - 109 : 1 led (marginal)

85 - 93 : 2 leds (okay)

75 - 84 : 3 leds (good)

0 - 74 : 4 leds (excellent)

rssi=$(echo $rssi | tr -d “[:alpha:][:blank:][:space:][:punct:]”)

if [[ $rssi -ge 110 ]]; then
echo 0 > $led_1_bar/value
echo 0 > $led_2_bar/value
echo 0 > $led_3_bar/value
echo 0 > $led_4_bar/value
elif [[ $rssi -ge 94 ]]; then
echo 0 > $led_1_bar/value
echo 0 > $led_2_bar/value
echo 0 > $led_3_bar/value
echo 1 > $led_4_bar/value
elif [[ $rssi -ge 85 ]]; then
echo 0 > $led_1_bar/value
echo 0 > $led_2_bar/value
echo 1 > $led_3_bar/value
echo 1 > $led_4_bar/value
elif [[ $rssi -ge 75 ]]; then
echo 0 > $led_1_bar/value
echo 1 > $led_2_bar/value
echo 1 > $led_3_bar/value
echo 1 > $led_4_bar/value
elif [[ $rssi -gt 0 ]]; then
echo 1 > $led_1_bar/value
echo 1 > $led_2_bar/value
echo 1 > $led_3_bar/value
echo 1 > $led_4_bar/value
fi;
fi;
done < “$input”
}

The program main()

echo “USB760 RSSI Bar Application”
setup_gpios
flush_modem
get_attention

counter=1
while true; do
sleep 0.1 # Allow USB to catch it’s breath
query_modem
done

http://sreenu.searchbuk.com/