iodata.sh 2.0 KB

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