ramips: improve sysupgrade helpers for I-O DATA devices
[openwrt/staging/981213.git] / target / linux / ramips / mt7621 / base-files / lib / upgrade / iodata.sh
1 #
2 # Copyright (C) 2019 OpenWrt.org
3 #
4
5 . /lib/functions.sh
6
7 iodata_mstc_prepare_fail() {
8 echo "failed to check and prepare the environment, rebooting..."
9 umount -a
10 reboot -f
11 }
12
13 # read/write 1byte in mtd device
14 #
15 # parameters:
16 # $1: target mtd device ("/dev/mtdblockN")
17 # $2: offset of target value (decimal or hex)
18 # $3: value to set (decimal or hex, don't set when reading)
19 iodata_mstc_rw_byte() {
20 local mtd="$1"
21 local offset="$2"
22 local setval="$3"
23 local _val=$(hexdump -s $offset -n 1 -e '"%d"' $mtd)
24
25 if [ -z "$setval" ]; then
26 echo $_val
27 return 0
28 fi
29
30 # decimal or hex -> decimal
31 setval=$((setval))
32 [ "$_val" = "$setval" ] && return 0
33 setval="$(printf '%02x' $setval)"
34
35 if ! (printf "\x$setval" | dd bs=1 seek=$((offset)) conv=notrunc of=$mtd 2>/dev/null); then
36 return 1
37 fi
38 }
39
40 # set flag in mtd device on I-O DATA devices manufactured by MSTC
41 # (MitraStar Technology Corp.)
42 #
43 # parameters:
44 # $1: parameter name
45 # $2: mtd name contains target flag
46 # $3: offset of flag
47 # $4: valid flag values ("n,n,...", ex:"0,1" or "1,2")
48 # $5: value to set to the flag
49 iodata_mstc_set_flag() {
50 local name="$1"
51 local mtddev="$(find_mtd_part $2)"
52 local offset="$3"
53 local valid="$4"
54 local setval="$5"
55
56 if [ -z "$offset" ]; then
57 echo "no $name flag offset provided"
58 iodata_mstc_prepare_fail
59 fi
60
61 if [ -z "$mtddev" ]; then
62 echo "cannot find \"$2\" mtd partition"
63 iodata_mstc_prepare_fail
64 fi
65
66 local flag=$(iodata_mstc_rw_byte "$mtddev" "$offset")
67 local _tmp
68 for i in ${valid//,/ }; do
69 if [ "$flag" = "$((i))" ]; then
70 _tmp=$flag
71 break
72 fi
73 done
74
75 if [ -z "$_tmp" ]; then
76 echo "failed to get valid $name flag, please check the value at $offset in $mtddev"
77 iodata_mstc_prepare_fail
78 fi
79 echo "current: $name => $flag"
80
81 if [ "$flag" != "$((setval))" ]; then
82 if ! iodata_mstc_rw_byte "$mtddev" "$offset" "$setval"; then
83 echo "failed to set \"$name\" flag"
84 iodata_mstc_prepare_fail
85 fi
86 echo " --> set \"$name\" flag to $setval (valid: $valid)"
87 fi
88 }