From: Rafał Miłecki <[email protected]> It isn't UBI aware yet - that remains to be implemented.
Signed-off-by: Rafał Miłecki <[email protected]> --- target/linux/bcm4908/Makefile | 4 +- .../base-files/lib/upgrade/platform.sh | 114 ++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 target/linux/bcm4908/base-files/lib/upgrade/platform.sh diff --git a/target/linux/bcm4908/Makefile b/target/linux/bcm4908/Makefile index 5bee66fe2b..5f80c2f6ca 100644 --- a/target/linux/bcm4908/Makefile +++ b/target/linux/bcm4908/Makefile @@ -20,6 +20,8 @@ include $(INCLUDE_DIR)/target.mk KERNELNAME:=Image dtbs -DEFAULT_PACKAGES += kmod-usb-ohci kmod-usb2 kmod-usb3 +DEFAULT_PACKAGES += \ + bcm63xx-bootfs \ + kmod-usb-ohci kmod-usb2 kmod-usb3 $(eval $(call BuildTarget)) diff --git a/target/linux/bcm4908/base-files/lib/upgrade/platform.sh b/target/linux/bcm4908/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000000..e285b9e013 --- /dev/null +++ b/target/linux/bcm4908/base-files/lib/upgrade/platform.sh @@ -0,0 +1,114 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause + +RAMFS_COPY_BIN="bcm63xx-bootfs" + +PART_NAME=firmware + +# $(1): file to read magic from +# $(2): offset in bytes +# $(3): length in bytes +get_content() { + dd if="$1" skip=$2 bs=1 count=$3 2>/dev/null +} + +platform_expected_image() { + local machine=$(board_name) + + case "$machine" in + "asus,gt-ac5300") echo "asus GT-AC5300"; return;; + "netgear,r8000p") echo "chk U12H359T00_NETGEAR"; return;; + "tplink,archer-c2300-v1") echo ""; return;; + esac +} + +platform_identify() { + local magic + local size + + size=$(wc -c "$1" | cut -d ' ' -f 1) + + magic=$(get_content "$1" $(($size - 20 - 64 + 8)) 12) + [ "$magic" = "GT-AC5300" ] && { + echo "asus" + return + } + + echo "unknown" +} + +platform_check_image() { + [ "$#" -gt 1 ] && return 1 + + local expected_image="$(platform_expected_image)" + local file_type=$(platform_identify "$1") + local error=0 + + case "$file_type" in + "asus") + local size=$(wc -c "$1" | cut -d ' ' -f 1) + local productid=$(get_content "$1" $(($size - 20 - 64 + 8)) 12) + + [ -n "$expected_image" -a "asus $productid" != "$expected_image" ] && { + echo "Firmware productid mismatch ($productid)" + error=1 + } + ;; + *) + echo "Invalid image type. Please use firmware specific for this device." + notify_firmware_broken + error=1 + ;; + esac + + return $error +} + +platform_calc_new_cferam() { + local mtd=$(find_mtd_part $PART_NAME) + [ -z "$mtd" ] && { + echo "Failed to find $PART_NAME partition" >&2 + return + } + + local idx=$(bcm63xx-bootfs ls $mtd | sed -n 's/cferam\.\(\d\d\d\)/\1/p') + [ -z "$idx" ] && { + echo "Failed to find cferam current index" >&2 + return + } + + idx=$(($idx + 1)) + [ "$idx" = "1000" ] && idx=0 + + echo $(printf "cferam.%03d" $idx) +} + +platform_img_from_asus_cmd() { + local size=$(wc -c "$1" | cut -d ' ' -f 1) + + # Use bs=1 to workaround missing iflag=count_bytes + echo -n dd bs=1 count=$(($size - 20 - 64)) +} + +platform_do_upgrade() { + local file_type=$(platform_identify "$1") + local cmd= + + # Find target cferam name + local cferam="$(platform_calc_new_cferam)" + [ -z "$cferam" ] && exit 1 + + bcm63xx-bootfs mv $1 cferam.000 $cferam || { + echo "Failed to rename cferam.000 to $cferam" >&2 + exit 1 + } + + # Flash new firmware + case "$file_type" in + "asus") cmd=$(platform_img_from_asus_cmd "$1");; + esac + mtd erase firmware + default_do_upgrade "$1" "$cmd" + + echo "SUCCESS! Used $cferam" +} -- 2.26.2 _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
