From patchwork Sat Nov 7 02:29:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Leite X-Patchwork-Id: 541211 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4287D1409A0 for ; Sat, 7 Nov 2015 13:35:11 +1100 (AEDT) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 8451C28C032; Sat, 7 Nov 2015 03:28:51 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 3D90428BFD9 for ; Sat, 7 Nov 2015 03:27:47 +0100 (CET) X-policyd-weight: using cached result; rate: -5.5 Received: from smtp.rcn.com (smtp.rcn.com [69.168.97.78]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Sat, 7 Nov 2015 03:27:42 +0100 (CET) X_CMAE_Category: , , X-CNFS-Analysis: v=2.1 cv=KMX6dAxo c=1 sm=1 tr=0 a=2oE5fp73Cp9AF7JbdBHwrQ==:117 a=2oE5fp73Cp9AF7JbdBHwrQ==:17 a=K-v-2zaBAAAA:8 a=8ndMLmUfAAAA:8 a=jdP34snFAAAA:8 a=GtbuuoopSrvHzD-x3wQA:9 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: bGVpdGVjQHN0YXRpY2t5LmNvbQ== Authentication-Results: smtp02.rcn.cmh.synacor.com header.from=leitec@staticky.com; sender-id=neutral Authentication-Results: smtp02.rcn.cmh.synacor.com smtp.mail=leitec@staticky.com; spf=neutral; sender-id=neutral Received-SPF: neutral (smtp02.rcn.cmh.synacor.com: 207.172.128.145 is neither permitted nor denied by domain of staticky.com) Received: from [207.172.128.145] ([207.172.128.145:54435] helo=dirk.lan.staticky.com) by smtp.rcn.com (envelope-from ) (ecelerity 3.6.2.43620 r(Platform:3.6.2.0)) with ESMTP id 42/E6-19257-6026D365; Fri, 06 Nov 2015 21:29:26 -0500 From: Claudio Leite To: openwrt-devel@lists.openwrt.org Date: Fri, 6 Nov 2015 21:29:13 -0500 Message-Id: <1446863354-3263-7-git-send-email-leitec@staticky.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1446863354-3263-1-git-send-email-leitec@staticky.com> References: <1446863354-3263-1-git-send-email-leitec@staticky.com> Cc: luka@openwrt.org Subject: [OpenWrt-Devel] [PATCH 6/7] kirkwood: support sysupgrade on Linksys EA[34]500 X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" This automatically writes to the alternate firmware partition (on Linksys's dual firmware layout) using code borrowed from the WRT1900AC port. Signed-off-by: Claudio Leite --- .../kirkwood/base-files/lib/upgrade/linksys.sh | 79 ++++++++++++++++++++++ .../kirkwood/base-files/lib/upgrade/platform.sh | 32 +++++++++ 2 files changed, 111 insertions(+) create mode 100644 target/linux/kirkwood/base-files/lib/upgrade/linksys.sh create mode 100644 target/linux/kirkwood/base-files/lib/upgrade/platform.sh diff --git a/target/linux/kirkwood/base-files/lib/upgrade/linksys.sh b/target/linux/kirkwood/base-files/lib/upgrade/linksys.sh new file mode 100644 index 0000000..13a8f1c --- /dev/null +++ b/target/linux/kirkwood/base-files/lib/upgrade/linksys.sh @@ -0,0 +1,79 @@ +# +# Copyright (C) 2014 OpenWrt.org +# + +linksys_get_target_firmware() { + cur_boot_part=`/usr/sbin/fw_printenv -n boot_part` + target_firmware="" + if [ "$cur_boot_part" = "1" ] + then + # current primary boot - update alt boot + target_firmware="kernel2" + fw_setenv boot_part 2 + fw_setenv bootcmd "run altnandboot" + elif [ "$cur_boot_part" = "2" ] + then + # current alt boot - update primary boot + target_firmware="kernel1" + fw_setenv boot_part 1 + fw_setenv bootcmd "run nandboot" + fi + + echo "$target_firmware" +} + +linksys_get_root_magic() { + (get_image "$@" | dd skip=786432 bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null +} + +platform_do_upgrade_linksys() { + local magic_long="$(get_magic_long "$1")" + + mkdir -p /var/lock + local part_label="$(linksys_get_target_firmware)" + touch /var/lock/fw_printenv.lock + + if [ ! -n "$part_label" ] + then + echo "cannot find target partition" + exit 1 + fi + + local target_mtd=$(find_mtd_part $part_label) + + [ "$magic_long" = "73797375" ] && { + CI_KERNPART="$part_label" + if [ "$part_label" = "kernel1" ] + then + CI_UBIPART="rootfs1" + else + CI_UBIPART="rootfs2" + fi + + nand_upgrade_tar "$1" + } + [ "$magic_long" = "27051956" ] && { + # check firmwares' rootfs types + local target_mtd=$(find_mtd_part $part_label) + local oldroot="$(linksys_get_root_magic $target_mtd)" + local newroot="$(linksys_get_root_magic "$1")" + + if [ "$newroot" = "55424923" -a "$oldroot" = "55424923" ] + # we're upgrading from a firmware with UBI to one with UBI + then + # erase everything to be safe + mtd erase $part_label + get_image "$1" | mtd -n write - $part_label + else + get_image "$1" | mtd write - $part_label + fi + } +} + +linksys_preupgrade() { + export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /usr/sbin/fw_printenv /usr/sbin/fw_setenv" + export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /bin/mkdir /bin/touch" + export RAMFS_COPY_DATA="${RAMFS_COPY_DATA} /etc/fw_env.config /var/lock/fw_printenv.lock" +} + +append sysupgrade_pre_upgrade linksys_preupgrade diff --git a/target/linux/kirkwood/base-files/lib/upgrade/platform.sh b/target/linux/kirkwood/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000..fa7603d --- /dev/null +++ b/target/linux/kirkwood/base-files/lib/upgrade/platform.sh @@ -0,0 +1,32 @@ +. /lib/kirkwood.sh + +platform_check_image() { + [ "$#" -gt 1 ] && return 1 + local board="$(kirkwood_board_name)" + local magic="$(get_magic_long "$1")" + + case "$board" in + "ea3500"|\ + "ea4500") + [ "$magic" != "27051956" -a "$magic" != "73797375" ] && { + echo "Invalid image type." + return 1 + } + return 0 + ;; + esac + + echo "Sysupgrade is not yet supported on $board." + return 1 +} + +platform_do_upgrade() { + local board="$(kirkwood_board_name)" + + case "$board" in + "ea3500"|\ + "ea4500") + platform_do_upgrade_linksys "$ARGV" + ;; + esac +}