aboutsummaryrefslogtreecommitdiffstats
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/zephyr-flash-pyocd.bbclass61
1 files changed, 41 insertions, 20 deletions
diff --git a/classes/zephyr-flash-pyocd.bbclass b/classes/zephyr-flash-pyocd.bbclass
index 4d24e6a..a873be4 100644
--- a/classes/zephyr-flash-pyocd.bbclass
+++ b/classes/zephyr-flash-pyocd.bbclass
@@ -1,4 +1,5 @@
-CONNECT_TIMEOUT_SECONDS ?= "30"
+PYOCD_CONNECT_TIMEOUT_SECONDS ?= "30"
+PYOCD_FLASH_IDS ?= "all"
python do_flash_usb() {
try:
@@ -7,26 +8,46 @@ python do_flash_usb() {
except ImportError:
bb.fatal("Flashing with pyocd needs the relevant python package. Make sure your host provides it or consult your distribution packages for how to install this prerequisite.")
- timeout = int(d.getVar('CONNECT_TIMEOUT_SECONDS'))
+ try:
+ timeout = int(d.getVar('PYOCD_CONNECT_TIMEOUT_SECONDS'))
+ except ValueError:
+ bb.fatal(f"PYOCD_CONNECT_TIMEOUT_SECONDS was set to an invalid value: {d.getVar('PYOCD_CONNECT_TIMEOUT_SECONDS')}.")
image = f"{d.getVar('DEPLOY_DIR_IMAGE')}/{d.getVar('PN')}.elf"
- bb.plain(f"Attempting to flash {image} to board {d.getVar('BOARD')}")
-
- # Try to connect to a probe with a timeout
- now = 0
- step = 3
- while True:
- session = ConnectHelper.session_with_chosen_probe(blocking=False, return_first=True)
- if session:
- break
- if now >= timeout:
- bb.fatal("Timeout while trying to connect to a probe. Make sure the target device is connected and the udev is configured accordingly. See <https://github.com/mbedmicro/pyOCD/tree/master/udev> for help.")
- bb.warn("Can't connect to the probe. Retrying in %d seconds..." % step)
- time.sleep(step)
- now += step
-
- with session:
- FileProgrammer(session).program(image)
- session.board.target.reset()
+ ids = d.getVar('PYOCD_FLASH_IDS')
+
+ # Compute the list of IDs to program
+ if ids == 'all':
+ ids = []
+ for probe in ConnectHelper.get_all_connected_probes(blocking=False):
+ ids.append(probe.unique_id)
+ if not ids:
+ bb.fatal("No probe detected. Make sure your target is connected.")
+ else:
+ ids = ids.split()
+ if not ids:
+ bb.fatal("No probe requested for programming. Make sure PYOCD_FLASH_IDS is set.")
+
+ # Program each ID
+ for id in ids:
+ bb.plain(f"Attempting to flash {os.path.basename(image)} to board {d.getVar('BOARD')} [{id}]")
+
+ # Try to connect to a probe with a timeout
+ now = 0
+ step = 3
+ while True:
+ session = ConnectHelper.session_with_chosen_probe(blocking=False, return_first=True, unique_id=id)
+ if session:
+ break
+ if now >= timeout:
+ bb.fatal(f"Timeout while trying to connect to probe ID: {id}. Make sure the target device is connected and the udev is configured accordingly. See <https://github.com/mbedmicro/pyOCD/tree/master/udev> for help.")
+ bb.warn(f"Can't connect to the probe ID: {id}. Retrying in {step} seconds...")
+ time.sleep(step)
+ now += step
+
+ # Program the selected probe
+ with session:
+ FileProgrammer(session).program(image)
+ session.board.target.reset()
}
addtask do_flash_usb after do_deploy