Skip to content

Commit 58e0e31

Browse files
carlescufikartben
authored andcommitted
west: runners: nrf: Generalize the erase command
Instead of providing an `--erase-pages` command, generalize it to a new `--erase-mode` one that can be set to `none`, `ranges`, or `all`. This gives the user full control over the erase mode that will be passed on to nrfutil. Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
1 parent 01f65f6 commit 58e0e31

File tree

4 files changed

+32
-19
lines changed

4 files changed

+32
-19
lines changed

doc/releases/migration-guide-4.2.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ Boards
4141
* All boards based on a Nordic IC of the nRF54L series now default to not
4242
erasing any part of the internal storage when flashing. If you'd like to
4343
revert to the previous default of erasing the pages that will be written to by
44-
the firmware to be flashed you can use the new ``--erase-pages`` command-line
45-
switch when invoking ``west flash``.
44+
the firmware to be flashed you can set the new ``--erase-mode`` command-line
45+
switch when invoking ``west flash`` to ``ranges``.
4646
Note that RRAM on nRF54L devices is not physically paged, and paging is
4747
only artificially provided, with a page size of 4096 bytes, for an easier
4848
transition of nRF52 software to nRF54L devices.

scripts/west_commands/runners/nrf_common.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class NrfBinaryRunner(ZephyrBinaryRunner):
7979
'''Runner front-end base class for nrf tools.'''
8080

8181
def __init__(self, cfg, family, softreset, pinreset, dev_id, erase=False,
82-
erase_pages=False, reset=True, tool_opt=None, force=False,
82+
erase_mode=None, reset=True, tool_opt=None, force=False,
8383
recover=False):
8484
super().__init__(cfg)
8585
self.hex_ = cfg.hex_file
@@ -89,7 +89,7 @@ def __init__(self, cfg, family, softreset, pinreset, dev_id, erase=False,
8989
self.pinreset = pinreset
9090
self.dev_id = dev_id
9191
self.erase = bool(erase)
92-
self.erase_pages = bool(erase_pages)
92+
self.erase_mode = erase_mode
9393
self.reset = bool(reset)
9494
self.force = force
9595
self.recover = bool(recover)
@@ -139,9 +139,10 @@ def do_add_parser(cls, parser):
139139
help='''erase all user available non-volatile
140140
memory and disable read back protection before
141141
flashing (erases flash for both cores on nRF53)''')
142-
parser.add_argument('--erase-pages', required=False,
143-
action='store_true', dest='erase_pages',
144-
help='erase pages to be used by the firmware')
142+
parser.add_argument('--erase-mode', required=False,
143+
choices=['none', 'ranges', 'all'], dest='erase_mode',
144+
help='Select the type of erase operation for the '
145+
'internal non-volatile memory')
145146

146147
parser.set_defaults(reset=True)
147148

@@ -341,6 +342,18 @@ def _get_core(self):
341342

342343
return None
343344

345+
def _get_erase_mode(self, mode):
346+
if not mode:
347+
return None
348+
elif mode == "none":
349+
return "ERASE_NONE"
350+
elif mode == "ranges":
351+
return "ERASE_RANGES_TOUCHED_BY_FIRMWARE"
352+
elif mode == "all":
353+
return "ERASE_ALL"
354+
else:
355+
raise RuntimeError(f"Invalid erase mode: {mode}")
356+
344357
def program_hex(self):
345358
# Get the command use to actually program self.hex_.
346359
self.logger.info(f'Flashing file: {self.hex_}')
@@ -421,8 +434,8 @@ def program_hex(self):
421434
else:
422435
if self.erase:
423436
erase_arg = 'ERASE_ALL'
424-
elif self.family == 'nrf54l' and not self.erase_pages:
425-
erase_arg = 'ERASE_NONE'
437+
elif self.family == 'nrf54l':
438+
erase_arg = self._get_erase_mode(self.erase_mode) or 'ERASE_NONE'
426439
else:
427440
erase_arg = 'ERASE_RANGES_TOUCHED_BY_FIRMWARE'
428441

@@ -531,14 +544,14 @@ def do_run(self, command, **kwargs):
531544
raise RuntimeError('Options --softreset and --pinreset are mutually '
532545
'exclusive.')
533546

534-
if self.erase and self.erase_pages:
535-
raise RuntimeError('Options --erase and --erase-pages are mutually '
547+
if self.erase and self.erase_mode:
548+
raise RuntimeError('Options --erase and --erase-mode are mutually '
536549
'exclusive.')
537550

538551
self.ensure_family()
539552

540-
if self.family != 'nrf54l' and self.erase_pages:
541-
raise RuntimeError('Option --erase-pages can only be used with the '
553+
if self.family != 'nrf54l' and self.erase_mode:
554+
raise RuntimeError('Option --erase-mode can only be used with the '
542555
'nRF54L family.')
543556

544557
self.ensure_output('hex')

scripts/west_commands/runners/nrfjprog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class NrfJprogBinaryRunner(NrfBinaryRunner):
1818
'''Runner front-end for nrfjprog.'''
1919

2020
def __init__(self, cfg, family, softreset, pinreset, dev_id, erase=False,
21-
erase_pages=False, reset=True, tool_opt=None, force=False,
21+
erase_mode=None, reset=True, tool_opt=None, force=False,
2222
recover=False, qspi_ini=None):
2323

2424
super().__init__(cfg, family, softreset, pinreset, dev_id, erase,
25-
erase_pages, reset, tool_opt, force, recover)
25+
erase_mode, reset, tool_opt, force, recover)
2626

2727
self.qspi_ini = qspi_ini
2828

@@ -46,7 +46,7 @@ def tool_opt_help(cls) -> str:
4646
def do_create(cls, cfg, args):
4747
return NrfJprogBinaryRunner(cfg, args.nrf_family, args.softreset,
4848
args.pinreset, args.dev_id, erase=args.erase,
49-
erase_pages=args.erase_pages, reset=args.reset,
49+
erase_mode=args.erase_mode, reset=args.reset,
5050
tool_opt=args.tool_opt, force=args.force,
5151
recover=args.recover, qspi_ini=args.qspi_ini)
5252
@classmethod

scripts/west_commands/runners/nrfutil.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ class NrfUtilBinaryRunner(NrfBinaryRunner):
1717
'''Runner front-end for nrfutil.'''
1818

1919
def __init__(self, cfg, family, softreset, pinreset, dev_id, erase=False,
20-
erase_pages=False, reset=True, tool_opt=None, force=False,
20+
erase_mode=None, reset=True, tool_opt=None, force=False,
2121
recover=False, suit_starter=False, ext_mem_config_file=None):
2222

2323
super().__init__(cfg, family, softreset, pinreset, dev_id, erase,
24-
erase_pages, reset, tool_opt, force, recover)
24+
erase_mode, reset, tool_opt, force, recover)
2525

2626
self.suit_starter = suit_starter
2727
self.ext_mem_config_file = ext_mem_config_file
@@ -50,7 +50,7 @@ def tool_opt_help(cls) -> str:
5050
def do_create(cls, cfg, args):
5151
return NrfUtilBinaryRunner(cfg, args.nrf_family, args.softreset,
5252
args.pinreset, args.dev_id, erase=args.erase,
53-
erase_pages=args.erase_pages, reset=args.reset,
53+
erase_mode=args.erase_mode, reset=args.reset,
5454
tool_opt=args.tool_opt, force=args.force,
5555
recover=args.recover,
5656
suit_starter=args.suit_manifest_starter,

0 commit comments

Comments
 (0)