Skip to content

Commit

Permalink
base-files: add eMMC sysupgrade support
Browse files Browse the repository at this point in the history
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 <mrkiko.rs@gmail.com>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
CC: Li Zhang <li.zhang@gl-inet.com>
CC: TruongSinh Tran-Nguyen <i@truongsinh.pro>
  • Loading branch information
mrkiko authored and dangowrt committed Dec 2, 2021
1 parent 8d62304 commit 57c1f3f
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 0 deletions.
8 changes: 8 additions & 0 deletions package/base-files/Makefile
Expand Up @@ -24,6 +24,7 @@ PKG_CONFIG_DEPENDS += \
CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \
CONFIG_NAND_SUPPORT \
CONFIG_LEGACY_SDCARD_SUPPORT \
CONFIG_EMMC_SUPPORT \
CONFIG_CLEAN_IPKG \
CONFIG_PER_FEED_REPO \
$(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed))
Expand Down Expand Up @@ -124,6 +125,12 @@ 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

ifeq ($(CONFIG_LEGACY_SDCARD_SUPPORT),)
define Package/base-files/legacy-sdcard-support
rm -f $(1)/lib/upgrade/legacy-sdcard.sh
Expand All @@ -136,6 +143,7 @@ define Package/base-files/install
$(Package/base-files/install-key)
$(Package/base-files/nand-support)
$(Package/base-files/legacy-sdcard-support)
$(Package/base-files/emmc-support)
if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \
$(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \
fi
Expand Down
64 changes: 64 additions & 0 deletions 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
}
1 change: 1 addition & 0 deletions scripts/target-metadata.pl
Expand Up @@ -17,6 +17,7 @@ (@)
/^display$/ and $ret .= "\tselect DISPLAY_SUPPORT\n";
/^dt$/ and $ret .= "\tselect USES_DEVICETREE\n";
/^dt-overlay$/ and $ret .= "\tselect HAS_DT_OVERLAY_SUPPORT\n";
/^emmc$/ and $ret .= "\tselect EMMC_SUPPORT\n";
/^ext4$/ and $ret .= "\tselect USES_EXT4\n";
/^fpu$/ and $ret .= "\tselect HAS_FPU\n";
/^gpio$/ and $ret .= "\tselect GPIO_SUPPORT\n";
Expand Down
3 changes: 3 additions & 0 deletions target/Config.in
Expand Up @@ -98,6 +98,9 @@ config HAS_MIPS16
config RFKILL_SUPPORT
bool

config EMMC_SUPPORT
bool

config NAND_SUPPORT
bool

Expand Down

0 comments on commit 57c1f3f

Please sign in to comment.