Skip to content

Commit dd5874b

Browse files
jcpi-qhenrikbrixandersen
authored andcommitted
jlink: custom flashing support
Allows to use a custom flashing script with jlink runners. Signed-off-by: Jean-Christophe Pince <[email protected]>
1 parent bb3bab7 commit dd5874b

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed

scripts/west_commands/runners/jlink.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)