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

Reply via email to