update_lang.sh 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/bin/sh
  2. #
  3. # Version 1.0.1 Build 10
  4. #
  5. # update_lang.sh - multi-language support script
  6. # Update secondary language in binary file.
  7. #
  8. #############################################################################
  9. # Change log:
  10. # 17 June 2018, XPila, Initial
  11. # 9 June 2020, 3d-gussner, Added version and Change log
  12. # 9 June 2020, 3d-gussner, colored output
  13. # 2 Apr. 2021, 3d-gussner, Use `git rev-list --count HEAD update_lang.sh`
  14. # to get Build Nr
  15. #############################################################################
  16. #
  17. # Config:
  18. if [ -z "$CONFIG_OK" ]; then eval "$(cat config.sh)"; fi
  19. if [ -z "$OBJCOPY" ]; then echo "$(tput setaf 1)variable OBJCOPY not set!$(tput sgr0)" >&2; exit 1; fi
  20. if [ -z "$CONFIG_OK" ] | [ $CONFIG_OK -eq 0 ]; then echo "$(tput setaf 1)Config NG!$(tput sgr0)" >&2; exit 1; fi
  21. #
  22. # Selected language:
  23. LNG=$1
  24. if [ -z "$LNG" ]; then LNG='cz'; fi
  25. #
  26. finish()
  27. {
  28. echo
  29. if [ "$1" = "0" ]; then
  30. echo "$(tput setaf 2)update_lang.sh finished with success$(tput sgr0)" >&2
  31. else
  32. echo "$(tput setaf 1)update_lang.sh finished with errors!$(tput sgr0)" >&2
  33. fi
  34. case "$-" in
  35. *i*) echo "press enter key" >&2; read ;;
  36. esac
  37. exit $1
  38. }
  39. echo "$(tput setaf 2)update_lang.sh started$(tput sgr0)" >&2
  40. echo " selected language=$(tput setaf 2)$LNG$(tput sgr0)" >&2
  41. echo -n " checking files..." >&2
  42. if [ ! -e text.sym ]; then echo "$(tput setaf 1)NG! file text.sym not found!$(tput sgr0)" >&2; finish 1; fi
  43. if [ ! -e lang_$LNG.bin ]; then echo "$(tput setaf 1)NG! file lang_$LNG.bin not found!$(tput sgr0)" >&2; finish 1; fi
  44. if [ ! -e firmware.bin ]; then echo "$(tput setaf 1)NG! file firmware.bin not found!$(tput sgr0)" >&2; finish 1; fi
  45. echo "OK" >&2
  46. echo -n " checking symbols..." >&2
  47. #find symbol _SEC_LANG in section '.text'
  48. sec_lang=$(cat text.sym | grep -E "\b_SEC_LANG\b")
  49. if [ -z "$sec_lang" ]; then echo "$(tput setaf 1)NG!\n symbol _SEC_LANG not found!$(tput sgr0)" >&2; finish 1; fi
  50. #find symbol _PRI_LANG_SIGNATURE in section '.text'
  51. pri_lang=$(cat text.sym | grep -E "\b_PRI_LANG_SIGNATURE\b")
  52. if [ -z "$pri_lang" ]; then echo "$(tput setaf 1)NG!\n symbol _PRI_LANG_SIGNATURE not found!$(tput sgr0)" >&2; finish 1; fi
  53. echo "OK" >&2
  54. echo " calculating vars:" >&2
  55. #get pri_lang addres
  56. pri_lang_addr='0x'$(echo $pri_lang | cut -f1 -d' ')
  57. echo " pri_lang_addr =$pri_lang_addr" >&2
  58. #get addres and size
  59. sec_lang_addr='0x'$(echo $sec_lang | cut -f1 -d' ')
  60. sec_lang_size='0x'$(echo $sec_lang | cut -f2 -d' ')
  61. echo " sec_lang_addr =$sec_lang_addr" >&2
  62. echo " sec_lang_size =$sec_lang_size" >&2
  63. #calculate lang_table_addr (aligned to 256byte page)
  64. lang_table_addr=$((256*$((($sec_lang_addr + 255) / 256))))
  65. printf " lang_table_addr =0x%04x\n" $lang_table_addr >&2
  66. #calculate lang_table_size
  67. lang_table_size=$((256*$((($sec_lang_size - ($lang_table_addr - $sec_lang_addr))/256))))
  68. printf " lang_table_size =0x%04x (=%d bytes)\n" $lang_table_size $lang_table_size >&2
  69. #get lang_xx.bin file size
  70. lang_file_size=$(wc -c lang_$LNG.bin | cut -f1 -d' ')
  71. printf " lang_file_size =0x%04x (=%d bytes)\n" $lang_file_size $lang_file_size >&2
  72. if [ $lang_file_size -gt $lang_table_size ]; then echo "$(tput setaf 1)Lanaguage binary file size too big!$(tput sgr0)" >&2; finish 1; fi
  73. echo "updating 'firmware.bin'..." >&2
  74. dd if=lang_$LNG.bin of=firmware.bin bs=1 seek=$lang_table_addr conv=notrunc 2>/dev/null
  75. #convert bin to hex
  76. echo "converting to hex..." >&2
  77. $OBJCOPY -I binary -O ihex ./firmware.bin ./firmware_$LNG.hex
  78. finish 0