artiq-netboot/artiq_netboot/artiq_netboot.py

51 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import socket
import struct
import os
def send_file(sock, filename):
with open(filename, "rb") as input_file:
sock.sendall(struct.pack(">I", os.fstat(input_file.fileno()).st_size))
while True:
data = input_file.read(4096)
if not data:
break
sock.sendall(data)
sock.sendall(b"OK")
def main():
parser = argparse.ArgumentParser(description="ARTIQ netboot tool")
parser.add_argument("hostname", metavar="HOSTNAME",
help="hostname of the target board")
parser.add_argument("-f", "--firmware", nargs=1,
help="firmware to load")
# Note that on softcore systems, the main gateware cannot be replaced
# with -g. This option is used for loading the RTM FPGA from the AMC
# on Sayma, and the PL on Zynq.
parser.add_argument("-g", "--gateware", nargs=1,
help="gateware to load")
parser.add_argument("-b", "--boot", action="store_true",
help="boot the device")
args = parser.parse_args()
sock = socket.create_connection((args.hostname, 4269))
try:
if args.firmware is not None:
sock.sendall(b"F")
send_file(sock, args.firmware[0])
if args.gateware is not None:
sock.sendall(b"G")
send_file(sock, args.gateware[0])
if args.boot:
sock.sendall(b"B")
finally:
sock.close()
if __name__ == "__main__":
main()