Example #1
0
 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
Example #2
0
 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
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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()