diff options
author | Tomasz Maciej Nowak <tomek_n@o2.pl> | 2019-04-01 19:25:38 +0200 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2019-04-06 14:48:46 +0200 |
commit | 42f96ed9413a3483b0448581374feeb3343f6f6a (patch) | |
tree | 64dcc9c3a418ecec29a6654d75746574e4c0902a /target/linux/tegra/base-files/lib | |
parent | de3eb0d8a060b1eb4e4027ebc435bb412ce8e096 (diff) | |
download | upstream-42f96ed9413a3483b0448581374feeb3343f6f6a.tar.gz upstream-42f96ed9413a3483b0448581374feeb3343f6f6a.tar.bz2 upstream-42f96ed9413a3483b0448581374feeb3343f6f6a.zip |
tegra: add new target
New target introduces initial support for NVIDIA Tegra SoC based devices.
It focuses on Tegra 2 CPUs, for successors supporting NEON instruction
set the target should be split in two subtargets.
This initial commit doesn't create any device image, it's groundwork
for further additions.
Signed-off-by: Tomasz Maciej Nowak <tomek_n@o2.pl>
Diffstat (limited to 'target/linux/tegra/base-files/lib')
-rw-r--r-- | target/linux/tegra/base-files/lib/preinit/79_move_config | 22 | ||||
-rw-r--r-- | target/linux/tegra/base-files/lib/upgrade/platform.sh | 103 |
2 files changed, 125 insertions, 0 deletions
diff --git a/target/linux/tegra/base-files/lib/preinit/79_move_config b/target/linux/tegra/base-files/lib/preinit/79_move_config new file mode 100644 index 0000000000..2a451a5efd --- /dev/null +++ b/target/linux/tegra/base-files/lib/preinit/79_move_config @@ -0,0 +1,22 @@ +#!/bin/sh + +move_config() { + local partdev + + . /lib/upgrade/common.sh + + if export_bootdevice && export_partdevice partdev 1; then + mkdir -p /boot + if mount -o ro,noatime "/dev/$partdev" /boot; then + if [ -f /boot/sysupgrade.tgz ]; then + mount /boot -o remount,rw,noatime + mv -f /boot/sysupgrade.tgz / + fi + umount /boot + rm -fR /boot + fi + fi +} + +boot_hook_add preinit_mount_root move_config + diff --git a/target/linux/tegra/base-files/lib/upgrade/platform.sh b/target/linux/tegra/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000000..be453bdf9f --- /dev/null +++ b/target/linux/tegra/base-files/lib/upgrade/platform.sh @@ -0,0 +1,103 @@ +REQUIRE_IMAGE_METADATA=1 + +get_magic_at() { + local pos="$2" + get_image "$1" | dd bs=1 count=2 skip="$pos" 2>/dev/null | hexdump -v -n 2 -e '1/1 "%02x"' +} + +platform_check_image() { + local diskdev partdev diff + + [ "$#" -gt 1 ] && return 1 + + case "$(get_magic_at "$1" 510)" in + 55aa) ;; + *) + echo "Failed to verify MBR boot signature." + return 1 + ;; + esac + + export_bootdevice && export_partdevice diskdev 0 || { + echo "Unable to determine upgrade device" + return 1 + } + + get_partitions "/dev/$diskdev" bootdisk + + #extract the boot sector from the image + get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null + + 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_copy_config() { + local partdev + + if export_partdevice partdev 1; then + mount -o rw,noatime "/dev/$partdev" /mnt + cp -af "$CONF_TAR" /mnt/ + umount /mnt + fi +} + +platform_do_upgrade() { + local diskdev partdev diff + + export_bootdevice && export_partdevice diskdev 0 || { + echo "Unable to determine upgrade device" + return 1 + } + + sync + + if [ "$SAVE_PARTITIONS" = "1" ]; then + get_partitions "/dev/$diskdev" bootdisk + + #extract the boot sector from the image + get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b + + 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 + get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync + + # 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 + + #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..." + get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync + else + echo "Unable to find partition $part device, skipped." + fi + done < /tmp/partmap.image + + #copy partition uuid + echo "Writing new UUID to /dev/$diskdev..." + get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync +} |