Skip to content

Commit 7f05c5f

Browse files
committed
west: runners: nrf: Add an option to control the ext erase mode
The erase mode for any external memory that is mapped to the address space of the MCU is derived from the internal non-volatile memory erase mode. In order to allow users to override the default value, add a new --ext-erase-mode command-line option that takes an erase mode just like --erase-mode does. Signed-off-by: Carles Cufi <[email protected]>
1 parent 0b36c06 commit 7f05c5f

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

Diff for: scripts/west_commands/runners/nrf_common.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ 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_mode=None, reset=True, tool_opt=None, force=False,
83-
recover=False):
82+
erase_mode=None, ext_erase_mode=None, reset=True,
83+
tool_opt=None, force=False, recover=False):
8484
super().__init__(cfg)
8585
self.hex_ = cfg.hex_file
8686
# The old --nrf-family options takes upper-case family names
@@ -90,6 +90,7 @@ def __init__(self, cfg, family, softreset, pinreset, dev_id, erase=False,
9090
self.dev_id = dev_id
9191
self.erase = bool(erase)
9292
self.erase_mode = erase_mode
93+
self.ext_erase_mode = ext_erase_mode
9394
self.reset = bool(reset)
9495
self.force = force
9596
self.recover = bool(recover)
@@ -140,9 +141,13 @@ def do_add_parser(cls, parser):
140141
memory and disable read back protection before
141142
flashing (erases flash for both cores on nRF53)''')
142143
parser.add_argument('--erase-mode', required=False,
143-
choices=['none', 'ranges', 'all'], dest='erase_mode',
144+
choices=['none', 'ranges', 'all'],
144145
help='Select the type of erase operation for the '
145146
'internal non-volatile memory')
147+
parser.add_argument('--ext-erase-mode', required=False,
148+
choices=['none', 'ranges', 'all'],
149+
help='Select the type of erase operation for the '
150+
'external non-volatile memory')
146151

147152
parser.set_defaults(reset=True)
148153

@@ -439,8 +444,6 @@ def program_hex(self):
439444
else:
440445
erase_arg = 'ERASE_RANGES_TOUCHED_BY_FIRMWARE'
441446

442-
self.logger.debug(f'Erase type: {erase_arg}')
443-
444447
xip_ranges = {
445448
'nrf52': (0x12000000, 0x19FFFFFF),
446449
'nrf53': (0x10000000, 0x1FFFFFFF),
@@ -450,8 +453,16 @@ def program_hex(self):
450453
xip_start, xip_end = xip_ranges[self.family]
451454
if self.hex_refers_region(xip_start, xip_end):
452455
# Default to pages for the external memory
453-
ext_mem_erase_opt = erase_arg if erase_arg == 'ERASE_ALL' else \
454-
'ERASE_RANGES_TOUCHED_BY_FIRMWARE'
456+
ext_mem_erase_opt = self._get_erase_mode(self.ext_erase_mode) or \
457+
(erase_arg if erase_arg == 'ERASE_ALL' else \
458+
'ERASE_RANGES_TOUCHED_BY_FIRMWARE')
459+
460+
if not ext_mem_erase_opt and self.ext_erase_mode:
461+
self.logger.warn(f'Option --ext-erase-mode ignored, no parts of the '
462+
'image refer to external memory')
463+
464+
self.logger.debug(f'Erase modes: chip:{erase_arg} ext_mem:'
465+
f'{ext_mem_erase_opt}')
455466

456467
self.op_program(self.hex_, erase_arg, ext_mem_erase_opt, defer=True, core=core)
457468
self.flush(force=False)
@@ -548,6 +559,10 @@ def do_run(self, command, **kwargs):
548559
raise RuntimeError('Options --erase and --erase-mode are mutually '
549560
'exclusive.')
550561

562+
if self.erase and self.ext_erase_mode:
563+
raise RuntimeError('Options --erase and --ext-erase-mode are mutually '
564+
'exclusive.')
565+
551566
self.ensure_family()
552567

553568
if self.family != 'nrf54l' and self.erase_mode:

Diff for: scripts/west_commands/runners/nrfjprog.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ class NrfJprogBinaryRunner(NrfBinaryRunner):
1818
'''Runner front-end for nrfjprog.'''
1919

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

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

2728
self.qspi_ini = qspi_ini
2829

@@ -46,9 +47,11 @@ def tool_opt_help(cls) -> str:
4647
def do_create(cls, cfg, args):
4748
return NrfJprogBinaryRunner(cfg, args.nrf_family, args.softreset,
4849
args.pinreset, args.dev_id, erase=args.erase,
49-
erase_mode=args.erase_mode, reset=args.reset,
50-
tool_opt=args.tool_opt, force=args.force,
51-
recover=args.recover, qspi_ini=args.qspi_ini)
50+
erase_mode=args.erase_mode,
51+
ext_erase_mode=args.ext_erase_mode,
52+
reset=args.reset, tool_opt=args.tool_opt,
53+
force=args.force, recover=args.recover,
54+
qspi_ini=args.qspi_ini)
5255
@classmethod
5356
def do_add_parser(cls, parser):
5457
super().do_add_parser(parser)

Diff for: scripts/west_commands/runners/nrfutil.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ class NrfUtilBinaryRunner(NrfBinaryRunner):
1717
'''Runner front-end for nrfutil.'''
1818

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

2324
super().__init__(cfg, family, softreset, pinreset, dev_id, erase,
24-
erase_mode, reset, tool_opt, force, recover)
25+
erase_mode, ext_erase_mode, reset, tool_opt, force,
26+
recover)
2527

2628
self.suit_starter = suit_starter
2729
self.ext_mem_config_file = ext_mem_config_file
@@ -50,9 +52,10 @@ def tool_opt_help(cls) -> str:
5052
def do_create(cls, cfg, args):
5153
return NrfUtilBinaryRunner(cfg, args.nrf_family, args.softreset,
5254
args.pinreset, args.dev_id, erase=args.erase,
53-
erase_mode=args.erase_mode, reset=args.reset,
54-
tool_opt=args.tool_opt, force=args.force,
55-
recover=args.recover,
55+
erase_mode=args.erase_mode,
56+
ext_erase_mode=args.ext_erase_mode,
57+
reset=args.reset, tool_opt=args.tool_opt,
58+
force=args.force, recover=args.recover,
5659
suit_starter=args.suit_manifest_starter,
5760
ext_mem_config_file=args.ext_mem_config_file)
5861

0 commit comments

Comments
 (0)