From 7c89acbebf38d7ce0989158d32e6ee7f466ad641 Mon Sep 17 00:00:00 2001 From: Enrico Mioso Date: Wed, 1 Dec 2021 16:17:55 +0100 Subject: [PATCH] base-files: add eMMC sysupgrade support Adds generic support for sysupgrading on eMMC-based devices. Provide function emmc_do_upgrade and emmc_copy_config to be used in /lib/upgrade/platform.sh instead of redundantly implementing the same logic over and over again. Similar to generic sysupgrade on NAND, use environment variables CI_KERNPART, CI_ROOTPART and newly introduce CI_DATAPART to indicate GPT partition names to be used. On devices with more than one MMC block device, CI_ROOTDEV can be used to specify the MMC device for partition name lookups. Also allow to select block devices directly using EMMC_KERN_DEV, EMMC_ROOT_DEV and EMMC_DATA_DEV, as using GPT partition names is not always an option (e.g. when forced to use MBR). To easily handle writing kernel and rootfs make use of sysupgrade.tar format convention which is also already used for generic NAND support. Signed-off-by: Enrico Mioso Signed-off-by: Daniel Golle CC: Li Zhang CC: TruongSinh Tran-Nguyen (cherry picked from commit 57c1f3f9c5c699cc215bebde772552787c632570) --- package/base-files/Makefile | 9 +++ package/base-files/files/lib/upgrade/emmc.sh | 64 ++++++++++++++++++++ scripts/target-metadata.pl | 1 + target/Config.in | 3 + 4 files changed, 77 insertions(+) create mode 100644 package/base-files/files/lib/upgrade/emmc.sh diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 8a1ddf96f5..6e64c8c817 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_EMMC_SUPPORT \ CONFIG_CLEAN_IPKG \ CONFIG_PER_FEED_REPO \ $(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed)) @@ -124,10 +125,18 @@ ifeq ($(CONFIG_NAND_SUPPORT),) endef endif +ifeq ($(CONFIG_EMMC_SUPPORT),) + define Package/base-files/emmc-support + rm -f $(1)/lib/upgrade/emmc.sh + endef +endif + + define Package/base-files/install $(CP) ./files/* $(1)/ $(Package/base-files/install-key) $(Package/base-files/nand-support) + $(Package/base-files/emmc-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/emmc.sh b/package/base-files/files/lib/upgrade/emmc.sh new file mode 100644 index 0000000000..15fa370cd9 --- /dev/null +++ b/package/base-files/files/lib/upgrade/emmc.sh @@ -0,0 +1,64 @@ +# Copyright (C) 2021 OpenWrt.org +# + +. /lib/functions.sh + +emmc_upgrade_tar() { + local tar_file="$1" + [ "$CI_KERNPART" -a -z "$EMMC_KERN_DEV" ] && export EMMC_KERN_DEV="$(find_mmc_part $CI_KERNPART $CI_ROOTDEV)" + [ "$CI_ROOTPART" -a -z "$EMMC_ROOT_DEV" ] && export EMMC_ROOT_DEV="$(find_mmc_part $CI_ROOTPART $CI_ROOTDEV)" + [ "$CI_DATAPART" -a -z "$EMMC_DATA_DEV" ] && export EMMC_DATA_DEV="$(find_mmc_part $CI_DATAPART $CI_ROOTDEV)" + local has_kernel + local has_rootfs + local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + + tar tf "$tar_file" ${board_dir}/kernel 1>/dev/null 2>/dev/null && has_kernel=1 + tar tf "$tar_file" ${board_dir}/root 1>/dev/null 2>/dev/null && has_rootfs=1 + + [ "$has_kernel" = 1 -a "$EMMC_KERN_DEV" ] && + export EMMC_KERNEL_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/kernel -O | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + [ "$has_rootfs" = 1 -a "$EMMC_ROOT_DEV" ] && + export EMMC_ROOTFS_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/root -O | dd of="$EMMC_ROOT_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + if [ -z "$UPGRADE_BACKUP" ]; then + if [ "$EMMC_DATA_DEV" ]; then + dd if=/dev/zero of="$EMMC_DATA_DEV" bs=512 count=8 + elif [ "$EMMC_ROOTFS_BLOCKS" ]; then + dd if=/dev/zero of="$EMMC_ROOT_DEV" bs=512 seek=$EMMC_ROOTFS_BLOCKS count=8 + elif [ "$EMMC_KERNEL_BLOCKS" ]; then + dd if=/dev/zero of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS count=8 + fi + fi +} + +emmc_upgrade_fit() { + local fit_file="$1" + [ "$CI_KERNPART" -a -z "$EMMC_KERN_DEV" ] && export EMMC_KERN_DEV="$(find_mmc_part $CI_KERNPART $CI_ROOTDEV)" + + if [ "$EMMC_KERN_DEV" ]; then + export EMMC_KERNEL_BLOCKS=$(($(get_image "$fit_file" | fwtool -i /dev/null -T - | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + [ -z "$UPGRADE_BACKUP" ] && dd if=/dev/zero of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS count=8 + fi +} + +emmc_copy_config() { + if [ "$EMMC_DATA_DEV" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_DATA_DEV" bs=512 + elif [ "$EMMC_ROOTFS_BLOCKS" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_ROOT_DEV" bs=512 seek=$EMMC_ROOTFS_BLOCKS + elif [ "$EMMC_KERNEL_BLOCKS" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS + fi +} + +emmc_do_upgrade() { + local file_type=$(identify $1) + + case "$file_type" in + "fit") emmc_upgrade_fit $1;; + *) emmc_upgrade_tar $1;; + esac +} diff --git a/scripts/target-metadata.pl b/scripts/target-metadata.pl index d4d4325816..95311f53e5 100755 --- a/scripts/target-metadata.pl +++ b/scripts/target-metadata.pl @@ -14,6 +14,7 @@ sub target_config_features(@) { /^audio$/ and $ret .= "\tselect AUDIO_SUPPORT\n"; /^display$/ and $ret .= "\tselect DISPLAY_SUPPORT\n"; /^dt$/ and $ret .= "\tselect USES_DEVICETREE\n"; + /^emmc$/ and $ret .= "\tselect EMMC_SUPPORT\n"; /^gpio$/ and $ret .= "\tselect GPIO_SUPPORT\n"; /^pci$/ and $ret .= "\tselect PCI_SUPPORT\n"; /^pcie$/ and $ret .= "\tselect PCIE_SUPPORT\n"; diff --git a/target/Config.in b/target/Config.in index 43de4710df..201ab32a26 100644 --- a/target/Config.in +++ b/target/Config.in @@ -92,6 +92,9 @@ config HAS_MIPS16 config RFKILL_SUPPORT bool +config EMMC_SUPPORT + bool + config NAND_SUPPORT bool