Skip to content

Commit

Permalink
jlink: custom flashing support
Browse files Browse the repository at this point in the history
Allows to use a custom flashing script with jlink runners.

Signed-off-by: Jean-Christophe Pince <jean.christophe.pince@qorvo.com>
  • Loading branch information
jcpi-q committed Oct 3, 2024
1 parent f810e13 commit 7d973f1
Showing 1 changed file with 43 additions and 27 deletions.
70 changes: 43 additions & 27 deletions scripts/west_commands/runners/jlink.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class JLinkBinaryRunner(ZephyrBinaryRunner):
def __init__(self, cfg, device, dev_id=None,
commander=DEFAULT_JLINK_EXE,
dt_flash=True, erase=True, reset=False,
iface='swd', speed='auto',
iface='swd', speed='auto', flash_script = None,
loader=None,
gdbserver='JLinkGDBServer',
gdb_host='',
Expand All @@ -64,6 +64,7 @@ def __init__(self, cfg, device, dev_id=None,
self.device = device
self.dev_id = dev_id
self.commander = commander
self.flash_script = flash_script
self.dt_flash = dt_flash
self.erase = erase
self.reset = reset
Expand Down Expand Up @@ -114,6 +115,8 @@ def do_add_parser(cls, parser):
help='interface to use, default is swd')
parser.add_argument('--speed', default='auto',
help='interface speed, default is autodetect')
parser.add_argument('--flash-script', default=None,
help='Custom flashing script, default is None')
parser.add_argument('--tui', default=False, action='store_true',
help='if given, GDB uses -tui')
parser.add_argument('--gdbserver', default='JLinkGDBServer',
Expand All @@ -136,6 +139,7 @@ def do_add_parser(cls, parser):
parser.add_argument('--rtt-port', default=DEFAULT_JLINK_RTT_PORT,
help=f'jlink rtt port, defaults to {DEFAULT_JLINK_RTT_PORT}')


parser.set_defaults(reset=False)

@classmethod
Expand All @@ -147,6 +151,7 @@ def do_create(cls, cfg, args):
erase=args.erase,
reset=args.reset,
iface=args.iface, speed=args.speed,
flash_script=args.flash_script,
gdbserver=args.gdbserver,
loader=args.loader,
gdb_host=args.gdb_host,
Expand Down Expand Up @@ -318,9 +323,7 @@ def do_run(self, command, **kwargs):
else:
self.run_client(client_cmd)

def flash(self, **kwargs):

loader_details = ""
def get_default_flash_commands(self):
lines = [
'ExitOnError 1', # Treat any command-error as fatal
'r', # Reset and halt the target
Expand Down Expand Up @@ -393,28 +396,41 @@ def flash(self, **kwargs):

self.logger.debug('JLink commander script:\n' +
'\n'.join(lines))
return flash_file, lines

# Don't use NamedTemporaryFile: the resulting file can't be
# opened again on Windows.
with tempfile.TemporaryDirectory(suffix='jlink') as d:
fname = os.path.join(d, 'runner.jlink')
with open(fname, 'wb') as f:
f.writelines(bytes(line + '\n', 'utf-8') for line in lines)
if self.supports_loader and self.loader:
loader_details = "?" + self.loader

cmd = ([self.commander] +
(['-IP', f'{self.dev_id}'] if is_ip(self.dev_id) else (['-USB', f'{self.dev_id}'] if self.dev_id else [])) +
(['-nogui', '1'] if self.supports_nogui else []) +
['-if', self.iface,
'-speed', self.speed,
'-device', self.device + loader_details,
'-CommanderScript', fname] +
(['-nogui', '1'] if self.supports_nogui else []) +
self.tool_opt)

def run_flash_cmd(self, fname, flash_file, **kwargs):
loader_details = ""
if self.supports_loader and self.loader:
loader_details = "?" + self.loader

cmd = ([self.commander] +
(['-IP', f'{self.dev_id}'] if is_ip(self.dev_id) else (['-USB', f'{self.dev_id}'] if self.dev_id else [])) +
(['-nogui', '1'] if self.supports_nogui else []) +
['-if', self.iface,
'-speed', self.speed,
'-device', self.device + loader_details,
'-CommanderScript', fname] +
(['-nogui', '1'] if self.supports_nogui else []) +
self.tool_opt)

if flash_file:
self.logger.info('Flashing file: {}'.format(flash_file))
kwargs = {}
if not self.logger.isEnabledFor(logging.DEBUG):
kwargs['stdout'] = subprocess.DEVNULL
self.check_call(cmd, **kwargs)
kwargs = {}
if not self.logger.isEnabledFor(logging.DEBUG):
kwargs['stdout'] = subprocess.DEVNULL
self.check_call(cmd, **kwargs)

def flash(self, **kwargs):
fname = self.flash_script
if fname is None:
# Don't use NamedTemporaryFile: the resulting file can't be
# opened again on Windows.
with tempfile.TemporaryDirectory(suffix='jlink') as d:
flash_file, lines = self.get_default_flash_commands()
fname = os.path.join(d, 'runner.jlink')
with open(fname, 'wb') as f:
f.writelines(bytes(line + '\n', 'utf-8') for line in lines)

self.run_flash_cmd(fname, flash_file, **kwargs)
else:
self.run_flash_cmd(fname, None, **kwargs)

0 comments on commit 7d973f1

Please sign in to comment.