12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #
- # 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
- }
|