|
|
@@ -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
|
|
|
}
|