9a221c6d69
With this commit and the previous "nbg6817: don't hardcode the rootfs location by using append-rootblock instead" applied, it is possible to boot- and sysupgrade from both dual-boot sets (the primary mmcblk0p4+mmcblk0p5 or the alternative mmcblk0p7+mmcblk0p8). However the sysupgrade support does not toggle between both dual-boot sets between firmware upgrades so far. The partition map of the eMMC used in the nbg6817 is: Found valid GPT with protective MBR; using GPT. Disk /dev/mmcblk0: 7471104 sectors, 3.6 GiB Logical sector size: 512 bytes Disk identifier (GUID): XXX Partition table holds up to 12 entries First usable sector is 34, last usable sector is 7471070 Partitions will be aligned on 2-sector boundaries Total free space is 1 sectors (512 bytes) Number Start (sector) End (sector) Size Code Name 1 34 8225 4.0 MiB FFFF rootfs_data 2 8226 16417 4.0 MiB FFFF romd 3 16418 18465 1024.0 KiB FFFF header 4 18466 26657 4.0 MiB FFFF kernel 5 26658 157729 64.0 MiB FFFF rootfs 6 157730 159777 1024.0 KiB FFFF header_1 7 159778 167969 4.0 MiB FFFF kernel_1 8 167970 299041 64.0 MiB FFFF rootfs_1 9 299042 823329 256.0 MiB FFFF bu1 10 823330 7471069 3.2 GiB FFFF bu2 rootfs_data is the ext4 formatted overlay of the OEM firmware, LEDE ignores it due to its (too) small size. romd/ bu1 are initialized with zeroes (0x00) and unused. bu2 is formatted with ext4 and used for streamboost and other optional functionality by the OEM firmware, it is reformatted during factory resets of the OEM firmware. header/ header_1 contains version information for the corresponding vendor firmwares installed to kernel/rootfs or kernel_1/ rootfs_1, the format hasn't been completely reverse engineered so far and remains left untouched by LEDE: V1.00(ABCS.2)C0: 00000000 00 00 a7 74 01 32 f0 00 56 31 2e 30 30 28 41 42 |...t.2..V1.00(AB| 00000010 43 53 2e 32 29 43 30 00 ff ff ff ff ff ff ff ff |CS.2)C0.........| 00000020 ff ff ff ff ff ff ff ff 00 00 d5 dc 4e 42 47 36 |............NBG6| 00000030 38 31 37 00 ff ff ff ff ff ff ff ff ff ff ff ff |817.............| 00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000060 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 22 a3 |..............".| 00000070 00 1c 70 00 ff ff ff ff ff ff ff ff ff ff ff ff |..p.............| 00000080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00100000 V1.00(ABCS.5)C0: 00000000 00 00 bf 94 01 46 d8 00 56 31 2e 30 30 28 41 42 |.....F..V1.00(AB| 00000010 43 53 2e 35 29 43 30 00 ff ff ff ff ff ff ff ff |CS.5)C0.........| 00000020 ff ff ff ff ff ff ff ff 00 00 d6 5a 4e 42 47 36 |...........ZNBG6| 00000030 38 31 37 00 ff ff ff ff ff ff ff ff ff ff ff ff |817.............| 00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000060 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 c0 2c |...............,| 00000070 00 1c 58 00 ff ff ff ff ff ff ff ff ff ff ff ff |..X.............| 00000080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00010000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00100000 Signed-off-by: Stefan Lippers-Hollmann <s.l-h@gmx.de>
98 lines
1.8 KiB
Bash
98 lines
1.8 KiB
Bash
#
|
|
# Copyright (C) 2016 lede-project.org
|
|
#
|
|
|
|
zyxel_get_rootfs() {
|
|
local rootfsdev
|
|
|
|
if read cmdline < /proc/cmdline; then
|
|
case "$cmdline" in
|
|
*root=*)
|
|
rootfsdev="${cmdline##*root=}"
|
|
rootfsdev="${rootfsdev%% *}"
|
|
;;
|
|
esac
|
|
|
|
echo "${rootfsdev}"
|
|
fi
|
|
}
|
|
|
|
zyxel_do_flash() {
|
|
local tar_file=$1
|
|
local board=$2
|
|
local kernel=$3
|
|
local rootfs=$4
|
|
|
|
# keep sure its unbound
|
|
losetup --detach-all || {
|
|
echo Failed to detach all loop devices. Skip this try.
|
|
reboot -f
|
|
}
|
|
|
|
echo "flashing kernel to /dev/${kernel}"
|
|
tar xf $tar_file sysupgrade-$board/kernel -O >/dev/$kernel
|
|
|
|
echo "flashing rootfs to ${rootfs}"
|
|
tar xf $tar_file sysupgrade-$board/root -O >"${rootfs}"
|
|
|
|
# a padded rootfs is needed for overlay fs creation
|
|
local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
|
|
[ $offset -lt 65536 ] && {
|
|
echo Wrong size for rootfs: $offset
|
|
sleep 10
|
|
reboot -f
|
|
}
|
|
|
|
# Mount loop for rootfs_data
|
|
losetup -o $offset /dev/loop0 "${rootfs}" || {
|
|
echo "Failed to mount looped rootfs_data."
|
|
sleep 10
|
|
reboot -f
|
|
}
|
|
|
|
echo "Format new rootfs_data at position ${offset}."
|
|
mkfs.ext4 -F -L rootfs_data /dev/loop0
|
|
mkdir /tmp/new_root
|
|
mount -t ext4 /dev/loop0 /tmp/new_root && {
|
|
echo "Saving config to rootfs_data at position ${offset}."
|
|
cp -v /tmp/sysupgrade.tgz /tmp/new_root/
|
|
umount /tmp/new_root
|
|
}
|
|
|
|
# Cleanup
|
|
losetup -d /dev/loop0 >/dev/null 2>&1
|
|
sync
|
|
umount -a
|
|
reboot -f
|
|
}
|
|
|
|
zyxel_do_upgrade() {
|
|
local tar_file="$1"
|
|
local board=$(board_name)
|
|
local rootfs="$(zyxel_get_rootfs)"
|
|
local kernel=
|
|
|
|
[ -b "${rootfs}" ] || return 1
|
|
case "$board" in
|
|
nbg6817)
|
|
case "$rootfs" in
|
|
"/dev/mmcblk0p5")
|
|
kernel=mmcblk0p4
|
|
;;
|
|
"/dev/mmcblk0p8")
|
|
kernel=mmcblk0p7
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
zyxel_do_flash $tar_file $board $kernel $rootfs
|
|
|
|
return 0
|
|
}
|