@@ -79,8 +79,8 @@ class NrfBinaryRunner(ZephyrBinaryRunner):
79
79
'''Runner front-end base class for nrf tools.'''
80
80
81
81
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 ):
84
84
super ().__init__ (cfg )
85
85
self .hex_ = cfg .hex_file
86
86
# 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,
90
90
self .dev_id = dev_id
91
91
self .erase = bool (erase )
92
92
self .erase_mode = erase_mode
93
+ self .ext_erase_mode = ext_erase_mode
93
94
self .reset = bool (reset )
94
95
self .force = force
95
96
self .recover = bool (recover )
@@ -140,9 +141,13 @@ def do_add_parser(cls, parser):
140
141
memory and disable read back protection before
141
142
flashing (erases flash for both cores on nRF53)''' )
142
143
parser .add_argument ('--erase-mode' , required = False ,
143
- choices = ['none' , 'ranges' , 'all' ], dest = 'erase_mode' ,
144
+ choices = ['none' , 'ranges' , 'all' ],
144
145
help = 'Select the type of erase operation for the '
145
146
'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' )
146
151
147
152
parser .set_defaults (reset = True )
148
153
@@ -439,8 +444,6 @@ def program_hex(self):
439
444
else :
440
445
erase_arg = 'ERASE_RANGES_TOUCHED_BY_FIRMWARE'
441
446
442
- self .logger .debug (f'Erase type: { erase_arg } ' )
443
-
444
447
xip_ranges = {
445
448
'nrf52' : (0x12000000 , 0x19FFFFFF ),
446
449
'nrf53' : (0x10000000 , 0x1FFFFFFF ),
@@ -450,8 +453,16 @@ def program_hex(self):
450
453
xip_start , xip_end = xip_ranges [self .family ]
451
454
if self .hex_refers_region (xip_start , xip_end ):
452
455
# 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 } ' )
455
466
456
467
self .op_program (self .hex_ , erase_arg , ext_mem_erase_opt , defer = True , core = core )
457
468
self .flush (force = False )
@@ -548,6 +559,10 @@ def do_run(self, command, **kwargs):
548
559
raise RuntimeError ('Options --erase and --erase-mode are mutually '
549
560
'exclusive.' )
550
561
562
+ if self .erase and self .ext_erase_mode :
563
+ raise RuntimeError ('Options --erase and --ext-erase-mode are mutually '
564
+ 'exclusive.' )
565
+
551
566
self .ensure_family ()
552
567
553
568
if self .family != 'nrf54l' and self .erase_mode :
0 commit comments