mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 00:11:13 +00:00
9088b5445f
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>
89 lines
2.0 KiB
Bash
89 lines
2.0 KiB
Bash
#
|
|
# Copyright (C) 2019 OpenWrt.org
|
|
#
|
|
|
|
. /lib/functions.sh
|
|
|
|
iodata_mstc_prepare_fail() {
|
|
echo "failed to check and prepare the environment, rebooting..."
|
|
umount -a
|
|
reboot -f
|
|
}
|
|
|
|
# read/write 1byte in mtd device
|
|
#
|
|
# parameters:
|
|
# $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 "$setval" ]; then
|
|
echo $_val
|
|
return 0
|
|
fi
|
|
|
|
# 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
|
|
}
|
|
|
|
# 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 [ -z "$offset" ]; then
|
|
echo "no $name flag offset provided"
|
|
iodata_mstc_prepare_fail
|
|
fi
|
|
|
|
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
|
|
}
|