新增:FPGA 升级后热恢复射频链路

This commit is contained in:
2026-08-28 13:26:45 +08:00
parent 47b782e976
commit 33d8f4f428
7 changed files with 257 additions and 93 deletions
+88
View File
@@ -0,0 +1,88 @@
#!/bin/sh
# The upgrade shell is forked by the running app and inherits every app socket.
# Re-exec after closing inherited non-stdio descriptors so the old process can
# release its ports cleanly. Keep upgrade diagnostics on the debug serial port.
if [ "$SMOD_FD_CLEAN" != "1" ]; then
export SMOD_FD_CLEAN=1
exec /bin/sh -c '
i=3
while [ $i -lt 256 ]; do
eval "exec ${i}>&-" 2>/dev/null
i=$((i + 1))
done
exec /bin/sh "$1" </dev/null >/dev/ttymxc0 2>&1
' smod_fd_clean "$0"
fi
# Kernel and device-tree updates only take effect after an IMX reboot. Pure
# userspace packages keep the clock/RF hardware powered and restart only the
# application so RF can recover without a power cycle.
need_reboot=0
reboot_reason=""
if [ -f ./src/zImage ]; then
need_reboot=1
reboot_reason="kernel"
echo "kernel image found: reboot required"
fi
if [ -f ./src/imx6ull-S-gpmi-1024x600c7.dtb ]; then
need_reboot=1
if [ -n "$reboot_reason" ]; then
reboot_reason="$reboot_reason+device-tree"
else
reboot_reason="device-tree"
fi
echo "device-tree image found: reboot required"
fi
killall logrotateStart daemon_system 2>/dev/null
sh remove.sh
sh cp.sh
sync
sleep 2
if [ "$need_reboot" = "1" ]; then
echo "boot component updated ($reboot_reason), reboot IMX now"
reboot
exit 0
fi
# pthread_setname_np changes the app's /proc comm, so identify it by the exact
# executable path. Also match "(deleted)" after cp.sh replaces the running ELF.
find_app_pids()
{
for exe in /proc/[0-9]*/exe; do
target=`readlink "$exe" 2>/dev/null` || continue
case "$target" in
/aw/anywave/app/imx_atsc_app|/aw/anywave/app/imx_atsc_app\ \(deleted\))
echo "$exe" | sed 's#/proc/##;s#/exe##'
;;
esac
done
}
old_pids=`find_app_pids`
[ -n "$old_pids" ] && kill $old_pids 2>/dev/null
i=0
while [ -n "`find_app_pids`" ] && [ $i -lt 15 ]; do
sleep 1
i=$((i + 1))
done
old_pids=`find_app_pids`
[ -n "$old_pids" ] && kill -9 $old_pids 2>/dev/null
while [ -n "`find_app_pids`" ]; do sleep 1; done
# Remove stale logging pipelines only after the old application has exited.
killall loglog 2>/dev/null
# Start without the legacy argument 1 so the normal no-power-off RF recovery
# path rebuilds the TALISE handle and FPGA-side JESD link.
sleep 2
cd /aw/anywave/app && nohup sh -c './imx_atsc_app 2>&1 | /usr/sbin/loglog /var/module_log/ imx_atsc_app.log 1' </dev/null >/dev/ttymxc0 2>&1 &
# Restore the system watchdog/housekeeper and log rotation. BusyBox on this
# target has no setsid, and /usr/sbin is not in the default PATH.
sleep 2
nohup sh -c '/usr/sbin/daemon_system 2>&1 | /usr/sbin/loglog /var/module_log/ daemon_system.log 1' >/dev/null 2>&1 &
nohup sh -c '/usr/sbin/logrotateStart 2>&1 | /usr/sbin/loglog /var/module_log/ logrotateStart.log 0' >/dev/null 2>&1 &