200 lines
8.4 KiB
Python
Executable File
200 lines
8.4 KiB
Python
Executable File
import time
|
|
import hashlib
|
|
import shutil
|
|
|
|
Import("env")
|
|
|
|
env.Replace(PROGNAME="rnode_firmware_%s" % env.GetProjectOption("custom_variant"))
|
|
print("PROGNAME:", env.subst("$PROGNAME"))
|
|
|
|
#
|
|
# Custom targets
|
|
#
|
|
|
|
def target_package(target, source, env):
|
|
print("target_package...")
|
|
print("Platform:", env.GetProjectOption("platform"))
|
|
print("Board:", env.GetProjectOption("board"))
|
|
print("Variant:", env.GetProjectOption("custom_variant"))
|
|
# do some actions
|
|
platform = env.GetProjectOption("platform")
|
|
board = env.GetProjectOption("board")
|
|
firmware_package(env)
|
|
|
|
platform = env.GetProjectOption("platform")
|
|
print("Platform:", platform)
|
|
if (platform == "espressif32"):
|
|
env.AddCustomTarget(
|
|
name="package",
|
|
dependencies="$BUILD_DIR/${PROGNAME}.bin",
|
|
actions=[
|
|
target_package
|
|
],
|
|
title="Package",
|
|
description="Package esp32 firmware for delivery"
|
|
)
|
|
elif (platform == "nordicnrf52"):
|
|
# remove --specs=nano.specs to allow exceptions to work
|
|
if '--specs=nano.specs' in env['LINKFLAGS']:
|
|
env['LINKFLAGS'].remove('--specs=nano.specs')
|
|
env.AddCustomTarget(
|
|
name="package",
|
|
dependencies="$BUILD_DIR/${PROGNAME}.zip",
|
|
actions=[
|
|
target_package
|
|
],
|
|
title="Package",
|
|
description="Package nrf52 firmware for delivery"
|
|
)
|
|
|
|
#
|
|
# Upload actions
|
|
#
|
|
|
|
def pre_upload(source, target, env):
|
|
print("pre_upload...")
|
|
# do some actions
|
|
|
|
def post_upload(source, target, env):
|
|
print("post_upload...")
|
|
print("Platform:", env.GetProjectOption("platform"))
|
|
print("Board:", env.GetProjectOption("board"))
|
|
print("Variant:", env.GetProjectOption("custom_variant"))
|
|
print("Serial port:", env.subst("$UPLOAD_PORT"))
|
|
# do some actions
|
|
platform = env.GetProjectOption("platform")
|
|
board = env.GetProjectOption("board")
|
|
if (platform == "espressif32"):
|
|
time.sleep(10)
|
|
# device provisioning is incomplete and only currently appropriate for 915MHz T-Beam
|
|
device_provision(env)
|
|
firmware_hash(source, env)
|
|
# firmware pacakaging is incomplete due to missing console image
|
|
#firmware_package(env)
|
|
elif (platform == "nordicnrf52"):
|
|
time.sleep(5)
|
|
# device provisioning is incomplete and only currently appropriate for 915MHz RAK4631
|
|
device_provision(env)
|
|
firmware_hash(source, env)
|
|
# firmware pacakaging is incomplete due to missing console image
|
|
#firmware_package(env)
|
|
|
|
def post_clean(source, target, env):
|
|
print("post_clean...")
|
|
core_dir = env.subst("$CORE_DIR")
|
|
print("core_dir:", core_dir)
|
|
packages_dir = env.subst("$PACKAGES_DIR")
|
|
print("packages_dir:", packages_dir)
|
|
project_dir = env.subst("$PROJECT_DIR")
|
|
print("project_dir:", project_dir)
|
|
#build_dir = env.subst("$BUILD_DIR").get_abspath()
|
|
build_dir = env.subst("$BUILD_DIR")
|
|
print("build_dir:", build_dir)
|
|
build_cache_dir = env.subst("$PLATFORMIO_BUILD_CACHE_DIR")
|
|
print("build_cache_dir:", build_cache_dir)
|
|
workspace_dir = env.subst("$PLATFORMIO_WORKSPACE_DIR")
|
|
print("workspace_dir:", workspace_dir)
|
|
#shutil.rmtree(directory_path)
|
|
env.Execute("rm -f " + project_dir + "/Release/" + project_dir + "/" + env.subst("$PROGNAME") + ".zip")
|
|
|
|
env.AddPreAction("upload", pre_upload)
|
|
env.AddPostAction("upload", post_upload)
|
|
env.AddPostAction("clean", post_clean)
|
|
|
|
def device_wipe(env):
|
|
# Device wipe
|
|
print("Wiping device...")
|
|
env.Execute("rnodeconf --eeprom-wipe " + env.subst("$UPLOAD_PORT"))
|
|
|
|
def device_provision(env):
|
|
# Device provision
|
|
print("Provisioning device...")
|
|
platform = env.GetProjectOption("platform")
|
|
print("Platform:", platform)
|
|
board = env.GetProjectOption("board")
|
|
print("Board:", board)
|
|
variant = env.GetProjectOption("custom_variant")
|
|
print("Variant:", variant)
|
|
if variant in ("tbeam", "tbeam_local"):
|
|
env.Execute("rnodeconf --product e0 --model e9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
elif variant in ("lora32v21", "lora32v21_local"):
|
|
env.Execute("rnodeconf --product b1 --model b9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
elif variant in ("heltec32v4", "heltec32v4_local", "heltec32v4_boundary", "heltec32v4_boundary_local"):
|
|
env.Execute("rnodeconf --product b1 --model b9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
elif variant in ("meshadventurer_s3_boundary"):
|
|
env.Execute("rnodeconf --product f0 --model fe --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
elif variant in ("rak4631", "rak4631_local"):
|
|
env.Execute("rnodeconf --product 10 --model 12 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
elif variant in ("heltec_t114", "heltec_t114_local"):
|
|
env.Execute("rnodeconf --product c2 --model c7 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
|
|
|
def firmware_hash(source, env):
|
|
# Firmware hash
|
|
print("Updating firmware hash...")
|
|
source_file = source[0].get_abspath()
|
|
platform = env.GetProjectOption("platform")
|
|
print("Platform:", platform)
|
|
if (platform == "nordicnrf52"):
|
|
build_dir = env.subst("$BUILD_DIR")
|
|
env.Execute("cd " + build_dir + "; unzip -o " + source_file + " " + env.subst("$PROGNAME") + ".bin")
|
|
#source_file.replace(".zip", ".bin")
|
|
source_file = build_dir + "/" + env.subst("$PROGNAME") + ".bin";
|
|
print("source_file:", source_file)
|
|
firmware_data = open(source_file, "rb").read()
|
|
calc_hash = hashlib.sha256(firmware_data).digest()
|
|
hex_hash = calc_hash.hex()
|
|
print("firmware_hash:", hex_hash)
|
|
env.Execute("rnodeconf --firmware-hash " + hex_hash + " " + env.subst("$UPLOAD_PORT"))
|
|
else:
|
|
print("source_file:", source_file)
|
|
firmware_data = open(source_file, "rb").read()
|
|
calc_hash = hashlib.sha256(firmware_data[0:-32]).digest()
|
|
part_hash = firmware_data[-32:]
|
|
hex_hash = calc_hash.hex()
|
|
print("firmware_hash:", hex_hash)
|
|
if (calc_hash == part_hash):
|
|
env.Execute("rnodeconf --firmware-hash " + hex_hash + " " + env.subst("$UPLOAD_PORT"))
|
|
else:
|
|
print("Calculated hash does not match!")
|
|
|
|
def firmware_package(env):
|
|
platform = env.GetProjectOption("platform")
|
|
board = env.GetProjectOption("board")
|
|
# Firmware package
|
|
print("Building firmware package...")
|
|
platform = env.GetProjectOption("platform")
|
|
print("Platform:", platform)
|
|
board = env.GetProjectOption("board")
|
|
print("Board:", board)
|
|
variant = env.GetProjectOption("custom_variant")
|
|
print("Variant:", variant)
|
|
core_dir = env.subst("$CORE_DIR")
|
|
print("core_dir:", core_dir)
|
|
packages_dir = env.subst("$PACKAGES_DIR")
|
|
print("packages_dir:", packages_dir)
|
|
workspace_dir = env.subst("$WORKSPACE_DIR")
|
|
print("workspace_dir:", workspace_dir)
|
|
project_dir = env.subst("$PROJECT_DIR")
|
|
print("project_dir:", project_dir)
|
|
#build_dir = env.subst("$BUILD_DIR").get_abspath()
|
|
build_dir = env.subst("$BUILD_DIR")
|
|
print("build_dir:", build_dir)
|
|
if (platform == "espressif32"):
|
|
#env.Execute("cp " + packages_dir + "/framework-arduinoespressif32/tools/partitions/boot_app0.bin " + build_dir + "/rnode_firmware_" + variant + ".boot_app0")
|
|
env.Execute("cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin " + build_dir + "/rnode_firmware_" + variant + ".boot_app0")
|
|
env.Execute("cp " + build_dir + "/bootloader.bin " + build_dir + "/" + env.subst("$PROGNAME") + ".bootloader")
|
|
env.Execute("cp " + build_dir + "/partitions.bin " + build_dir + "/" + env.subst("$PROGNAME") + ".partitions")
|
|
env.Execute("rm -f " + project_dir + "/Release/" + env.subst("$PROGNAME") + ".zip")
|
|
zip_cmd = "zip --junk-paths "
|
|
zip_cmd += project_dir + "/Release/rnode_firmware_" + variant + ".zip "
|
|
zip_cmd += project_dir + "/Release/esptool/esptool.py "
|
|
zip_cmd += project_dir + "/Release/console_image.bin "
|
|
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".bin "
|
|
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".boot_app0 "
|
|
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".bootloader "
|
|
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".partitions "
|
|
env.Execute(zip_cmd)
|
|
elif (platform == "nordicnrf52"):
|
|
env.Execute("cp " + build_dir + "/" + env.subst("$PROGNAME") + ".zip " + project_dir + "/Release/.")
|
|
env.Execute("python " + project_dir + "/release_hashes.py > " + project_dir + "/Release/release.json")
|