@@ -52,7 +52,7 @@ class JLinkBinaryRunner(ZephyrBinaryRunner):
52
52
def __init__ (self , cfg , device , dev_id = None ,
53
53
commander = DEFAULT_JLINK_EXE ,
54
54
dt_flash = True , erase = True , reset = False ,
55
- iface = 'swd' , speed = 'auto' ,
55
+ iface = 'swd' , speed = 'auto' , flash_script = None ,
56
56
loader = None ,
57
57
gdbserver = 'JLinkGDBServer' ,
58
58
gdb_host = '' ,
@@ -69,6 +69,7 @@ def __init__(self, cfg, device, dev_id=None,
69
69
self .device = device
70
70
self .dev_id = dev_id
71
71
self .commander = commander
72
+ self .flash_script = flash_script
72
73
self .dt_flash = dt_flash
73
74
self .erase = erase
74
75
self .reset = reset
@@ -120,6 +121,8 @@ def do_add_parser(cls, parser):
120
121
help = 'interface to use, default is swd' )
121
122
parser .add_argument ('--speed' , default = 'auto' ,
122
123
help = 'interface speed, default is autodetect' )
124
+ parser .add_argument ('--flash-script' , default = None ,
125
+ help = 'Custom flashing script, default is None' )
123
126
parser .add_argument ('--tui' , default = False , action = 'store_true' ,
124
127
help = 'if given, GDB uses -tui' )
125
128
parser .add_argument ('--gdbserver' , default = 'JLinkGDBServer' ,
@@ -152,6 +155,7 @@ def do_create(cls, cfg, args):
152
155
erase = args .erase ,
153
156
reset = args .reset ,
154
157
iface = args .iface , speed = args .speed ,
158
+ flash_script = args .flash_script ,
155
159
gdbserver = args .gdbserver ,
156
160
loader = args .loader ,
157
161
gdb_host = args .gdb_host ,
@@ -331,9 +335,7 @@ def do_run(self, command, **kwargs):
331
335
else :
332
336
self .run_client (client_cmd )
333
337
334
- def flash (self , ** kwargs ):
335
-
336
- loader_details = ""
338
+ def get_default_flash_commands (self ):
337
339
lines = [
338
340
'ExitOnError 1' , # Treat any command-error as fatal
339
341
'r' , # Reset and halt the target
@@ -406,16 +408,12 @@ def flash(self, **kwargs):
406
408
407
409
self .logger .debug ('JLink commander script:\n ' +
408
410
'\n ' .join (lines ))
411
+ return flash_file , lines
409
412
410
- # Don't use NamedTemporaryFile: the resulting file can't be
411
- # opened again on Windows.
412
- with tempfile .TemporaryDirectory (suffix = 'jlink' ) as d :
413
- fname = os .path .join (d , 'runner.jlink' )
414
- with open (fname , 'wb' ) as f :
415
- f .writelines (bytes (line + '\n ' , 'utf-8' ) for line in lines )
416
- if self .supports_loader and self .loader :
417
- loader_details = "?" + self .loader
418
-
413
+ def run_flash_cmd (self , fname , flash_file , ** kwargs ):
414
+ loader_details = ""
415
+ if self .supports_loader and self .loader :
416
+ loader_details = "?" + self .loader
419
417
cmd = (
420
418
[self .commander ]
421
419
+ (
@@ -432,8 +430,24 @@ def flash(self, **kwargs):
432
430
+ self .tool_opt
433
431
)
434
432
433
+ if flash_file :
435
434
self .logger .info (f'Flashing file: { flash_file } ' )
436
- kwargs = {}
437
- if not self .logger .isEnabledFor (logging .DEBUG ):
438
- kwargs ['stdout' ] = subprocess .DEVNULL
439
- self .check_call (cmd , ** kwargs )
435
+ kwargs = {}
436
+ if not self .logger .isEnabledFor (logging .DEBUG ):
437
+ kwargs ['stdout' ] = subprocess .DEVNULL
438
+ self .check_call (cmd , ** kwargs )
439
+
440
+ def flash (self , ** kwargs ):
441
+ fname = self .flash_script
442
+ if fname is None :
443
+ # Don't use NamedTemporaryFile: the resulting file can't be
444
+ # opened again on Windows.
445
+ with tempfile .TemporaryDirectory (suffix = 'jlink' ) as d :
446
+ flash_file , lines = self .get_default_flash_commands ()
447
+ fname = os .path .join (d , 'runner.jlink' )
448
+ with open (fname , 'wb' ) as f :
449
+ f .writelines (bytes (line + '\n ' , 'utf-8' ) for line in lines )
450
+
451
+ self .run_flash_cmd (fname , flash_file , ** kwargs )
452
+ else :
453
+ self .run_flash_cmd (fname , None , ** kwargs )
0 commit comments