update_lang.sh 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/bin/sh
  2. #
  3. # update_lang.sh - multi-language support script
  4. # Update secondary language in binary file.
  5. #
  6. # Config:
  7. if [ -z "$CONFIG_OK" ]; then eval "$(cat config.sh)"; fi
  8. if [ -z "$OBJCOPY" ]; then echo 'variable OBJCOPY not set!' >&2; exit 1; fi
  9. if [ -z "$CONFIG_OK" ] | [ $CONFIG_OK -eq 0 ]; then echo 'Config NG!' >&2; exit 1; fi
  10. #
  11. # Selected language:
  12. LANG=$1
  13. if [ -z "$LANG" ]; then LANG='cz'; fi
  14. #
  15. finish()
  16. {
  17. echo
  18. if [ "$1" = "0" ]; then
  19. echo "update_lang.sh finished with success" >&2
  20. else
  21. echo "update_lang.sh finished with errors!" >&2
  22. fi
  23. case "$-" in
  24. *i*) echo "press enter key" >&2; read ;;
  25. esac
  26. exit $1
  27. }
  28. echo "update_lang.sh started" >&2
  29. echo " selected language=$LANG" >&2
  30. echo -n " checking files..." >&2
  31. if [ ! -e text.sym ]; then echo "NG! file text.sym not found!" >&2; finish 1; fi
  32. if [ ! -e lang_$LANG.bin ]; then echo "NG! file lang_$LANG.bin not found!" >&2; finish 1; fi
  33. if [ ! -e firmware.bin ]; then echo "NG! file firmware.bin not found!" >&2; finish 1; fi
  34. echo "OK" >&2
  35. echo -n " checking symbols..." >&2
  36. #find symbol _SEC_LANG in section '.text'
  37. sec_lang=$(cat text.sym | grep -E "\b_SEC_LANG\b")
  38. if [ -z "$sec_lang" ]; then echo "NG!\n symbol _SEC_LANG not found!" >&2; finish 1; fi
  39. echo "OK" >&2
  40. echo " calculating vars:" >&2
  41. #get addres and size
  42. sec_lang_addr='0x'$(echo $sec_lang | cut -f1 -d' ')
  43. sec_lang_size='0x'$(echo $sec_lang | cut -f2 -d' ')
  44. echo " sec_lang_addr =$sec_lang_addr" >&2
  45. echo " sec_lang_size =$sec_lang_size" >&2
  46. #calculate lang_table_addr (aligned to 256byte page)
  47. lang_table_addr=$((256*$((($sec_lang_addr + 255) / 256))))
  48. printf " lang_table_addr =0x%04x\n" $lang_table_addr >&2
  49. #calculate lang_table_size
  50. lang_table_size=$((256*$((($sec_lang_size - ($lang_table_addr - $sec_lang_addr))/256))))
  51. printf " lang_table_size =0x%04x (=%d bytes)\n" $lang_table_size $lang_table_size >&2
  52. #get lang_xx.bin file size
  53. lang_file_size=$(wc -c lang_$LANG.bin | cut -f1 -d' ')
  54. printf " lang_file_size =0x%04x (=%d bytes)\n" $lang_file_size $lang_file_size >&2
  55. if [ $lang_file_size -gt $lang_table_size ]; then echo "Lanaguage binary file size too big!" >&2; finish 1; fi
  56. echo "updating 'firmware.bin'..." >&2
  57. dd if=lang_$LANG.bin of=firmware.bin bs=1 seek=$lang_table_addr conv=notrunc 2>/dev/null
  58. #convert bin to hex
  59. echo "converting to hex..." >&2
  60. $OBJCOPY -I binary -O ihex ./firmware.bin ./firmware_$LANG.hex
  61. finish 0