def convert_gateware(bit_filename, header=False): bin_handle, bin_filename = tempfile.mkstemp( prefix="artiq_", suffix="_" + os.path.basename(bit_filename)) with open(bit_filename, "rb") as bit_file, \ open(bin_handle, "wb") as bin_file: if header: bin_file.write(b"\x00" * 8) bit2bin(bit_file, bin_file) if header: magic = 0x5352544d # "SRTM", see sayma_rtm target length = bin_file.tell() - 8 bin_file.seek(0) bin_file.write(magic.to_bytes(4, byteorder="big")) bin_file.write(length.to_bytes(4, byteorder="big")) atexit.register(lambda: os.unlink(bin_filename)) return bin_filename
def convert_gateware(bit_filename, header=False): bin_handle, bin_filename = tempfile.mkstemp( prefix="artiq_", suffix="_" + os.path.basename(bit_filename)) with open(bit_filename, "rb") as bit_file, \ open(bin_handle, "wb") as bin_file: if header: bin_file.write(b"\x00"*8) bit2bin(bit_file, bin_file) if header: magic = 0x5352544d # "SRTM", see sayma_rtm target length = bin_file.tell() - 8 bin_file.seek(0) bin_file.write(magic.to_bytes(4, byteorder="big")) bin_file.write(length.to_bytes(4, byteorder="big")) atexit.register(lambda: os.unlink(bin_filename)) return bin_filename
def main(): parser = get_argparser() opts = parser.parse_args() config = { "kc705": { "chip": "xc7k325t", "start": "xc7_program xc7.tap", "gateware": 0x000000, "bios": 0xaf0000, "runtime": 0xb00000, "storage": 0xb80000, }, "pipistrello": { "chip": "xc6slx45", "start": "xc6s_program xc6s.tap", "gateware": 0x000000, "bios": 0x170000, "runtime": 0x180000, "storage": 0x200000, }, }[opts.target] if opts.dir is None: opts.dir = os.path.join(artiq_dir, "binaries", "{}-{}".format(opts.target, opts.adapter)) if not os.path.exists(opts.dir): raise SystemExit("Binaries directory '{}' does not exist" .format(opts.dir)) conv = False prog = [] prog.append("init") for action in opts.ACTION: if action == "proxy": proxy_base = "bscan_spi_{}.bit".format(config["chip"]) proxy = None for p in [opts.dir, os.path.expanduser("~/.migen"), "/usr/local/share/migen", "/usr/share/migen"]: proxy_ = os.path.join(p, proxy_base) if os.access(proxy_, os.R_OK): proxy = "jtagspi_init 0 {}".format(proxy_) break if not proxy: raise SystemExit( "proxy gateware bitstream {} not found".format(proxy_base)) prog.append(proxy) elif action == "gateware": bin = os.path.join(opts.dir, "top.bin") if not os.access(bin, os.R_OK): bin = tempfile.mkstemp()[1] bit = os.path.join(opts.dir, "top.bit") conv = True prog.append("jtagspi_program {} 0x{:x}".format( bin, config["gateware"])) elif action == "bios": prog.append("jtagspi_program {} 0x{:x}".format( os.path.join(opts.dir, "bios.bin"), config["bios"])) elif action == "runtime": prog.append("jtagspi_program {} 0x{:x}".format( os.path.join(opts.dir, "runtime.fbi"), config["runtime"])) elif action == "storage": prog.append("jtagspi_program {} 0x{:x}".format( opts.storage, config["storage"])) elif action == "load": prog.append("pld load 0 {}".format( os.path.join(opts.dir, "top.bit"))) elif action == "start": prog.append(config["start"]) else: raise ValueError("invalid action", action) prog.append("exit") try: if conv: bit2bin(bit, bin) subprocess.check_call([ "openocd", "-f", os.path.join("board", opts.target + ".cfg"), "-c", "; ".join(prog), ]) finally: if conv: os.unlink(bin)
def main(): parser = get_argparser() opts = parser.parse_args() config = { "kc705": { "chip": "xc7k325t", "start": "xc7_program xc7.tap", "gateware": 0x000000, "bios": 0xaf0000, "runtime": 0xb00000, "storage": 0xb80000, }, "pipistrello": { "chip": "xc6slx45", "start": "xc6s_program xc6s.tap", "gateware": 0x000000, "bios": 0x170000, "runtime": 0x180000, "storage": 0x200000, }, }[opts.target] if opts.dir is None: opts.dir = os.path.join(artiq_dir, "binaries", "{}-{}".format(opts.target, opts.adapter)) if not os.path.exists(opts.dir): raise SystemExit("Binaries directory '{}' does not exist".format( opts.dir)) conv = False prog = [] prog.append("init") for action in opts.action: if action == "proxy": proxy_base = "bscan_spi_{}.bit".format(config["chip"]) proxy = None for p in [ opts.dir, os.path.expanduser("~/.migen"), "/usr/local/share/migen", "/usr/share/migen" ]: proxy_ = os.path.join(p, proxy_base) if os.access(proxy_, os.R_OK): proxy = "jtagspi_init 0 {{{}}}".format(proxy_) break if not proxy: raise SystemExit( "proxy gateware bitstream {} not found".format(proxy_base)) prog.append(proxy) elif action == "gateware": bin = os.path.join(opts.dir, "top.bin") if not os.access(bin, os.R_OK): bin_handle, bin = tempfile.mkstemp() bit = os.path.join(opts.dir, "top.bit") conv = True prog.append("jtagspi_program {{{}}} 0x{:x}".format( bin, config["gateware"])) elif action == "bios": prog.append("jtagspi_program {{{}}} 0x{:x}".format( os.path.join(opts.dir, "bios.bin"), config["bios"])) elif action == "runtime": prog.append("jtagspi_program {{{}}} 0x{:x}".format( os.path.join(opts.dir, "runtime.fbi"), config["runtime"])) elif action == "storage": prog.append("jtagspi_program {{{}}} 0x{:x}".format( opts.storage, config["storage"])) elif action == "load": prog.append("pld load 0 {{{}}}".format( os.path.join(opts.dir, "top.bit"))) elif action == "start": prog.append(config["start"]) else: raise ValueError("invalid action", action) prog.append("exit") try: if conv: bit2bin(bit, bin_handle) if opts.target_file is None: target_file = os.path.join("board", opts.target + ".cfg") else: target_file = opts.target_file subprocess.check_call([ "openocd", "-s", scripts_path(), "-f", target_file, "-c", "; ".join(prog), ]) finally: if conv: os.unlink(bin)
def main(): parser = get_argparser() opts = parser.parse_args() config = { "kc705": { "programmer_factory": partial(ProgrammerJtagSpi7, "kc705"), "proxy_bitfile": "bscan_spi_xc7k325t.bit", "adapters": ["nist_clock", "nist_qc2"], "gateware": (0, 0x000000), "bios": (0, 0xaf0000), "runtime": (0, 0xb00000), "storage": (0, 0xb80000), }, "sayma": { "programmer_factory": ProgrammerSayma, "proxy_bitfile": "bscan_spi_xcku040-sayma.bit", "adapters": [], "gateware": (0, 0x000000), "bios": (1, 0x000000), "runtime": (1, 0x010000), "storage": (1, 0x090000), }, }[opts.target] adapter = opts.adapter if adapter is not None and adapter not in config["adapters"]: raise SystemExit("Invalid adapter for this board") if adapter is None and config["adapters"]: adapter = config["adapters"][0] bin_dir = opts.dir if bin_dir is None: if adapter is None: bin_dir = os.path.join(artiq_dir, "binaries", "{}".format(opts.target)) else: bin_dir = os.path.join(artiq_dir, "binaries", "{}-{}".format(opts.target, adapter)) if not os.path.exists(bin_dir) and opts.action != ["start"]: raise SystemExit("Binaries directory '{}' does not exist" .format(bin_dir)) programmer = config["programmer_factory"](opts.preinit_command) conv = False for action in opts.action: if action == "proxy": proxy_found = False for p in [bin_dir, proxy_path(), os.path.expanduser("~/.migen"), "/usr/local/share/migen", "/usr/share/migen"]: proxy_bitfile = os.path.join(p, config["proxy_bitfile"]) if os.access(proxy_bitfile, os.R_OK): programmer.proxy(proxy_bitfile) proxy_found = True break if not proxy_found: raise SystemExit( "proxy gateware bitstream {} not found".format(config["proxy_bitfile"])) elif action == "gateware": bin = os.path.join(bin_dir, "top.bin") if not os.access(bin, os.R_OK): bin_handle, bin = tempfile.mkstemp() bit = os.path.join(bin_dir, "top.bit") conv = True programmer.flash_binary(*config["gateware"], bin) elif action == "bios": programmer.flash_binary(*config["bios"], os.path.join(bin_dir, "bios.bin")) elif action == "runtime": programmer.flash_binary(*config["runtime"], os.path.join(bin_dir, "runtime.fbi")) elif action == "storage": programmer.flash_binary(*config["storage"], opts.storage) elif action == "load": programmer.load(os.path.join(bin_dir, "top.bit")) elif action == "start": programmer.start() else: raise ValueError("invalid action", action) if conv: bit2bin(bit, bin_handle) try: programmer.do() finally: if conv: os.unlink(bin)
def main(): args = get_argparser().parse_args() init_logger(args) config = { "kc705": { "programmer": partial(ProgrammerXC7, board="kc705", proxy="bscan_spi_xc7k325t.bit"), "variants": ["nist_clock", "nist_qc2"], "gateware": ("spi0", 0x000000), "bootloader": ("spi0", 0xaf0000), "storage": ("spi0", 0xb30000), "firmware": ("spi0", 0xb40000), }, "kasli": { "programmer": partial(ProgrammerXC7, board="kasli", proxy="bscan_spi_xc7a100t.bit"), "variants": ["opticlock", "master", "satellite"], "gateware": ("spi0", 0x000000), "bootloader": ("spi0", 0x400000), "storage": ("spi0", 0x440000), "firmware": ("spi0", 0x450000), }, "sayma": { "programmer": ProgrammerSayma, "variants": ["standalone", "master", "satellite"], "gateware": ("spi0", 0x000000), "bootloader": ("spi1", 0x000000), "storage": ("spi1", 0x040000), "firmware": ("spi1", 0x050000), }, }[args.target] variant = args.variant if "variants" in config: if variant is not None and variant not in config["variants"]: raise SystemExit("Invalid variant for this board") if variant is None: variant = config["variants"][0] bin_dir = args.dir if bin_dir is None: bin_name = args.target if variant: bin_name += "-" + variant bin_dir = os.path.join(artiq_dir, "binaries", bin_name) if args.host is None: client = LocalClient() else: client = SSHClient(args.host) programmer = config["programmer"](client, preinit_script=args.preinit_command) def artifact_path(*path_filename): if args.srcbuild is None: *path, filename = path_filename return os.path.join(bin_dir, filename) else: return os.path.join(args.srcbuild, *path_filename) try: for action in args.action: if action == "gateware": gateware_bin = artifact_path("gateware", "top.bin") if not os.access(gateware_bin, os.R_OK): bin_handle, gateware_bin = tempfile.mkstemp() gateware_bit = artifact_path("gateware", "top.bit") with open(gateware_bit, "rb") as bit_file, open(bin_handle, "wb") as bin_file: bit2bin(bit_file, bin_file) atexit.register(lambda: os.unlink(gateware_bin)) programmer.write_binary(*config["gateware"], gateware_bin) elif action == "bootloader": bootloader_bin = artifact_path("software", "bootloader", "bootloader.bin") programmer.write_binary(*config["bootloader"], bootloader_bin) elif action == "storage": storage_img = args.storage programmer.write_binary(*config["storage"], storage_img) elif action == "firmware": if variant == "satellite": firmware = "satman" else: firmware = "runtime" firmware_fbi = artifact_path("software", firmware, firmware + ".fbi") programmer.write_binary(*config["firmware"], firmware_fbi) elif action == "load": if args.target == "sayma": rtm_gateware_bit = artifact_path("rtm_gateware", "rtm.bit") programmer.load(rtm_gateware_bit, 0) gateware_bit = artifact_path("gateware", "top.bit") programmer.load(gateware_bit, 1) else: gateware_bit = artifact_path("gateware", "top.bit") programmer.load(gateware_bit, 0) elif action == "start": programmer.start() else: raise ValueError("invalid action", action) except FileNotFoundError as e: raise SystemExit(e) if args.dry_run: print("\n".join(programmer.script())) else: programmer.run()