diff options
-rw-r--r-- | package/base-files/Makefile | 9 | ||||
-rw-r--r-- | package/base-files/files/lib/upgrade/sdcard.sh | 91 | ||||
-rwxr-xr-x | scripts/target-metadata.pl | 1 | ||||
-rw-r--r-- | target/Config.in | 3 |
4 files changed, 104 insertions, 0 deletions
diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 5f816a0d1b..f19b07cfe1 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -23,6 +23,7 @@ PKG_LICENSE:=GPL-2.0 PKG_CONFIG_DEPENDS += \ CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \ CONFIG_NAND_SUPPORT \ + CONFIG_SDCARD_SUPPORT \ CONFIG_CLEAN_IPKG \ CONFIG_PER_FEED_REPO \ $(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed)) @@ -123,10 +124,18 @@ ifeq ($(CONFIG_NAND_SUPPORT),) endef endif +ifeq ($(CONFIG_SDCARD_SUPPORT),) + define Package/base-files/sdcard-support + rm -f $(1)/lib/upgrade/sdcard.sh + endef +endif + + define Package/base-files/install $(CP) ./files/* $(1)/ $(Package/base-files/install-key) $(Package/base-files/nand-support) + $(Package/base-files/sdcard-support) if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \ $(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \ fi diff --git a/package/base-files/files/lib/upgrade/sdcard.sh b/package/base-files/files/lib/upgrade/sdcard.sh new file mode 100644 index 0000000000..2052805acb --- /dev/null +++ b/package/base-files/files/lib/upgrade/sdcard.sh @@ -0,0 +1,91 @@ +sdcard_check_image() { + local file="$1" + local diskdev partdev diff + + export_bootdevice && export_partdevice diskdev 0 || { + v "Unable to determine upgrade device" + return 1 + } + + get_partitions "/dev/$diskdev" bootdisk + + v "Extract boot sector from the image" + get_image_dd "$1" 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)" + + rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image + + if [ -n "$diff" ]; then + v "Partition layout has changed. Full image will be written." + ask_bool 0 "Abort" && exit 1 + return 0 + fi +} + +sdcard_do_upgrade() { + local board=$(board_name) + local diskdev partdev diff + + export_bootdevice && export_partdevice diskdev 0 || { + v "Unable to determine upgrade device" + return 1 + } + + sync + + if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then + get_partitions "/dev/$diskdev" bootdisk + + v "Extract boot sector from the image" + get_image_dd "$1" 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 "$1" 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" + else + v "Writing bootloader to /dev/$diskdev" + get_image_dd "$1" of="$diskdev" bs=512 skip=1 seek=1 count=2048 conv=fsync + #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 + v "Writing image to /dev/$partdev..." + get_image_dd "$1" of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync + else + v "Unable to find partition $part device, skipped." + fi + done < /tmp/partmap.image + + v "Writing new UUID to /dev/$diskdev..." + get_image_dd "$1" of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync + fi + + sleep 1 +} + +sdcard_copy_config() { + local partdev + + if export_partdevice partdev 1; then + mkdir -p /boot + [ -f /boot/kernel.img ] || mount -o rw,noatime /dev/$partdev /boot + cp -af "$UPGRADE_BACKUP" "/boot/$BACKUP_FILE" + sync + umount /boot + fi +} diff --git a/scripts/target-metadata.pl b/scripts/target-metadata.pl index dff24998cd..34fb32a07e 100755 --- a/scripts/target-metadata.pl +++ b/scripts/target-metadata.pl @@ -36,6 +36,7 @@ sub target_config_features(@) { /^rfkill$/ and $ret .= "\tselect RFKILL_SUPPORT\n"; /^rootfs-part$/ and $ret .= "\tselect USES_ROOTFS_PART\n"; /^rtc$/ and $ret .= "\tselect RTC_SUPPORT\n"; + /^sdcard$/ and $ret .= "\tselect SDCARD_SUPPORT\n"; /^separate_ramdisk$/ and $ret .= "\tselect USES_INITRAMFS\n\tselect USES_SEPARATE_INITRAMFS\n"; /^small_flash$/ and $ret .= "\tselect SMALL_FLASH\n"; /^spe_fpu$/ and $ret .= "\tselect HAS_SPE_FPU\n"; diff --git a/target/Config.in b/target/Config.in index 51a278cae9..fde7ea4137 100644 --- a/target/Config.in +++ b/target/Config.in @@ -101,6 +101,9 @@ config RFKILL_SUPPORT config NAND_SUPPORT bool +config SDCARD_SUPPORT + bool + config ARCH_64BIT bool |