Skip to content

Commit

Permalink
Add jlink-serial-number argument to specify target
Browse files Browse the repository at this point in the history
-adds flag `--jlink-serial-number XXXX` to specify target board
  • Loading branch information
tyler-potyondy committed Nov 8, 2024
1 parent 0d22542 commit 604756d
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ knowing the device type of the MCU on the board.
- `speed`: The speed value to pass to JLink. Defaults to 1200.
- `if`: The interface to pass to JLink.

JLink supports selecting the target board based on the serial number of the
JTAG. Tockloader exposes this functionality with the `jlink-serial-number`
flag.

tockloader [command] --jlink-serial-number [serial_number]

Tockloader can also do JTAG using OpenOCD. OpenOCD needs to know which config
file to use.

Expand Down
21 changes: 19 additions & 2 deletions tockloader/jlinkexe.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ def __init__(self, args):
if platform.system() == "Windows":
self.jlink_cmd = "JLink"

# Obtain serial number if --jlink-serial-number argument provided
self.jlink_serial_number = getattr(self.args, "jlink_serial_number")

# By default we assume that jlinkexe can be used to read any address on
# this board, so we set `address_maximum` to None. In some cases,
# however, particularly with external flash chips, jlinkexe may not be
Expand Down Expand Up @@ -196,6 +199,10 @@ def _run_jtag_commands(self, commands, binary, write=True):
jlink_file.name,
)

# Append target selector if serial number provided.
if self.jlink_serial_number:
jlink_command += " -USB {}".format(self.jlink_serial_number)

logging.debug('Running "{}".'.format(jlink_command))

def print_output(subp):
Expand Down Expand Up @@ -456,9 +463,19 @@ def run_terminal(self):
return

logging.status("Starting JLinkExe JTAG connection.")

# Include serial number specifier if `--jlink-serial-number` flag provided.
jlink_serial_number_str = ""
if self.jlink_serial_number:
jlink_serial_number_str = ("-USB {}").format(self.jlink_serial_number)

jtag_p = subprocess.Popen(
"{} -device {} -if {} -speed {} -autoconnect 1 -jtagconf -1,-1".format(
self.jlink_cmd, self.jlink_device, self.jlink_if, self.jlink_speed
"{} -device {} -if {} -speed {} -autoconnect 1 {} --jtagconf -1,-1".format(
self.jlink_cmd,
self.jlink_device,
self.jlink_if,
self.jlink_speed,
jlink_serial_number_str,
).split(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
Expand Down
5 changes: 5 additions & 0 deletions tockloader/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,11 @@ def main():
parent_channel.add_argument(
"--jlink-if", help="The interface type to pass to JLinkExe."
)
parent_channel.add_argument(
"--jlink-serial-number",
default=None,
help="Specify a specific JLink via serial number. Useful when multiple JLinks are connected to the same machine.",
)
parent_channel.add_argument(
"--openocd-board", help="The cfg file in OpenOCD `board` folder."
)
Expand Down

0 comments on commit 604756d

Please sign in to comment.