ramips: improve sysupgrade helpers for I-O DATA devices
authorINAGAKI Hiroshi <musashino.open@gmail.com>
Sun, 6 Aug 2023 07:09:35 +0000 (16:09 +0900)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 19 Aug 2023 23:26:15 +0000 (01:26 +0200)
I-O DATA devices manufactured by MSTC (MitraStar Technology Corp.)
have some important flags for booting, "bootnum" and "debugflag".
The almost devices have both flags but some devices have only
"bootnum" flag.
So optimize helper functions in iodata.sh to set each flags.

- both:
  - WN-AX1167GR2
  - WN-AX2033GR
  - WN-DX1167R
  - WN-DX1200GR
  - WN-DX2033GR

- "bootnum" only
  - WN-DEAX1800GR

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
target/linux/ramips/mt7621/base-files/lib/upgrade/iodata.sh
target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh

index 8303ae992262ff3d7e8ff9fcf371ab24a965f59f..40b2b2c76b26e36cf56112eb7a0b79d238040dee 100644 (file)
@@ -10,55 +10,79 @@ iodata_mstc_prepare_fail() {
        reboot -f
 }
 
-# I-O DATA devices manufactured by MSTC (MitraStar Technology Corp.)
-# have two important flags:
-# - bootnum: switch between two os images
-#     use 1st image in OpenWrt
-# - debugflag: enable/disable debug
-#     users can interrupt Z-Loader for recovering the device if enabled
+# read/write 1byte in mtd device
 #
 # parameters:
-# - $1: the offset of "debugflag"
-iodata_mstc_upgrade_prepare() {
-       local persist_mtd="$(find_mtd_part persist)"
-       local factory_mtd="$(find_mtd_part factory)"
-       local dflag_offset="$1"
+#   $1: target mtd device ("/dev/mtdblockN")
+#   $2: offset of target value (decimal or hex)
+#   $3: value to set (decimal or hex, don't set when reading)
+iodata_mstc_rw_byte() {
+       local mtd="$1"
+       local offset="$2"
+       local setval="$3"
+       local _val=$(hexdump -s $offset -n 1 -e '"%d"' $mtd)
 
-       if [ -z "$dflag_offset" ]; then
-               echo 'no debugflag offset provided'
-               iodata_mstc_prepare_fail
+       if [ -z "$setval" ]; then
+               echo $_val
+               return 0
        fi
 
-       if [ -z "$persist_mtd" ] || [ -z "$factory_mtd" ]; then
-               echo 'cannot find mtd partition(s), "factory" or "persist"'
-               iodata_mstc_prepare_fail
+       # decimal or hex -> decimal
+       setval=$((setval))
+       [ "$_val" = "$setval" ] && return 0
+       setval="$(printf '%02x' $setval)"
+
+       if ! (printf "\x$setval" | dd bs=1 seek=$((offset)) conv=notrunc of=$mtd 2>/dev/null); then
+               return 1
        fi
+}
 
-       local bootnum=$(hexdump -s 4 -n 1 -e '"%x"' ${persist_mtd})
-       local debugflag=$(hexdump -s $((dflag_offset)) -n 1 -e '"%x"' ${factory_mtd})
+# set flag in mtd device on I-O DATA devices manufactured by MSTC
+# (MitraStar Technology Corp.)
+#
+# parameters:
+#   $1: parameter name
+#   $2: mtd name contains target flag
+#   $3: offset of flag
+#   $4: valid flag values ("n,n,...", ex:"0,1" or "1,2")
+#   $5: value to set to the flag
+iodata_mstc_set_flag() {
+       local name="$1"
+       local mtddev="$(find_mtd_part $2)"
+       local offset="$3"
+       local valid="$4"
+       local setval="$5"
 
-       if [ "$bootnum" != "1" ] && [ "$bootnum" != "2" ]; then
-               echo "failed to get bootnum, please check the value at 0x4 in ${persist_mtd}"
+       if [ -z "$offset" ]; then
+               echo "no $name flag offset provided"
                iodata_mstc_prepare_fail
        fi
-       if [ "$debugflag" != "0" ] && [ "$debugflag" != "1" ]; then
-               echo "failed to get debugflag, please check the value at ${dflag_offset} in ${factory_mtd}"
+
+       if [ -z "$mtddev" ]; then
+               echo "cannot find \"$2\" mtd partition"
                iodata_mstc_prepare_fail
        fi
-       echo "current: bootnum => ${bootnum}, debugflag => ${debugflag}"
 
-       if [ "$bootnum" = "2" ]; then
-               if ! (echo -ne "\x01" | dd bs=1 count=1 seek=4 conv=notrunc of=${persist_mtd} 2>/dev/null); then
-                       echo "failed to set bootnum"
-                       iodata_mstc_prepare_fail
+       local flag=$(iodata_mstc_rw_byte "$mtddev" "$offset")
+       local _tmp
+       for i in ${valid//,/ }; do
+               if [ "$flag" = "$((i))" ]; then
+                       _tmp=$flag
+                       break
                fi
-               echo "### switch to 1st os-image on next boot ###"
+       done
+
+       if [ -z "$_tmp" ]; then
+               echo "failed to get valid $name flag, please check the value at $offset in $mtddev"
+               iodata_mstc_prepare_fail
        fi
-       if [ "$debugflag" = "0" ]; then
-               if ! (echo -ne "\x01" | dd bs=1 count=1 seek=$((dflag_offset)) conv=notrunc of=${factory_mtd} 2>/dev/null); then
-                       echo "failed to set debugflag"
+       echo "current: $name => $flag"
+
+       if [ "$flag" != "$((setval))" ]; then
+               if ! iodata_mstc_rw_byte "$mtddev" "$offset" "$setval"; then
+                       echo "failed to set \"$name\" flag"
                        iodata_mstc_prepare_fail
                fi
-               echo "### enable debug ###"
+               echo " --> set \"$name\" flag to $setval (valid: $valid)"
        fi
 }
index 3c6d02f4fa6ac1824d8e96085c73fe5bfacf5182..85e97b4f839a0521315cc7ed438172a7c621ed72 100755 (executable)
@@ -125,11 +125,13 @@ platform_do_upgrade() {
        iodata,wn-ax2033gr|\
        iodata,wn-dx1167r|\
        iodata,wn-dx2033gr)
-               iodata_mstc_upgrade_prepare "0xfe75"
+               iodata_mstc_set_flag "debugflag" "factory" "0xfe75" "0,1" "1"
+               iodata_mstc_set_flag "bootnum" "persist" "0x4" "1,2" "1"
                nand_do_upgrade "$1"
                ;;
        iodata,wn-dx1200gr)
-               iodata_mstc_upgrade_prepare "0x1fe75"
+               iodata_mstc_set_flag "debugflag" "factory" "0x1fe75" "0,1" "1"
+               iodata_mstc_set_flag "bootnum" "persist" "0x4" "1,2" "1"
                nand_do_upgrade "$1"
                ;;
        tplink,er605-v2)