Skip to content

Commit 5204e99

Browse files
jonathannilsenanangl
authored andcommitted
west_commands: ncs_ironside_se_update: fix various issues
Only use the --x-sdfw-variant option when it is supported by nrfutil, since it is not available in all versions of nrfutil-device. The program helptext is used to determine if it is supported. Add an explicit 'nrfutil device recover' ahead of the update, which seems to be necessary in some cases. Fix an issue where the wrong update status was logged after the update of a slot. Signed-off-by: Jonathan Nilsen <[email protected]>
1 parent 0eed51e commit 5204e99

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

scripts/west_commands/ncs_ironside_se_update.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,11 @@ def do_add_parser(self, parser_adder: Any) -> argparse.ArgumentParser:
125125
return parser
126126

127127
def do_run(self, args: argparse.Namespace, unknown: list[str]) -> None:
128+
has_x_sdfw_variant = self._nrfutil_supports_sdfw_variant()
128129
common_kwargs = {
129130
"serial_number": args.serial_number,
130131
"wait_time": args.wait_time,
132+
"sdfw_variant": "ironside" if has_x_sdfw_variant else None,
131133
}
132134

133135
if not args.allow_erase:
@@ -185,6 +187,9 @@ def do_run(self, args: argparse.Namespace, unknown: list[str]) -> None:
185187
f"Updating IronSide SE firmware:\n{indent(target_version_diff, ' ')}\n"
186188
)
187189

190+
self.inf("Erasing non-volatile memory")
191+
self._nrfutil_device("recover", **common_kwargs)
192+
188193
self.dbg("Programming application firmware used to trigger the update")
189194
self._program(update_app, erase=True, **common_kwargs)
190195

@@ -220,7 +225,7 @@ def do_run(self, args: argparse.Namespace, unknown: list[str]) -> None:
220225
slot_version = self._read_firmware_version(slot, **common_kwargs)
221226
last_update_status = self._read_update_status(**common_kwargs)
222227
self.dbg(
223-
f"Version after update: {slot_version}, status: {update_status.name}"
228+
f"Version after update: {slot_version}, status: {last_update_status.name}"
224229
)
225230

226231
if slot_version != slot_target_version:
@@ -276,20 +281,24 @@ def _nrfutil_device(
276281
self,
277282
cmd: str,
278283
serial_number: str | None = None,
284+
sdfw_variant: str | None = None,
279285
die_on_error: bool = True,
286+
dbg_log_stdout: bool = True,
280287
**kwargs: Any,
281288
) -> str:
289+
optional_args = ""
282290
if serial_number is not None:
283-
optional_args = f" --serial-number {serial_number}"
284-
else:
285-
optional_args = ""
291+
optional_args += f" --serial-number {serial_number}"
292+
if sdfw_variant is not None:
293+
optional_args += f" --x-sdfw-variant {sdfw_variant}"
286294

287-
cmd = f"nrfutil device {cmd}{optional_args} --x-sdfw-variant ironside"
295+
cmd = f"nrfutil device {cmd}{optional_args}"
288296
self.dbg(cmd)
289297

290298
result = subprocess.run(cmd, shell=True, text=True, capture_output=True)
291299

292-
self.dbg(result.stdout)
300+
if dbg_log_stdout:
301+
self.dbg(result.stdout)
293302

294303
if result.returncode != 0:
295304
if die_on_error:
@@ -311,6 +320,13 @@ def _nrfutil_read(self, address: int, num_bytes: int, **kwargs: Any) -> bytes:
311320
)
312321
return bytes(json_out["devices"][0]["memoryData"][0]["values"])
313322

323+
def _nrfutil_supports_sdfw_variant(self) -> bool:
324+
nrfutil_device_program_helptext = self._nrfutil_device(
325+
"program --help",
326+
dbg_log_stdout=False,
327+
)
328+
return "--x-sdfw-variant" in nrfutil_device_program_helptext
329+
314330
def _wait_for_bootstatus(self, wait_time: float, **kwargs: Any) -> int:
315331
boot_status = None
316332
start = time.perf_counter()

0 commit comments

Comments
 (0)