Files
RTNode-HeltecV4/extra_script.py

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")