ramips: improve sysupgrade helpers for I-O DATA devices
[openwrt/staging/nbd.git] / target / linux / ramips / mt7621 / base-files / lib / upgrade / iodata.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
 }