mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 06:57:57 +00:00
6180005deb
So far, kernel has not been written correctly to SD card during
sysupgrade, as both target path and offset were wrong.
This patch fixes it, and adds some descriptive output on the way.
Fixes: 0841b68c91
("layerscape: support sysupgrade for SD card ext4
rootfs")
Reviewed-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
[alter/extend commit message]
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
186 lines
4.5 KiB
Bash
186 lines
4.5 KiB
Bash
#
|
|
# Copyright 2015-2019 Traverse Technologies
|
|
# Copyright 2020 NXP
|
|
#
|
|
|
|
RAMFS_COPY_BIN="/usr/sbin/fw_printenv /usr/sbin/fw_setenv /usr/sbin/ubinfo /bin/echo"
|
|
RAMFS_COPY_DATA="/etc/fw_env.config /var/lock/fw_printenv.lock"
|
|
|
|
REQUIRE_IMAGE_METADATA=1
|
|
|
|
platform_check_image_sdboot() {
|
|
local diskdev partdev diff
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
echo "Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
# get partitions table from boot device
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
# get partitions table from sysupgrade.bin
|
|
dd if="$1" of=/tmp/image.bs bs=512b count=1 > /dev/null 2>&1
|
|
sync
|
|
get_partitions /tmp/image.bs image
|
|
|
|
# compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
|
|
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
|
|
|
|
if [ -n "$diff" ]; then
|
|
echo "Partition layout has changed. Full image will be written."
|
|
ask_bool 0 "Abort" && exit 1
|
|
return 0
|
|
fi
|
|
}
|
|
platform_do_upgrade_sdboot() {
|
|
local diskdev partdev diff
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
echo "Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
|
|
# get partitions table from boot device
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
# get partitions table from sysupgrade.bin
|
|
dd if="$1" of=/tmp/image.bs bs=512b count=1 > /dev/null 2>&1
|
|
sync
|
|
get_partitions /tmp/image.bs image
|
|
|
|
# compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
else
|
|
diff=1
|
|
fi
|
|
|
|
if [ -n "$diff" ]; then
|
|
dd if="$1" of="/dev/$diskdev" bs=1024 count=4 > /dev/null 2>&1
|
|
echo "Writing image to /dev/$diskdev..."
|
|
dd if="$1" of="/dev/$diskdev" bs=1024 skip=16384 seek=16384 > /dev/null 2>&1
|
|
sync
|
|
|
|
# Separate removal and addtion is necessary; otherwise, partition 1
|
|
# will be missing if it overlaps with the old partition 2
|
|
partx -d - "/dev/$diskdev"
|
|
partx -a - "/dev/$diskdev"
|
|
|
|
return 0
|
|
fi
|
|
|
|
# write kernel image
|
|
echo "Writing kernel to /dev/$diskdev..."
|
|
dd if="$1" of="/dev/$diskdev" bs=1024 skip=16384 seek=16384 count=16384 > /dev/null 2>&1
|
|
sync
|
|
|
|
# iterate over each partition from the image and write it to the boot disk
|
|
while read part start size; do
|
|
if export_partdevice partdev $part; then
|
|
echo "Writing image to /dev/$partdev..."
|
|
dd if="$1" of="/dev/$partdev" bs=512 skip="$start" count="$size" > /dev/null 2>&1
|
|
sync
|
|
else
|
|
echo "Unable to find partition $part device, skipped."
|
|
fi
|
|
done < /tmp/partmap.image
|
|
|
|
}
|
|
platform_do_upgrade_traverse_nandubi() {
|
|
bootsys=$(fw_printenv bootsys | awk -F= '{{print $2}}')
|
|
newbootsys=2
|
|
if [ "$bootsys" -eq "2" ]; then
|
|
newbootsys=1
|
|
fi
|
|
|
|
# If nand_do_upgrade succeeds, we don't have an opportunity to add any actions of
|
|
# our own, so do it here and set back on failure
|
|
echo "Setting bootsys to #${newbootsys}"
|
|
fw_setenv bootsys $newbootsys
|
|
CI_UBIPART="nandubi"
|
|
CI_KERNPART="kernel${newbootsys}"
|
|
CI_ROOTPART="rootfs${newbootsys}"
|
|
nand_do_upgrade "$1" || (echo "Upgrade failed, setting bootsys ${bootsys}" && fw_setenv bootsys $bootsys)
|
|
|
|
}
|
|
platform_copy_config() {
|
|
local partdev parttype=ext4
|
|
|
|
if export_partdevice partdev 1; then
|
|
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
|
|
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
|
|
umount /mnt
|
|
fi
|
|
}
|
|
platform_check_image() {
|
|
local board=$(board_name)
|
|
|
|
case "$board" in
|
|
traverse,ls1043v | \
|
|
traverse,ls1043s)
|
|
nand_do_platform_check "traverse-ls1043" $1
|
|
return $?
|
|
;;
|
|
fsl,ls1012a-frdm | \
|
|
fsl,ls1012a-rdb | \
|
|
fsl,ls1021a-twr | \
|
|
fsl,ls1043a-rdb | \
|
|
fsl,ls1046a-rdb | \
|
|
fsl,ls1088a-rdb | \
|
|
fsl,ls2088a-rdb)
|
|
return 0
|
|
;;
|
|
fsl,ls1012a-frwy-sdboot | \
|
|
fsl,ls1021a-twr-sdboot | \
|
|
fsl,ls1043a-rdb-sdboot | \
|
|
fsl,ls1046a-rdb-sdboot | \
|
|
fsl,ls1088a-rdb-sdboot)
|
|
platform_check_image_sdboot "$1"
|
|
return 0
|
|
;;
|
|
*)
|
|
echo "Sysupgrade is not currently supported on $board"
|
|
;;
|
|
esac
|
|
|
|
return 1
|
|
}
|
|
platform_do_upgrade() {
|
|
local board=$(board_name)
|
|
|
|
# Force the creation of fw_printenv.lock
|
|
mkdir -p /var/lock
|
|
touch /var/lock/fw_printenv.lock
|
|
|
|
case "$board" in
|
|
traverse,ls1043v | \
|
|
traverse,ls1043s)
|
|
platform_do_upgrade_traverse_nandubi "$1"
|
|
;;
|
|
fsl,ls1012a-frdm | \
|
|
fsl,ls1012a-rdb | \
|
|
fsl,ls1021a-twr | \
|
|
fsl,ls1043a-rdb | \
|
|
fsl,ls1046a-rdb | \
|
|
fsl,ls1088a-rdb | \
|
|
fsl,ls2088a-rdb)
|
|
PART_NAME=firmware
|
|
default_do_upgrade "$1"
|
|
;;
|
|
fsl,ls1012a-frwy-sdboot | \
|
|
fsl,ls1021a-twr-sdboot | \
|
|
fsl,ls1043a-rdb-sdboot | \
|
|
fsl,ls1046a-rdb-sdboot | \
|
|
fsl,ls1088a-rdb-sdboot)
|
|
platform_do_upgrade_sdboot "$1"
|
|
return 0
|
|
;;
|
|
*)
|
|
echo "Sysupgrade is not currently supported on $board"
|
|
;;
|
|
esac
|
|
}
|