nxp: mimxrt1170: add support for NXP's LinkServer

LinkServer is NXP's tool to flash and debug on MCU's.
This patch expands support for LinkServer to MIMXRT1170.

There is one limitation with flashing and debugging the SoC's seciond
core (COrtex M4) that will be addressed with a future submission.

Signed-off-by: Yves Vandervennet <yves.vandervennet@nxp.com>
This commit is contained in:
Yves Vandervennet 2023-09-01 10:59:17 -05:00 committed by Carles Cufí
commit ab9da956b0
2 changed files with 47 additions and 10 deletions

View file

@ -5,13 +5,28 @@
#
if(CONFIG_SOC_MIMXRT1176_CM7 OR CONFIG_SECOND_CORE_MCUX)
board_runner_args(pyocd "--target=mimxrt1170_cm7")
board_runner_args(jlink "--device=MIMXRT1176xxxA_M7" "--reset-after-load")
board_runner_args(pyocd "--target=mimxrt1170_cm7")
board_runner_args(jlink "--device=MIMXRT1176xxxA_M7" "--reset-after-load")
if(CONFIG_BOARD_MIMXRT1170_EVK_CM7)
board_runner_args(linkserver "--device=MIMXRT1176xxxxx:MIMXRT1170-EVK")
elseif(CONFIG_BOARD_MIMXRT1170_EVKB_CM7)
board_runner_args(linkserver "--device=MIMXRT1176xxxxx:MIMXRT1170-EVKB")
endif()
board_runner_args(linkserver "--core=cm7")
elseif(CONFIG_SOC_MIMXRT1176_CM4)
board_runner_args(pyocd "--target=mimxrt1170_cm4")
# Note: Please use JLINK above V7.50 (Only support run cm4 image when debugging due to default boot core on board is cm7 core)
board_runner_args(jlink "--device=MIMXRT1176xxxA_M4")
board_runner_args(pyocd "--target=mimxrt1170_cm4")
# Note: Please use JLINK above V7.50 (Only support run cm4 image when debugging due to default boot core on board is cm7 core)
board_runner_args(jlink "--device=MIMXRT1176xxxA_M4")
if(CONFIG_BOARD_MIMXRT1170_EVK_CM4)
board_runner_args(linkserver "--device=MIMXRT1176xxxxx:MIMXRT1170-EVK")
elseif(CONFIG_BOARD_MIMXRT1170_EVKB_CM4)
board_runner_args(linkserver "--device=MIMXRT1176xxxxx:MIMXRT1170-EVKB")
endif()
board_runner_args(linkserver "--core=cm4")
endif()
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)
include(${ZEPHYR_BASE}/boards/common/linkserver.board.cmake)

View file

@ -22,7 +22,7 @@ DEFAULT_LINKSERVER_SEMIHOST_PORT = 3334
class LinkServerBinaryRunner(ZephyrBinaryRunner):
'''Runner front-end for NXP Linkserver'''
def __init__(self, cfg, device,
def __init__(self, cfg, device, core,
linkserver=DEFAULT_LINKSERVER_EXE,
dt_flash=True, erase=True,
probe=1,
@ -39,6 +39,7 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
self.elf_name = cfg.elf_file
self.gdb_cmd = cfg.gdb if cfg.gdb else None
self.device = device
self.core = core
self.linkserver = linkserver
self.dt_flash = dt_flash
self.erase = erase
@ -68,6 +69,8 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
def do_add_parser(cls, parser):
parser.add_argument('--device', required=True, help='device name')
parser.add_argument('--core', required=False, help='core of the device')
parser.add_argument('--probe', default=1,
help='interface to use (index, no serial number), default is 1')
@ -92,7 +95,7 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
@classmethod
def do_create(cls, cfg, args):
return LinkServerBinaryRunner(cfg, args.device,
return LinkServerBinaryRunner(cfg, args.device, args.core,
linkserver=args.linkserver,
dt_flash=args.dt_flash,
erase=args.erase,
@ -120,14 +123,22 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
if command == 'flash':
self.flash(**kwargs)
else:
if self.core is not None:
_cmd_core = [ "-c", self.core ]
else:
_cmd_core = []
linkserver_cmd = ([self.linkserver] +
["gdbserver"] +
["--probe", "#"+str(self.probe) ] +
["--gdb-port", str(self.gdb_port )] +
["--semihost-port", str(self.semihost_port) ] +
self.override_cli +
_cmd_core +
self.override_cli +
[self.device])
self.logger.debug(f'LinkServer cmd: + {linkserver_cmd}')
if command in ('debug', 'attach'):
if self.elf_name is None or not os.path.isfile(self.elf_name):
raise ValueError('Cannot debug; elf file required')
@ -153,8 +164,13 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
def do_erase(self, **kwargs):
if self.core is not None:
_cmd_core = ":"+self.core
else:
_cmd_core = ""
linkserver_cmd = ([self.linkserver, "flash"] + ["--probe", "#"+str(self.probe)] +
[self.device] + ["erase"])
[self.device+_cmd_core] + ["erase"])
self.logger.debug("flash erase command = " + str(linkserver_cmd))
self.check_call(linkserver_cmd)
@ -170,7 +186,13 @@ class LinkServerBinaryRunner(ZephyrBinaryRunner):
def flash(self, **kwargs):
linkserver_cmd = ([self.linkserver, "flash"] + ["--probe", "#"+str(self.probe)] + self.override_cli + [self.device])
if self.core is not None:
_cmd_core = ":"+self.core
else:
_cmd_core = ""
linkserver_cmd = ([self.linkserver, "flash"] + ["--probe", "#"+str(self.probe)] + self.override_cli + [self.device+_cmd_core])
self.logger.debug(f'LinkServer cmd: + {linkserver_cmd}')
if self.erase:
self.do_erase()