ramips: improve sysupgrade helpers for I-O DATA devices
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>
This commit is contained in:
parent
6cc14bf66a
commit
9088b5445f
2 changed files with 72 additions and 46 deletions
|
@ -10,55 +10,79 @@ iodata_mstc_prepare_fail() {
|
||||||
reboot -f
|
reboot -f
|
||||||
}
|
}
|
||||||
|
|
||||||
# I-O DATA devices manufactured by MSTC (MitraStar Technology Corp.)
|
# read/write 1byte in mtd device
|
||||||
# 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
|
|
||||||
#
|
#
|
||||||
# parameters:
|
# parameters:
|
||||||
# - $1: the offset of "debugflag"
|
# $1: target mtd device ("/dev/mtdblockN")
|
||||||
iodata_mstc_upgrade_prepare() {
|
# $2: offset of target value (decimal or hex)
|
||||||
local persist_mtd="$(find_mtd_part persist)"
|
# $3: value to set (decimal or hex, don't set when reading)
|
||||||
local factory_mtd="$(find_mtd_part factory)"
|
iodata_mstc_rw_byte() {
|
||||||
local dflag_offset="$1"
|
local mtd="$1"
|
||||||
|
local offset="$2"
|
||||||
|
local setval="$3"
|
||||||
|
local _val=$(hexdump -s $offset -n 1 -e '"%d"' $mtd)
|
||||||
|
|
||||||
if [ -z "$dflag_offset" ]; then
|
if [ -z "$setval" ]; then
|
||||||
echo 'no debugflag offset provided'
|
echo $_val
|
||||||
iodata_mstc_prepare_fail
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$persist_mtd" ] || [ -z "$factory_mtd" ]; then
|
# decimal or hex -> decimal
|
||||||
echo 'cannot find mtd partition(s), "factory" or "persist"'
|
setval=$((setval))
|
||||||
iodata_mstc_prepare_fail
|
[ "$_val" = "$setval" ] && return 0
|
||||||
fi
|
setval="$(printf '%02x' $setval)"
|
||||||
|
|
||||||
local bootnum=$(hexdump -s 4 -n 1 -e '"%x"' ${persist_mtd})
|
if ! (printf "\x$setval" | dd bs=1 seek=$((offset)) conv=notrunc of=$mtd 2>/dev/null); then
|
||||||
local debugflag=$(hexdump -s $((dflag_offset)) -n 1 -e '"%x"' ${factory_mtd})
|
return 1
|
||||||
|
fi
|
||||||
if [ "$bootnum" != "1" ] && [ "$bootnum" != "2" ]; then
|
}
|
||||||
echo "failed to get bootnum, please check the value at 0x4 in ${persist_mtd}"
|
|
||||||
iodata_mstc_prepare_fail
|
# set flag in mtd device on I-O DATA devices manufactured by MSTC
|
||||||
fi
|
# (MitraStar Technology Corp.)
|
||||||
if [ "$debugflag" != "0" ] && [ "$debugflag" != "1" ]; then
|
#
|
||||||
echo "failed to get debugflag, please check the value at ${dflag_offset} in ${factory_mtd}"
|
# parameters:
|
||||||
iodata_mstc_prepare_fail
|
# $1: parameter name
|
||||||
fi
|
# $2: mtd name contains target flag
|
||||||
echo "current: bootnum => ${bootnum}, debugflag => ${debugflag}"
|
# $3: offset of flag
|
||||||
|
# $4: valid flag values ("n,n,...", ex:"0,1" or "1,2")
|
||||||
if [ "$bootnum" = "2" ]; then
|
# $5: value to set to the flag
|
||||||
if ! (echo -ne "\x01" | dd bs=1 count=1 seek=4 conv=notrunc of=${persist_mtd} 2>/dev/null); then
|
iodata_mstc_set_flag() {
|
||||||
echo "failed to set bootnum"
|
local name="$1"
|
||||||
iodata_mstc_prepare_fail
|
local mtddev="$(find_mtd_part $2)"
|
||||||
fi
|
local offset="$3"
|
||||||
echo "### switch to 1st os-image on next boot ###"
|
local valid="$4"
|
||||||
fi
|
local setval="$5"
|
||||||
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
|
if [ -z "$offset" ]; then
|
||||||
echo "failed to set debugflag"
|
echo "no $name flag offset provided"
|
||||||
iodata_mstc_prepare_fail
|
iodata_mstc_prepare_fail
|
||||||
fi
|
fi
|
||||||
echo "### enable debug ###"
|
|
||||||
|
if [ -z "$mtddev" ]; then
|
||||||
|
echo "cannot find \"$2\" mtd partition"
|
||||||
|
iodata_mstc_prepare_fail
|
||||||
|
fi
|
||||||
|
|
||||||
|
local flag=$(iodata_mstc_rw_byte "$mtddev" "$offset")
|
||||||
|
local _tmp
|
||||||
|
for i in ${valid//,/ }; do
|
||||||
|
if [ "$flag" = "$((i))" ]; then
|
||||||
|
_tmp=$flag
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
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
|
||||||
|
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 " --> set \"$name\" flag to $setval (valid: $valid)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,11 +125,13 @@ platform_do_upgrade() {
|
||||||
iodata,wn-ax2033gr|\
|
iodata,wn-ax2033gr|\
|
||||||
iodata,wn-dx1167r|\
|
iodata,wn-dx1167r|\
|
||||||
iodata,wn-dx2033gr)
|
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"
|
nand_do_upgrade "$1"
|
||||||
;;
|
;;
|
||||||
iodata,wn-dx1200gr)
|
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"
|
nand_do_upgrade "$1"
|
||||||
;;
|
;;
|
||||||
tplink,er605-v2)
|
tplink,er605-v2)
|
||||||
|
|
Loading…
Reference in a new issue