ramips: support dual image feature on ALFA Network boards
authorPiotr Dymacz <pepe2k@gmail.com>
Tue, 29 Oct 2019 22:25:56 +0000 (23:25 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Wed, 13 Nov 2019 20:45:31 +0000 (21:45 +0100)
New U-Boot version for MediaTek MT76x8/MT762x based ALFA Network boards
includes support for a 'dual image' feature. Users can enable it using
U-Boot environment variable 'dual_image' ('1' -> enabled).

When 'dual image' feature is enabled, U-Boot will modify DTB and divide
the original 'firmware' flash area into two, equal in size and aligned
to 64 KB partitions: 'firmware' and 'backup'. U-Boot will also adjust
size of 'firmware' area to match installed flash chip size.

U-Boot will load kernel from active partition which is marked with env
variable 'bootactive' ('1' -> first partition, '2' -> second partition)
and rename both partitions accordingly ('firmware' <-> 'backup').

There are 3 additional env variables used to control 'dual image' mode:
- bootlimit   - maximum number of unsuccessful boot tries (default: '3')
- bootcount   - current number of boot tries
- bootchanged - flag which informs that active partition was changed; if
                it is set and 'bootcount' reaches 'bootlimit' value,
                U-Boot will start web-based recovery which then updates
                both partitions with provided image

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
target/linux/ramips/mt7620/base-files/etc/init.d/bootcount [new file with mode: 0755]
target/linux/ramips/mt7620/base-files/lib/upgrade/platform.sh
target/linux/ramips/mt76x8/base-files/etc/init.d/bootcount
target/linux/ramips/mt76x8/base-files/lib/upgrade/platform.sh

diff --git a/target/linux/ramips/mt7620/base-files/etc/init.d/bootcount b/target/linux/ramips/mt7620/base-files/etc/init.d/bootcount
new file mode 100755 (executable)
index 0000000..c7b6919
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh /etc/rc.common
+
+START=99
+
+boot() {
+       case $(board_name) in
+       alfa-network,ac1200rm|\
+       alfa-network,tube-e4g)
+               [ -n "$(fw_printenv bootcount bootchanged 2>/dev/null)" ] &&\
+                       echo -e "bootcount\nbootchanged\n" | /usr/sbin/fw_setenv -s -
+               ;;
+       esac
+}
index 786d57fc70432f526d98734ad778f8c7ac0ab65d..aad243c1f9776d6bb0368fc4bc923cb55c0841c7 100755 (executable)
@@ -5,6 +5,9 @@
 PART_NAME=firmware
 REQUIRE_IMAGE_METADATA=1
 
+RAMFS_COPY_BIN='fw_printenv fw_setenv'
+RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
+
 platform_check_image() {
        return 0
 }
@@ -13,6 +16,19 @@ platform_do_upgrade() {
        local board=$(board_name)
 
        case "$board" in
+       alfa-network,ac1200rm|\
+       alfa-network,tube-e4g)
+               [ "$(fw_printenv -n dual_image 2>/dev/null)" = "1" ] &&\
+               [ -n "$(find_mtd_part backup)" ] && {
+                       PART_NAME=backup
+                       if [ "$(fw_printenv -n bootactive 2>/dev/null)" = "1" ]; then
+                               fw_setenv bootactive 2 || exit 1
+                       else
+                               fw_setenv bootactive 1 || exit 1
+                       fi
+               }
+               default_do_upgrade "$1"
+               ;;
        *)
                default_do_upgrade "$1"
                ;;
index 0d64deb9e0eb0d6d86c41edf7a7eca2095b8ed46..3c21433cc55a9b32dcc0160d6f755144fadc4af1 100755 (executable)
@@ -4,6 +4,10 @@ START=99
 
 boot() {
        case $(board_name) in
+       alfa-network,awusfree1)
+               [ -n "$(fw_printenv bootcount bootchanged 2>/dev/null)" ] &&\
+                       echo -e "bootcount\nbootchanged\n" | /usr/sbin/fw_setenv -s -
+               ;;
        xiaomi,miwifi-nano)
                fw_setenv flag_boot_success 1
                ;;
index 606a9f2bf6dd0f1f597434d21ba97453908344eb..a3de97abf71bda7e078bcf2a76c58c6853e5c1e5 100755 (executable)
@@ -5,6 +5,9 @@
 PART_NAME=firmware
 REQUIRE_IMAGE_METADATA=1
 
+RAMFS_COPY_BIN='fw_printenv fw_setenv'
+RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
+
 platform_check_image() {
        return 0
 }
@@ -13,6 +16,18 @@ platform_do_upgrade() {
        local board=$(board_name)
 
        case "$board" in
+       alfa-network,awusfree1)
+               [ "$(fw_printenv -n dual_image 2>/dev/null)" = "1" ] &&\
+               [ -n "$(find_mtd_part backup)" ] && {
+                       PART_NAME=backup
+                       if [ "$(fw_printenv -n bootactive 2>/dev/null)" = "1" ]; then
+                               fw_setenv bootactive 2 || exit 1
+                       else
+                               fw_setenv bootactive 1 || exit 1
+                       fi
+               }
+               default_do_upgrade "$1"
+               ;;
        tplink,archer-c50-v4)
                MTD_ARGS="-t romfile"
                default_do_upgrade "$1"