#!/bin/sh
loggerName=2-after-Upload.sh
MNTDIR=/mnt/rfs
UPDATEDIR=/mnt/data/fw
AktCompList=/boot/UpdateCompList.txt
NeuCompList=$MNTDIR/boot/UpdateCompList.txt
ubidev=ubi3
rfs1ubimtd="ubi.mtd=5"
rfs2ubimtd="ubi.mtd=6"
rfs1ubi=5
rfs2ubi=6
rfs1mtd=mtd5
rfs2mtd=mtd6
kernel1mtd=mtd3
kernel2mtd=mtd4
CompNxLt=NxLtFw.bin
CompMlo=MLO.nand
CompUboot=u-boot.bin
CompKernel=uImage
NxLtFwImage=$MNTDIR/boot/$CompNxLt
RemoveImage="rm /mnt/data/fw/rootfs.ubi"
UpdateKernel="no"
SetError="dbus-send --system --print-reply --dest=com.rexroth.akku.SysService /SysObj com.rexroth.akku.SysInterface.freporterror string:"dummy" string:"3243" string:"""
RdyFlagSet="dbus-send --system --print-reply --dest=com.rexroth.akku.SysService /SysObj com.rexroth.akku.SysInterface.frdyflagset int32:7"
RdyFlagResetSet="dbus-send --system --print-reply --dest=com.rexroth.akku.SysService /SysObj com.rexroth.akku.SysInterface.frdyflagreset int32:7"
PopUpDelete="dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fclosepopupString"
f_exit(){
$RdyFlagSet
$PopUpDelete
$SetError
$RemoveImage
exit 1
}
# Update Image vorhanden am vereinbarten Platz vorhanden ?
##################################################################################################################
ls -al $UPDATEDIR/rootfs.ubi &> /dev/null
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: Update Image <$UPDATEDIR> nicht vorhanden"
f_exit
fi
# Neighbor Updates
##################################################################################################################
ls -al /etc/fwupdate/neighbor_list &> /dev/null
if [ $? -eq 0 ]; then
limit=`cat /etc/fwupdate/neighbor_list | grep count | awk '{print $2}'`
/usr/bin/logger -s -t $loggerName "Info: Anzahl Nachbar Nexos <$limit>"
var0=1
while [ "$var0" -le "$limit" ]
do
addr=`cat /etc/fwupdate/neighbor_list | grep $var0: | awk '{print $2}'`
/etc/fwupdate/neighbor_update.sh $addr
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: Update FAILED Nexo <$addr>"
else
/usr/bin/logger -s -t $loggerName "Info: Update SUCCESS Nexo <$addr>"
fi
var0=`expr $var0 + 1`
done
fi
# ermitteln der aktiven Partition und die zum Update
###################################################################################################################
ActiveMtd=`cat /proc/cmdline | awk '{print $3}'`
/usr/bin/logger -s -t $loggerName "aktive Partion <$ActiveMtd>"
if [ $ActiveMtd = $rfs1ubimtd ]; then
UpdateMtd=$rfs2mtd
UpdateUbi=$rfs2ubi
kernelUpdateMtd=$kernel2mtd
else
if [ $ActiveMtd = $rfs2ubimtd ]; then
UpdateMtd=$rfs1mtd
UpdateUbi=$rfs1ubi
kernelUpdateMtd=$kernel1mtd
else
/usr/bin/logger -s -t $loggerName "Error: keine gültige mtd Partition gefunden <$ActiveMtd>"
f_exit
fi
fi
/usr/bin/logger -s -t $loggerName "Info; UpdateMtd <$UpdateMtd>, UpdateUbi <$UpdateUbi>, kernelUpdateMtd <$kernelUpdateMtd>"
# ermittle Kernel Version in der Partition die upgedatet werden soll um sie nachher mit neuem Image zu vergleichen
###########################################################################################################################################
mkdir $MNTDIR
/usr/bin/ubiattach /dev/ubi_ctrl -m $UpdateUbi -d 3 &> /dev/null
mount -o sync -t ubifs $ubidev:rootfs $MNTDIR
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Warning: Kernelversion der nicht aktiven Partiton <$UpdateMtd> lesen. Mount schlaegt fehl -> kernel update=yes"
UpdateKernel="yes"
else
# lese Kernel Version aus
KernelVersionAkt=`cat $NeuCompList | grep $CompKernel | awk '{print $2}'`
fi
umount $MNTDIR
/usr/bin/ubidetach /dev/ubi_ctrl -m $UpdateUbi
# nicht aktive mtd Partiton löschen und mit neuem Image beschreiben
##########################################################################################################################
dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fpopupString string:'FW Update' string:'Flashing
NxFw-Image' int32:2 int32:0
# Partition löschen
#/usr/sbin/flash_erase /dev/$UpdateMtd 0 0
#if [ "$?" -ne "0" ]; then
# /usr/bin/logger -s -t $loggerName "Error: loeschen der Update-Partition <$UpdateMtd>"
# f_exit
#else
# /usr/bin/logger -s -t $loggerName "Info: Update-Partition <$UpdateMtd> geloescht OK"
#fi
# Flashen der Partition mit neuem Image
/usr/bin/ubiformat /dev/$UpdateMtd -f $UPDATEDIR/rootfs.ubi -y
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: Flashen der Update-Partition <$UpdateMtd>"
f_exit
else
logger -s -t $loggerName "Info: Flashen der Update-Partition <$UpdateMtd> OK"
fi
sync
sync
sync
echo 3 > /proc/sys/vm/drop_caches
# Neu geflashtes Image mounten
#################################################################################################################################
/usr/bin/ubiattach /dev/ubi_ctrl -m $UpdateUbi -d 3 &> /dev/null
mount -o sync -t ubifs $ubidev:rootfs $MNTDIR
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Warning: Volume <$UpdateMtd> rootfs noch nicht angelegt"
/usr/bin/ubimkvol /dev/$ubidev -N rootfs -m
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: Volume kann nicht angelegt werden"
f_exit
else
/usr/bin/logger -s -t $loggerName "Info: Volume angelegt"
fi
mount -o sync -t ubifs $ubidev:rootfs $MNTDIR
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: Mount der Update-Partition <$UpdateMtd>"
f_exit
fi
fi
##################################################################################################################################
# Komponenten (MLO / u-boot / Kernel / NxLt) zum Update checken
##################################################################################################################################
# MLO (Update nur vom u-boot aus möglich
###################################################################################################################################
mloVersionNeu=`cat $NeuCompList | grep $CompMlo | awk '{print $2}'`
mloVersionAkt=`cat $AktCompList | grep $CompMlo | awk '{print $2}'`
if [ "$mloVersionNeu" != "$mloVersionAkt" ]; then
/usr/bin/logger -s -t $loggerName "Info: $CompMlo Update erforderlich - Neue Version <$mloVersionNeu> Aktuelle Version <$mloVersionAkt>"
cp $MNTDIR/boot/$CompMlo $UPDATEDIR/$CompMlo
else
/usr/bin/logger -s -t $loggerName "Info: Update MLO nicht notwendig - Neue Version <$mloVersionNeu> Aktuelle Version <$mloVersionAkt>"
fi
# u-boot
####################################################################################################################################
ubootVersionNeu=`cat $NeuCompList | grep $CompUboot | awk '{print $2}'`
ubootVersionAkt=`cat $AktCompList | grep $CompUboot | awk '{print $2}'`
if [ "$ubootVersionNeu" != "$ubootVersionAkt" ]; then
dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fpopupString string:'FW Update' string:'Flashing
Bootloader' int32:2 int32:0
/usr/bin/logger -s -t $loggerName "Info: Update u-boot neue Version <$ubootVersionNeu> aktuelle Version <$ubootVersionAkt>"
/usr/sbin/flash_eraseall /dev/mtd1
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update u-boot: flash_eraseall /dev/mtd1"
f_exit
fi
/usr/sbin/nandwrite -p /dev/mtd1 /$MNTDIR/boot/$CompUboot
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update u-boot: nandwrite -p /dev/mtd1 /$MNTDIR/boot/$CompUboot"
f_exit
fi
/usr/bin/logger -s -t $loggerName "Info: Update u-boot OK"
else
/usr/bin/logger -s -t $loggerName "Info: Kein Update U-boot - Neue Version <$ubootVersionNeu> aktuelle Version <$ubootVersionAkt>"
fi
# kernel
##########################################################################################################################################
if [ $UpdateKernel = "yes" ]; then
# hat sich schon oben entschieden, da die aktuelle Version nicht auslesbar war!
dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fpopupString string:'FW Update' string:'Flashing
Kernel' int32:2 int32:0
/usr/bin/logger -s -t $loggerName "Info: Update Kernel Partition <$kernelUpdateMtd>"
/usr/sbin/flash_eraseall /dev/$kernelUpdateMtd
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update Kernel flash_eraseall /dev/$kernelUpdateMtd"
f_exit
fi
/usr/sbin/nandwrite -p /dev/$kernelUpdateMtd /$MNTDIR/boot/$CompKernel
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update u-boot: nandwrite -p /dev/$kernelUpdateMtd /$MNTDIR/boot/$CompKernel"
f_exit
fi
/usr/bin/logger -s -t $loggerName "Info: Update Kernel Partition <$kernelUpdateMtd> OK"
else
kernelVersionNeu=`cat $NeuCompList | grep $CompKernel | awk '{print $2}'`
if [ "$kernelVersionNeu" != "$KernelVersionAkt" ]; then
$PopUpFlashKernel
/usr/bin/logger -s -t $loggerName "Info: Update Kernel Partition <$kernelUpdateMtd> Neue Version <$kernelVersionNeu> Aktuelle Version <$KernelVersionAkt>"
/usr/sbin/flash_eraseall /dev/$kernelUpdateMtd
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update Kernel flash_eraseall /dev/$kernelUpdateMtd"
f_exit
fi
/usr/sbin/nandwrite -p /dev/$kernelUpdateMtd /$MNTDIR/boot/$CompKernel
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error:Update Kernel nandwrite -p /dev/$kernelUpdateMtd /$MNTDIR/boot/$CompKernel"
f_exit
fi
/usr/bin/logger -s -t $loggerName "Info: Update Kernel Partition <$kernelUpdateMtd> OK"
else
/usr/bin/logger -s -t $loggerName "Info: Kein Update Kernel - Neue Version <$kernelVersionNeu> Aktuelle Version <$KernelVersionAkt>"
fi
fi
# NxLt (Leistungsteil)
##########################################################################################################################################
#NxLtVersionNeu=`cat $NeuCompList | grep NxLtFw.bin | awk '{print $2}'`
#NxLtVersionAkt=`cat $AktCompList | grep NxLtFw.bin | awk '{print $2}'`
#if [ "$NxLtVersionNeu" != "$NxLtVersionAkt" ]; then
# dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fpopupString string:'FW Update' string:'Flashing
NxLt-Image' int32:2 int32:0
# /home/tool/bin/LtUpdate.elf $NxLtFwImage
# if [ "$?" -ne "0" ]; then
# /usr/bin/logger -s -t $loggerName "Error: NxLt Update"
# f_exit
# else
# /usr/bin/logger -s -t $loggerName "Info: NxLt Update - Firmware geflasht"
# sleep 3
# fi
#else
# /usr/bin/logger -s -t $loggerName "Info: Kein Update NxLt - neue Version <$NxLtVersionNeu> aktuelle Version <$NxLtVersionAkt>"
#fi
# geflashtes Image wieder aushängen
##########################################################################################################################################
umount $MNTDIR
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: umount <$MNTDIR>"
f_exit
fi
/usr/bin/ubidetach /dev/ubi_ctrl -m $UpdateUbi
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: ubidettach <$UpdateUbi>"
f_exit
fi
# Boot Parameter aktualisieren
###########################################################################################################################################
if [ $ActiveMtd = $rfs1ubimtd ]; then
/usr/bin/logger -s -t $loggerName "Info: rootfs1 ist aktiv -> aktiviere rootfs2"
/usr/sbin/fw_setenv activpart 2
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: setenv activpart 2"
f_exit
fi
# prüfen
/usr/sbin/fw_printenv | grep -w activpart=2
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: u-boot parameter (activpart=2) nicht uebernommen"
/usr/sbin/fw_setenv activpart 2
fi
/usr/sbin/fw_setenv switch 1
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: setenv switch 1"
f_exit
fi
# prüfen
/usr/sbin/fw_printenv | grep -w switch=1
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: u-boot parameter (switch=1) nicht uebernommen"
/usr/sbin/fw_setenv switch 1
fi
fi
if [ $ActiveMtd = $rfs2ubimtd ]; then
/usr/bin/logger -s -t $loggerName "Info: rootfs2 ist aktiv -> aktiviere rootfs1"
/usr/sbin/fw_setenv activpart 1
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: setenv activpart 1"
f_exit
fi
# prüfen
/usr/sbin/fw_printenv | grep -w activpart=1
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: u-boot parameter (activpart=1) nicht uebernommen"
/usr/sbin/fw_setenv activpart 1
fi
/usr/sbin/fw_setenv switch 1
if [ "$?" -ne "0" ]; then
/usr/bin/logger -s -t $loggerName "Error: setenv switch 1"
f_exit
fi
# prüfen
/usr/sbin/fw_printenv | grep -w switch=1
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "Error: u-boot parameter (switch=0) nicht uebernommen"
/usr/sbin/fw_setenv switch 1
fi
fi
# Console auf dev->null umleiten
/usr/sbin/fw_printenv | grep -w console=/dev/null
if [ "$?" -ne "0" ]; then
logger -s -t $loggerName "console auf /dev/null geleitet"
/usr/sbin/fw_setenv console /dev/null
fi
# Boot Parameter loggen
/usr/sbin/fw_printenv > /var/log/u-boot-para.log
# Merker der aktuellen Version
Version=`cat /etc/version`
echo $Version > /mnt/data/lastFwVersion
# dbus-send --system --print-reply --dest=com.rexroth.akku.GUIService /GUI com.rexroth.akku.gui.fpopupString string:'FW Update' string:'Reboot System..' int32:2 int32:0
# Zum Schluß nochmal sync weils Spass macht und hilft
###############################################################################################################################
sync
echo 3 > /proc/sys/vm/drop_caches
# Alles soweit gut -> reboot
################################################################################################################################
/usr/bin/logger -s -t $loggerName "FIRMWARE UPDATE -> NEUSTART DES SYSTEMS"
sleep 1
# Nicht auf reboot warten, gleich weiter (& = Hintegrund)
/etc/reboot/reboot.sh &
exit 0
################################################################################################################################