#!/bin/sh # Beeline run 2 (cold boot): modem-up -> GET detect -> (gated) ONE dms online -> passive wait <=600 s (GET only) # -> if NOT registered: read-only AT diag (+ transient AT+CEREG=, restored) -> mm-up (disabled, debug log). # NO AT+COPS=, no scan/register, no band/RAT, no APN/profile writes, no bearer. IMSI/ICCID/IMEI masked on-device. O=/tmp/bee2; mkdir -p $O; Q="qmicli -p -d /dev/wwan0qmi0"; t() { cut -d' ' -f1 /proc/uptime; } mask() { sed -E 's/([0-9]{6,})([0-9]{4})/******\2/g'; } B=/sys/bus/platform/devices/4080000.remoteproc:bam-dmux pm() { echo "### $(t) PM=$(cat $B/power/runtime_status 2>/dev/null) rproc=$(cat /sys/class/remoteproc/remoteproc0/state)"; } nv() { for want in modemst1 modemst2 fsg fsc persist; do for p in /sys/class/block/mmcblk0p*; do [ "$(sed -n 's/^PARTNAME=//p' $p/uevent)" = "$want" ] && echo "$want $(sha256sum /dev/$(basename $p) | cut -d' ' -f1)"; done; done; } fin() { nv > $O/nv-after.txt; cat /sys/block/mmcblk0/stat > $O/stat-after.txt cmp -s $O/nv-before.txt $O/nv-after.txt && echo "NV BEFORE==AFTER" > $O/nv-result.txt || echo "NV DIFFERENT" > $O/nv-result.txt awk '{print "writes_completed="$5" sectors_written="$7}' $O/stat-after.txt >> $O/nv-result.txt { pm; ip link show wwan0; ip route; dmesg | grep -iE "Failed to resume|-110|-22|Resource temporarily|Oops|panic|fatal|watchdog|crash|ssr"; echo dmesg-end; } > $O/state.txt 2>&1 cp /tmp/rmtfs.log $O/rmtfs.log; [ -f /tmp/mm.log ] && mask < /tmp/mm.log > $O/mm.log tar -C /tmp -cf /tmp/bee2.tar bee2; echo "BEE2-FINISHED $1"; } nv > $O/nv-before.txt; cat /sys/block/mmcblk0/stat > $O/stat-before.txt /bin/modem-up > $O/modem-up.txt 2>&1 for i in $(seq 1 30); do [ -e /dev/wwan0qmi0 ] && [ -e /sys/class/net/wwan0 ] && break; sleep 1; done /bin/qmi-b3 > $O/p2-detect.txt 2>&1 M=$(timeout 30 $Q --dms-get-operating-mode 2>&1); echo "$M" > $O/mode-before.txt grep -q "Card state: 'present'" $O/p2-detect.txt && grep -q "Application state: 'ready'" $O/p2-detect.txt || { echo "SIM NOT READY" > $O/stop.txt; fin SIM-NOT-READY; exit 1; } if echo "$M" | grep -q "Mode: 'online'"; then echo "already online - no SET" > $O/set.txt else { echo "### $(t) $Q --dms-set-operating-mode=online"; timeout 30 $Q --dms-set-operating-mode=online 2>&1; echo "### rc=$?"; } > $O/set.txt; fi timeout 30 $Q --dms-get-operating-mode > $O/mode-after.txt 2>&1 # --- passive timeline (GET only), <=600 s : > $O/timeline.txt; REG=0; T0=$(t) for i in $(seq 1 150); do R=$(timeout 20 $Q --nas-get-serving-system 2>&1); Y=$(timeout 20 $Q --nas-get-system-info 2>&1) S=$(timeout 20 $Q --nas-get-signal-info 2>&1); C=$(timeout 20 $Q --nas-get-cell-location-info 2>&1) echo "### $(t) $(echo "$R" | grep -E "Registration state|PS:|MNC:" | head -3 | tr -s ' \t\n' ' ')| SYS $(echo "$Y" | sed -n '/LTE service/,$p' | grep -E "Status:|True Status|Domain|Cell ID|Tracking" | tr -s ' \t\n' ' ')| CELL $(echo "$C" | grep -E "Tracking Area|Global Cell|EUTRA Absolute|Serving Cell ID" | head -4 | tr -s ' \t\n' ' ')| SIG $(echo "$S" | grep -E "RSRQ|RSRP|SNR" | tr -s ' \t\n' ' ')" >> $O/timeline.txt echo "$R" | grep -q "Registration state: 'registered'" && echo "$R" | grep -q "PS: 'attached'" && { REG=1; break; } [ $(awk "BEGIN{print ($(t)-$T0>600)}") = 1 ] && break sleep 2 done sleep 3 for c in --nas-get-serving-system --nas-get-system-info --nas-get-home-network --nas-get-signal-info --nas-get-rf-band-info \ --nas-get-cell-location-info --nas-get-system-selection-preference --dms-get-operating-mode; do echo "### $(t) $c"; timeout 30 $Q $c 2>&1; echo "### rc=$?"; done 2>&1 | mask > $O/qmi-final.txt pm >> $O/qmi-final.txt if [ $REG = 1 ]; then echo REGISTERED > $O/result.txt else echo NOT-REGISTERED > $O/result.txt # --- read-only AT diagnostics on wwan0at0 (MM not running yet) A=/dev/wwan0at0 at() { cat $A > /tmp/at.out 2>&1 & P=$!; sleep 0.3; printf '%s\r' "$1" > $A; sleep ${2:-2}; kill $P 2>/dev/null; wait $P 2>/dev/null echo ">>> $(t) $1"; tr -d '\r' < /tmp/at.out | grep -v '^$'; } { for c in "AT" "AT+CFUN?" "AT+COPS?" "AT+CREG?" "AT+CGREG?" "AT+CEREG=?" "AT+CEREG?" "AT+CEER" "AT+CGATT?" "AT+CGDCONT?" "AT+CSQ" "AT+CESQ"; do at "$c"; done N0=$(tr -d '\r' < /tmp/at.out >/dev/null; at "AT+CEREG?" | sed -n 's/^+CEREG: *\([0-9]\),.*/\1/p' | head -1) SUP=$(at "AT+CEREG=?" | sed -n 's/^+CEREG: *(\(.*\)).*/\1/p' | head -1) echo "--- CEREG original n='$N0' supported='$SUP'" for n in 5 4 3 2; do echo "$SUP" | grep -qE "(^|[^0-9])$n([^0-9]|$)|[0-9]-$n|-[$n-9]" && { NX=$n; break; }; done [ -z "$NX" ] && echo "$SUP" | grep -qE '0-5' && NX=5 if [ -n "$NX" ] && [ -n "$N0" ]; then echo "--- transient AT+CEREG=$NX"; at "AT+CEREG=$NX"; at "AT+CEREG?"; at "AT+CEER" echo "--- restore AT+CEREG=$N0"; at "AT+CEREG=$N0"; at "AT+CEREG?" else echo "--- CEREG extended mode not attempted (orig='$N0' sup='$SUP')"; fi } 2>&1 | mask > $O/at-diag.txt fi killall qmi-proxy 2>/dev/null; sleep 1 /bin/mm-up > $O/mm-up.txt 2>&1 sleep 10 { mmcli -L; mmcli -m 0; } 2>&1 | mask > $O/mmcli.txt fin $(cat $O/result.txt)