|
2 | 2 |
|
3 | 3 | import sys
|
4 | 4 | import os
|
| 5 | +import dbus |
5 | 6 | import argparse
|
6 | 7 | import subprocess
|
7 | 8 | import shutil
|
@@ -41,6 +42,25 @@ def build_runtime(root, platform):
|
41 | 42 | return subprocess.call(["make", "-C", os.path.join(root, "ada-runtime"), "nrf52"])
|
42 | 43 | return subprocess.call(["make", "-C", os.path.join(root, "ada-runtime")])
|
43 | 44 |
|
| 45 | +def find_segger_jlink(): |
| 46 | + for d in os.listdir("/sys/block"): |
| 47 | + if d.startswith("sd"): |
| 48 | + with open(f"/sys/block/{d}/device/vendor") as vendor: |
| 49 | + if vendor.read().strip() == "SEGGER": |
| 50 | + return d |
| 51 | + return "" |
| 52 | + |
| 53 | +def mount_segger_jlink(device): |
| 54 | + mounts = [m.strip().split(' ') for m in subprocess.check_output(["mount", "-l"]).decode('utf-8').strip().split('\n')] |
| 55 | + for m in mounts: |
| 56 | + if m[0] == device: |
| 57 | + return m[2] |
| 58 | + bus = dbus.SystemBus() |
| 59 | + obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2/block_devices/' + device) |
| 60 | + iface = dbus.Interface(obj, 'org.freedesktop.UDisks2.Filesystem') |
| 61 | + return iface.get_dbus_method('Mount', dbus_interface='org.freedesktop.UDisks2.Filesystem')([]) |
| 62 | + |
| 63 | + |
44 | 64 | def build_init(root, outdir, default_args, platform, logger):
|
45 | 65 | args = default_args + ["-P", f"core",
|
46 | 66 | "-aP", root,
|
@@ -128,7 +148,19 @@ def gpr_compile_nrf52832(config, gneiss_root, build_dir, paths, platform, logger
|
128 | 148 | for step in ["prepare", "compile"]:
|
129 | 149 | args += ["-XCEMENT_BUILD_STEP=" + step]
|
130 | 150 | logger.debug("gprbuild " + " ".join(args))
|
131 |
| - gprbuild(args) |
| 151 | + if gprbuild(args) != 0: |
| 152 | + logger.error("Compilation failed") |
| 153 | + return |
| 154 | + jlink = find_segger_jlink() |
| 155 | + if not jlink: |
| 156 | + logger.error("No SEGGER JLink programmer found") |
| 157 | + return |
| 158 | + target = mount_segger_jlink(jlink) |
| 159 | + logger.info(f"Programmer at {target}, flashing...") |
| 160 | + subprocess.call(["arm-eabi-objcopy", "-O", "ihex", |
| 161 | + os.path.join(project_dir, "obj/core"), |
| 162 | + os.path.join(target, "core.hex")]) |
| 163 | + logger.info("Finished") |
132 | 164 |
|
133 | 165 | def gpr_compile_linux(config, gneiss_root, build_dir, root_dir, paths, platform, logger, verbose):
|
134 | 166 | logger.info("Compiling...")
|
|
0 commit comments