def get_port_by_uuid(device, uuid): ports = get_ports(device) + get_ports("1209:2100") for port in ports: try: with port: p = TinyProg(port) if p.meta.uuid().startswith(uuid): return port except Exception: pass return None
def main(): parser = argparse.ArgumentParser() parser.add_argument('--verbose', '-v', action='store_true', help='Show debug port bytes in hex from USB serial') args = parser.parse_args() ports = tinyprog.get_ports(USB_ID) print(f'Found {len(ports)} serial port(s)') if not ports: return if len(ports) > 1: print('NOTE: Using first port') port = ports[0] read_loop = _read_loop(port, verbose=args.verbose) # Initialize read loop to accept ch next(read_loop) write_loop = _write_loop(port) print('===BEGIN SERIAL OUTPUT===') with port: try: while True: next(write_loop) ch = _align_serial_reads(port) cycle_count, cycle_output = read_loop.send(ch) if cycle_output is not None: # Cycle output is None if it is the same cycle as last time parse_cycle_output(cycle_count, cycle_output) except KeyboardInterrupt: print('Got KeyboardInterrupt. Exiting...') except serial.serialutil.SerialException as exc: print(f'ERROR: Serial connection threw error: {exc}')
def check_for_wrong_tinyfpga_bx_vidpid(): """ Some of the TinyFPGA BX boards have the wrong USB VID:PID. This function looks for such boards. """ boards_needing_update = [] ports = get_ports("1209:2100") for port in ports: with port: p = TinyProg(port) m = p.meta.root if m[u"boardmeta"][u"name"] == u"TinyFPGA BX": boards_needing_update.append(port) return boards_needing_update
import tinyprog import usb import sys ports = tinyprog.get_ports("1d50:6130") errors = 0 lastcycle = 0 ## Adjust this number to be the number of debug bytes debugbytes = 8 print(ports) for port in ports: with port: wch = 0 while True: ### Just demonstrate how to write stuff back, if you want try: port.write([wch]) wch = wch + 1 if (wch > 10): wch = 0 except: errors = errors + 1 try: ch = port.read(1) while int(ch[0]) != 255: # sys.stdout.write(hex(ch[0]))
def main(): def parse_int(str_value): str_value = str_value.strip().lower() if str_value.startswith("0x"): return int(str_value[2:], 16) else: return int(str_value) parser = argparse.ArgumentParser() parser.add_argument("--version", action="store_true", help="Print the tinyprog version.") parser.add_argument("-l", "--list", action="store_true", help="list connected and active FPGA boards") parser.add_argument( "-p", "--program", type=str, help="program FPGA board with the given user bitstream") parser.add_argument("-u", "--program-userdata", type=str, help="program FPGA board with the given user data") parser.add_argument( "--program-image", type=str, help="program FPGA board with a combined user bitstream and data") parser.add_argument("-b", "--boot", action="store_true", help="command the FPGA board to exit the " "bootloader and load the user configuration") parser.add_argument("-c", "--com", type=str, help="serial port name") parser.add_argument("-i", "--id", type=str, help="FPGA board ID") parser.add_argument( "-d", "--device", type=str, default="1d50:6130", help="device id (vendor:product); default is (1d50:6130)") parser.add_argument("-a", "--addr", type=str, help="force the address to write the bitstream to") parser.add_argument( "-m", "--meta", action="store_true", help="dump out the metadata for all connected boards in JSON") parser.add_argument( "--security", type=str, help="update the security page in the flash at address addr") parser.add_argument( "--update-bootloader", action="store_true", help="check for new bootloader and update eligible connected boards") parser.add_argument("--libusb", action="store_true", help="""\ try using libusb to connect to boards without a serial driver attached""") parser.add_argument("--pyserial", action="store_true", help="use pyserial to connect to boards") args = parser.parse_args() if args.version: print("tinyprog %s (%s)" % (tinyprog.__version__, tinyprog.__full_version__)) sys.exit(0) device = args.device.lower().replace(':', '') if len(device) != 8 or not all(c in '0123456789abcdef' for c in device): print(" Invalid device id, use format vendor:product") sys.exit(1) device = '{}:{}'.format(device[:4], device[4:]) tinyprog.use_libusb = args.libusb tinyprog.use_pyserial = args.pyserial try: active_boards = get_ports(device) + get_ports("1209:2100") if args.meta: meta = [] for port in active_boards: with port: p = TinyProg(port) m = p.meta.root m["port"] = str(port) meta.append(m) print(json.dumps(meta, indent=2)) sys.exit(0) print("") print(" TinyProg CLI") print(" ------------") print(" Using device id {}".format(device)) # find port to use active_port = None if args.com is not None: active_port = tinyprog.SerialPort(args.com) elif args.id is not None: active_port = get_port_by_uuid(device, args.id) elif not active_boards: print("""\ No port was specified and no active bootloaders found. Activate bootloader by pressing the reset button. """) sys.exit(1) elif len(active_boards) == 1: print("""\ Only one board with active bootloader, using it. """) active_port = active_boards[0] else: print("""\ Please choose a board with the -c or -i option. Using first board in list. """) active_port = active_boards[0] # list boards if args.list or active_port is None: print(" Boards with active bootloaders:") for port in active_boards: with port: p = TinyProg(port) m = p.meta.root print_board(port, m) if len(active_boards) == 0: print("""\ No active bootloaders found. Check USB connections and press reset button to activate bootloader.""") if args.update_bootloader: boards_needing_update = (check_for_wrong_tinyfpga_bx_vidpid() + check_for_new_bootloader()) if len(boards_needing_update) == 0: print("""\ All connected and active boards are up to date!""") else: for port in boards_needing_update: perform_bootloader_update(port) # program the flash memory if (args.program is not None) or (args.program_userdata is not None) or ( args.security is not None) or (args.program_image is not None): boot_fpga = False def progress(info): if isinstance(info, str): print(" " + str(info)) with active_port: fpga = TinyProg(active_port, progress) force = False if args.program is not None: print(" Programming %s with %s" % (active_port, args.program)) bitstream = fpga.slurp(args.program) if args.addr is not None: addr = parse_int(args.addr) force = True else: addr = fpga.meta.userimage_addr_range()[0] if addr < 0: print(" Negative write addr: {}".format(addr)) sys.exit(1) if not fpga.is_bootloader_active(): print(" Bootloader not active") sys.exit(1) if force or check_if_overwrite_bootloader( addr, len(bitstream), fpga.meta.userimage_addr_range()): boot_fpga = True print(" Programming at addr {:06x}".format(addr)) if not fpga.program_bitstream(addr, bitstream): sys.exit(1) # program user flash area if args.program_userdata is not None: print(" Programming %s with %s" % (active_port, args.program_userdata)) bitstream = fpga.slurp(args.program_userdata) if args.addr is not None: addr = parse_int(args.addr) force = True else: addr = fpga.meta.userdata_addr_range()[0] if addr < 0: print(" Negative write addr: {}".format(addr)) sys.exit(1) if not fpga.is_bootloader_active(): print(" Bootloader not active") sys.exit(1) if force or check_if_overwrite_bootloader( addr, len(bitstream), fpga.meta.userdata_addr_range()): boot_fpga = True print(" Programming at addr {:06x}".format(addr)) if not fpga.program_bitstream(addr, bitstream): sys.exit(1) # program user image and data area if args.program_image is not None: print(" Programming %s with %s" % (active_port, args.program_image)) bitstream = fpga.slurp(args.program_image) if args.addr is not None: addr = parse_int(args.addr) force = True else: addr = fpga.meta.userimage_addr_range()[0] if addr < 0: print(" Negative write addr: {}".format(addr)) sys.exit(1) if not fpga.is_bootloader_active(): print(" Bootloader not active") sys.exit(1) if force or check_if_overwrite_bootloader( addr, len(bitstream), (fpga.meta.userimage_addr_range()[0], fpga.meta.userdata_addr_range()[1])): boot_fpga = True print(" Programming at addr {:06x}".format(addr)) if not fpga.program_bitstream(addr, bitstream): sys.exit(1) if args.security is not None: print(" Programming %s security page with %s" % (active_port, args.security)) data = open(args.security, 'rb').read() if args.addr is not None: addr = parse_int(args.addr) else: addr = 1 if addr < 0: print(" Negative write addr: {}".format(addr)) sys.exit(1) if not fpga.is_bootloader_active(): print(" Bootloader not active") sys.exit(1) if not fpga.program_security_page(addr, data): sys.exit(1) if boot_fpga: fpga.boot() print("") sys.exit(0) # boot the FPGA if args.boot: print(" Booting " + str(active_port)) with active_port: fpga = TinyProg(active_port) fpga.boot() except PortError as e: print(str(e), file=sys.stderr) sys.exit(1) print("")