mirror of https://github.com/m-labs/artiq.git
artiq_flash: autodetect variant
This commit is contained in:
parent
fc9d4c7bdc
commit
b219f8b5c7
|
@ -25,6 +25,8 @@ ARTIQ-5
|
||||||
* The controller manager now ignores device database entries without the
|
* The controller manager now ignores device database entries without the
|
||||||
``"command"`` key set to facilitate sharing of devices between multiple
|
``"command"`` key set to facilitate sharing of devices between multiple
|
||||||
masters.
|
masters.
|
||||||
|
* The meaning of the ``-d/--dir`` and ``--srcbuild`` options of ``artiq_flash``
|
||||||
|
has changed.
|
||||||
|
|
||||||
|
|
||||||
ARTIQ-4
|
ARTIQ-4
|
||||||
|
|
|
@ -56,14 +56,14 @@ Prerequisites:
|
||||||
help="target board, default: %(default)s, one of: "
|
help="target board, default: %(default)s, one of: "
|
||||||
"kasli sayma kc705")
|
"kasli sayma kc705")
|
||||||
parser.add_argument("-V", "--variant", default=None,
|
parser.add_argument("-V", "--variant", default=None,
|
||||||
help="board variant")
|
help="board variant. Autodetected if only one is installed.")
|
||||||
parser.add_argument("-I", "--preinit-command", default=[], action="append",
|
parser.add_argument("-I", "--preinit-command", default=[], action="append",
|
||||||
help="add a pre-initialization OpenOCD command. "
|
help="add a pre-initialization OpenOCD command. "
|
||||||
"Useful for selecting a board when several are connected.")
|
"Useful for selecting a board when several are connected.")
|
||||||
parser.add_argument("-f", "--storage", help="write file to storage area")
|
parser.add_argument("-f", "--storage", help="write file to storage area")
|
||||||
parser.add_argument("-d", "--dir", help="look for files in this directory")
|
parser.add_argument("-d", "--dir", help="look for board binaries in this directory")
|
||||||
parser.add_argument("--srcbuild", help="look for bitstream, bootloader and firmware in this "
|
parser.add_argument("--srcbuild", help="board binaries directory is laid out as a source build tree",
|
||||||
"ARTIQ source build tree")
|
default=False, action="store_true")
|
||||||
parser.add_argument("action", metavar="ACTION", nargs="*",
|
parser.add_argument("action", metavar="ACTION", nargs="*",
|
||||||
default="gateware bootloader firmware start".split(),
|
default="gateware bootloader firmware start".split(),
|
||||||
help="actions to perform, default: %(default)s")
|
help="actions to perform, default: %(default)s")
|
||||||
|
@ -267,7 +267,6 @@ def main():
|
||||||
config = {
|
config = {
|
||||||
"kasli": {
|
"kasli": {
|
||||||
"programmer": partial(ProgrammerXC7, board="kasli", proxy="bscan_spi_xc7a100t.bit"),
|
"programmer": partial(ProgrammerXC7, board="kasli", proxy="bscan_spi_xc7a100t.bit"),
|
||||||
"def_variant": "opticlock",
|
|
||||||
"gateware": ("spi0", 0x000000),
|
"gateware": ("spi0", 0x000000),
|
||||||
"bootloader": ("spi0", 0x400000),
|
"bootloader": ("spi0", 0x400000),
|
||||||
"storage": ("spi0", 0x440000),
|
"storage": ("spi0", 0x440000),
|
||||||
|
@ -275,7 +274,6 @@ def main():
|
||||||
},
|
},
|
||||||
"sayma": {
|
"sayma": {
|
||||||
"programmer": ProgrammerSayma,
|
"programmer": ProgrammerSayma,
|
||||||
"def_variant": "standalone",
|
|
||||||
"gateware": ("spi0", 0x000000),
|
"gateware": ("spi0", 0x000000),
|
||||||
"bootloader": ("spi1", 0x000000),
|
"bootloader": ("spi1", 0x000000),
|
||||||
"storage": ("spi1", 0x040000),
|
"storage": ("spi1", 0x040000),
|
||||||
|
@ -284,7 +282,6 @@ def main():
|
||||||
},
|
},
|
||||||
"kc705": {
|
"kc705": {
|
||||||
"programmer": partial(ProgrammerXC7, board="kc705", proxy="bscan_spi_xc7k325t.bit"),
|
"programmer": partial(ProgrammerXC7, board="kc705", proxy="bscan_spi_xc7k325t.bit"),
|
||||||
"def_variant": "nist_clock",
|
|
||||||
"gateware": ("spi0", 0x000000),
|
"gateware": ("spi0", 0x000000),
|
||||||
"bootloader": ("spi0", 0xaf0000),
|
"bootloader": ("spi0", 0xaf0000),
|
||||||
"storage": ("spi0", 0xb30000),
|
"storage": ("spi0", 0xb30000),
|
||||||
|
@ -292,16 +289,33 @@ def main():
|
||||||
},
|
},
|
||||||
}[args.target]
|
}[args.target]
|
||||||
|
|
||||||
variant = args.variant
|
|
||||||
if variant is None:
|
|
||||||
variant = config["def_variant"]
|
|
||||||
|
|
||||||
bin_dir = args.dir
|
bin_dir = args.dir
|
||||||
if bin_dir is None:
|
if bin_dir is None:
|
||||||
bin_name = args.target
|
bin_dir = os.path.join(artiq_dir, "board-support")
|
||||||
if variant:
|
|
||||||
bin_name += "-" + variant
|
variant = args.variant
|
||||||
bin_dir = os.path.join(artiq_dir, "board-support", bin_name)
|
if variant is None:
|
||||||
|
variants = []
|
||||||
|
if args.srcbuild:
|
||||||
|
for entry in os.scandir(bin_dir):
|
||||||
|
if entry.is_dir():
|
||||||
|
variants.append(entry.name)
|
||||||
|
else:
|
||||||
|
prefix = args.target + "-"
|
||||||
|
for entry in os.scandir(bin_dir):
|
||||||
|
if entry.is_dir() and entry.name.startswith(prefix):
|
||||||
|
variants.append(entry.name[len(prefix):])
|
||||||
|
if len(variants) == 0:
|
||||||
|
raise FileNotFoundError("no variants found, did you install a board binary package?")
|
||||||
|
elif len(variants) == 1:
|
||||||
|
variant = variants[0]
|
||||||
|
else:
|
||||||
|
raise ValueError("more than one variant found for selected board, specify -V. "
|
||||||
|
"Found variants: {}".format(" ".join(sorted(variants))))
|
||||||
|
if args.srcbuild:
|
||||||
|
variant_dir = variant
|
||||||
|
else:
|
||||||
|
variant_dir = args.target + "-" + variant
|
||||||
|
|
||||||
if args.host is None:
|
if args.host is None:
|
||||||
client = LocalClient()
|
client = LocalClient()
|
||||||
|
@ -310,12 +324,14 @@ def main():
|
||||||
|
|
||||||
programmer = config["programmer"](client, preinit_script=args.preinit_command)
|
programmer = config["programmer"](client, preinit_script=args.preinit_command)
|
||||||
|
|
||||||
def artifact_path(*path_filename):
|
def artifact_path(this_variant_dir, *path_filename):
|
||||||
if args.srcbuild is None:
|
if args.srcbuild:
|
||||||
*path, filename = path_filename
|
# source tree - use path elements to locate file
|
||||||
return os.path.join(bin_dir, filename)
|
return os.path.join(bin_dir, this_variant_dir, *path_filename)
|
||||||
else:
|
else:
|
||||||
return os.path.join(args.srcbuild, *path_filename)
|
# flat tree - all files in the same directory, discard path elements
|
||||||
|
*_, filename = path_filename
|
||||||
|
return os.path.join(bin_dir, this_variant_dir, filename)
|
||||||
|
|
||||||
def convert_gateware(bit_filename, header=False):
|
def convert_gateware(bit_filename, header=False):
|
||||||
bin_handle, bin_filename = tempfile.mkstemp(
|
bin_handle, bin_filename = tempfile.mkstemp(
|
||||||
|
@ -337,7 +353,7 @@ def main():
|
||||||
for action in args.action:
|
for action in args.action:
|
||||||
if action == "gateware":
|
if action == "gateware":
|
||||||
gateware_bin = convert_gateware(
|
gateware_bin = convert_gateware(
|
||||||
artifact_path(variant, "gateware", "top.bit"))
|
artifact_path(variant_dir, "gateware", "top.bit"))
|
||||||
programmer.write_binary(*config["gateware"], gateware_bin)
|
programmer.write_binary(*config["gateware"], gateware_bin)
|
||||||
if args.target == "sayma" and variant != "master":
|
if args.target == "sayma" and variant != "master":
|
||||||
rtm_gateware_bin = convert_gateware(
|
rtm_gateware_bin = convert_gateware(
|
||||||
|
@ -345,7 +361,7 @@ def main():
|
||||||
programmer.write_binary(*config["rtm_gateware"],
|
programmer.write_binary(*config["rtm_gateware"],
|
||||||
rtm_gateware_bin)
|
rtm_gateware_bin)
|
||||||
elif action == "bootloader":
|
elif action == "bootloader":
|
||||||
bootloader_bin = artifact_path(variant, "software", "bootloader", "bootloader.bin")
|
bootloader_bin = artifact_path(variant_dir, "software", "bootloader", "bootloader.bin")
|
||||||
programmer.write_binary(*config["bootloader"], bootloader_bin)
|
programmer.write_binary(*config["bootloader"], bootloader_bin)
|
||||||
elif action == "storage":
|
elif action == "storage":
|
||||||
storage_img = args.storage
|
storage_img = args.storage
|
||||||
|
@ -356,16 +372,16 @@ def main():
|
||||||
else:
|
else:
|
||||||
firmware = "runtime"
|
firmware = "runtime"
|
||||||
|
|
||||||
firmware_fbi = artifact_path(variant, "software", firmware, firmware + ".fbi")
|
firmware_fbi = artifact_path(variant_dir, "software", firmware, firmware + ".fbi")
|
||||||
programmer.write_binary(*config["firmware"], firmware_fbi)
|
programmer.write_binary(*config["firmware"], firmware_fbi)
|
||||||
elif action == "load":
|
elif action == "load":
|
||||||
if args.target == "sayma":
|
if args.target == "sayma":
|
||||||
rtm_gateware_bit = artifact_path("rtm_gateware", "rtm.bit")
|
rtm_gateware_bit = artifact_path("rtm_gateware", "rtm.bit")
|
||||||
programmer.load(rtm_gateware_bit, 0)
|
programmer.load(rtm_gateware_bit, 0)
|
||||||
gateware_bit = artifact_path(variant, "gateware", "top.bit")
|
gateware_bit = artifact_path(variant_dir, "gateware", "top.bit")
|
||||||
programmer.load(gateware_bit, 1)
|
programmer.load(gateware_bit, 1)
|
||||||
else:
|
else:
|
||||||
gateware_bit = artifact_path(variant, "gateware", "top.bit")
|
gateware_bit = artifact_path(variant_dir, "gateware", "top.bit")
|
||||||
programmer.load(gateware_bit, 0)
|
programmer.load(gateware_bit, 0)
|
||||||
elif action == "start":
|
elif action == "start":
|
||||||
programmer.start()
|
programmer.start()
|
||||||
|
|
Loading…
Reference in New Issue