esp_merge_bin.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. Import('env')
  2. import os
  3. import sys
  4. import shutil
  5. import subprocess
  6. buildFlags = env.ParseFlags(env['BUILD_FLAGS'])
  7. OUTPUT_DIR = "build_output{}".format(os.path.sep)
  8. platform = env.PioPlatform()
  9. FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32")
  10. FRAMEWORK_DIR = "{}{}".format(FRAMEWORK_DIR, os.path.sep)
  11. def get_fw_version(source, target, env):
  12. global APP_VER_MAJ
  13. global APP_VER_MIN
  14. global APP_VER_REV
  15. for item in buildFlags.get("CPPDEFINES"):
  16. if (type(item) is list):
  17. if (item[0]=="APP_VER_MAJ"): APP_VER_MAJ = item[1]
  18. if (item[0]=="APP_VER_MIN"): APP_VER_MIN = item[1]
  19. if (item[0]=="APP_VER_REV"): APP_VER_REV = item[1]
  20. print(" * %s = %s" % (item[0],item[1]))
  21. else:
  22. print(" * %s" % item)
  23. def copy_merge_bins(source, target, env):
  24. version = 'v' + str(APP_VER_MAJ) + '.' + str(APP_VER_MIN) + '.' + str(APP_VER_REV)
  25. name =str(target[0]).split(os.path.sep)[2]
  26. flash_size = env.GetProjectOption("board_upload.flash_size")
  27. bootloader = "{}tools{}sdk{}bin{}bootloader_dio_40m.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, os.path.sep, os.path.sep)
  28. partitions = "{}{}partitions.bin".format(env.subst("$BUILD_DIR"), os.path.sep)
  29. boot_app0 = "{}tools{}partitions{}boot_app0.bin".format(FRAMEWORK_DIR, os.path.sep, os.path.sep, os.path.sep)
  30. firmware_dst ="{}firmware{}{}_full_{}_{}.bin".format(OUTPUT_DIR, os.path.sep, name, flash_size, version)
  31. firmware_src = str(target[0])
  32. # check if output directories exist and create if necessary
  33. if not os.path.isdir(OUTPUT_DIR):
  34. os.mkdir(OUTPUT_DIR)
  35. for d in ['firmware', 'map']:
  36. if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)):
  37. os.mkdir("{}{}".format(OUTPUT_DIR, d))
  38. # check if new target files exist and remove if necessary
  39. for f in [firmware_dst]:
  40. if os.path.isfile(f):
  41. os.remove(f)
  42. print(bootloader)
  43. print(partitions)
  44. print(boot_app0)
  45. print(firmware_src)
  46. print(firmware_dst)
  47. print(flash_size)
  48. process = subprocess.Popen(['python', 'tools/esptool_with_merge_bin.py', '--chip', 'esp32', 'merge_bin', '--output', firmware_dst, '--flash_mode', 'dio', '--flash_size', flash_size, '0x1000', bootloader, '0x8000', partitions, '0xe000', boot_app0, '0x10000', firmware_src],
  49. stdout=subprocess.PIPE,
  50. stderr=subprocess.PIPE)
  51. stdout, stderr = process.communicate()
  52. stdout, stderr
  53. print(stdout.decode("utf-8") )
  54. print(stderr.decode("utf-8") )
  55. def copy_ota(source, target, env):
  56. version = 'v' + str(APP_VER_MAJ) + '.' + str(APP_VER_MIN) + '.' + str(APP_VER_REV)
  57. name =str(target[0]).split(os.path.sep)[2]
  58. firmware_src = str(target[0])
  59. firmware_dst ="{}firmware{}{}_ota_{}.bin".format(OUTPUT_DIR, os.path.sep, name, version)
  60. # check if output directories exist and create if necessary
  61. if not os.path.isdir(OUTPUT_DIR):
  62. os.mkdir(OUTPUT_DIR)
  63. for d in ['firmware', 'map']:
  64. if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)):
  65. os.mkdir("{}{}".format(OUTPUT_DIR, d))
  66. # check if new target files exist and remove if necessary
  67. for f in [firmware_dst]:
  68. if os.path.isfile(f):
  69. os.remove(f)
  70. print(firmware_src)
  71. print(firmware_dst)
  72. # copy firmware.bin to firmware/<variant>.bin
  73. shutil.copy(firmware_src, firmware_dst)
  74. env.AddPreAction("$BUILD_DIR/${PROGNAME}.bin", [get_fw_version])
  75. env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [copy_merge_bins])
  76. env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [copy_ota])