Skip to content

Commit

Permalink
Merge pull request #118 from tyler-potyondy/jlink-selector
Browse files Browse the repository at this point in the history
JLink: Add serial number argument to specify flashing target
  • Loading branch information
bradjc authored Dec 11, 2024
2 parents bd54f06 + f22b1c9 commit 145900b
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,13 +192,15 @@ knowing the device type of the MCU on the board.

tockloader [command] --board [board] --arch [arch] --page-size [page_size] \
--jlink --jlink-cmd [jlink_cmd] --jlink-device [device] \
--jlink-speed [speed] --jlink-if [if]
--jlink-speed [speed] --jlink-if [if] \
--jlink-serial-number [serial_number]

- `jlink_cmd`: The JLink executable to invoke. Defaults to `JLinkExe` on
Mac/Linux, and `JLink` on Windows.
- `device`: The JLinkExe device identifier.
- `speed`: The speed value to pass to JLink. Defaults to 1200.
- `if`: The interface to pass to JLink.
- `serial-number`: The serial number of the target board to use with JLink.

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 145900b

Please sign in to comment.