@@ -52,7 +52,7 @@ class JLinkBinaryRunner(ZephyrBinaryRunner):
5252 def __init__ (self , cfg , device , dev_id = None ,
5353 commander = DEFAULT_JLINK_EXE ,
5454 dt_flash = True , erase = True , reset = False ,
55- iface = 'swd' , speed = 'auto' ,
55+ iface = 'swd' , speed = 'auto' , flash_script = None ,
5656 loader = None ,
5757 gdbserver = 'JLinkGDBServer' ,
5858 gdb_host = '' ,
@@ -69,6 +69,7 @@ def __init__(self, cfg, device, dev_id=None,
6969 self .device = device
7070 self .dev_id = dev_id
7171 self .commander = commander
72+ self .flash_script = flash_script
7273 self .dt_flash = dt_flash
7374 self .erase = erase
7475 self .reset = reset
@@ -120,6 +121,8 @@ def do_add_parser(cls, parser):
120121 help = 'interface to use, default is swd' )
121122 parser .add_argument ('--speed' , default = 'auto' ,
122123 help = 'interface speed, default is autodetect' )
124+ parser .add_argument ('--flash-script' , default = None ,
125+ help = 'Custom flashing script, default is None' )
123126 parser .add_argument ('--tui' , default = False , action = 'store_true' ,
124127 help = 'if given, GDB uses -tui' )
125128 parser .add_argument ('--gdbserver' , default = 'JLinkGDBServer' ,
@@ -152,6 +155,7 @@ def do_create(cls, cfg, args):
152155 erase = args .erase ,
153156 reset = args .reset ,
154157 iface = args .iface , speed = args .speed ,
158+ flash_script = args .flash_script ,
155159 gdbserver = args .gdbserver ,
156160 loader = args .loader ,
157161 gdb_host = args .gdb_host ,
@@ -331,9 +335,7 @@ def do_run(self, command, **kwargs):
331335 else :
332336 self .run_client (client_cmd )
333337
334- def flash (self , ** kwargs ):
335-
336- loader_details = ""
338+ def get_default_flash_commands (self ):
337339 lines = [
338340 'ExitOnError 1' , # Treat any command-error as fatal
339341 'r' , # Reset and halt the target
@@ -406,16 +408,12 @@ def flash(self, **kwargs):
406408
407409 self .logger .debug ('JLink commander script:\n ' +
408410 '\n ' .join (lines ))
411+ return flash_file , lines
409412
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
419417 cmd = (
420418 [self .commander ]
421419 + (
@@ -432,8 +430,24 @@ def flash(self, **kwargs):
432430 + self .tool_opt
433431 )
434432
433+ if flash_file :
435434 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