| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/bin/env python3
- import os
- import sys
- import tempfile
- import pprint
- import serial
- import serial.tools.list_ports
- import json
- from nsdk_utils import *
- #from prettytable import PrettyTable
- def parse_usbinfo(origin):
- bus_splits = origin["bus"].split()
- bus, device = bus_splits[1], bus_splits[3].strip(":")
- vid = origin["idvendor"].split()[1]
- pid = origin["idproduct"].split()[1]
- manufact = " ".join(origin["imanufacturer"].split()[2:])
- product = " ".join(origin["iproduct"].split()[2:])
- if len(origin["iserial"].split()) > 2:
- serial = origin["iserial"].split()[2]
- else:
- serial = ""
- return {"bus": bus, "device": device, "pid": pid, "vid": vid, "serial": serial, "manufacturer": manufact, "product": product}
- def find_usbinfo():
- cmdlog = tempfile.mktemp()
- # lsusb may need sudo privilege to get iserial info
- os.system("lsusb -v 2>/dev/null | grep -i -E \"^bus |iserial|idvendor|idproduct|imanufacturer|iproduct\" > %s" % (cmdlog))
- usb_devices = []
- INFOCNT = 6
- with open(cmdlog, "r") as cf:
- lines = cf.readlines()
- for i in range(0, int(len(lines) / INFOCNT)):
- bus = lines[i*INFOCNT]
- if "Linux Foundation" in bus:
- continue
- if "VMware, Inc" in bus:
- continue
- if "VirtualBox" in bus:
- continue
- bus = bus.lower()
- if "future technology" not in bus and "xilinx" not in bus:
- continue
- try:
- origin = {"bus": lines[i*INFOCNT].strip(), "idvendor": lines[i*INFOCNT + 1].strip(), \
- "idproduct": lines[i*INFOCNT + 2].strip(), "iserial": lines[i*INFOCNT + 5].strip(), \
- "imanufacturer": lines[i*INFOCNT + 3], "iproduct": lines[i*INFOCNT + 4]}
- parsed = parse_usbinfo(origin)
- device = {"origin": origin, "parsed": parsed}
- except:
- continue
- usb_devices.append(device)
- os.remove(cmdlog)
- return usb_devices
- def find_usb_serport(ser):
- comports = serial.tools.list_ports.comports()
- serports = []
- for port in comports:
- cur_serno = port.serial_number
- if cur_serno is None:
- continue
- if cur_serno == ser:
- serports.append(port.device)
- return serports
- def parse_usb_devices():
- usb_devices = find_usbinfo()
- fpga_devices = find_fpgas()
- usb_infos = dict()
- fpga_runners = dict()
- all_ftdiser = ""
- for usb in usb_devices:
- parsed = usb["parsed"]
- serports = find_usb_serport(parsed["serial"])
- parsed["serports"] = serports
- loc = "%s:%s" % (parsed["bus"], parsed["device"])
- usb_infos[loc] = {"serial": parsed["serial"], \
- "serports": serports, \
- "pid": parsed["pid"], \
- "vid": parsed["vid"], \
- "manufacturer": parsed["manufacturer"], \
- "product": parsed["product"], \
- "info": usb["origin"]["bus"]}
- is_fpga = False
- for fpga in fpga_devices:
- if parsed["serial"] in fpga:
- usb_infos[loc]["fpga_serial"] = fpga
- usb_infos[loc]["fpga_device"] = fpga_devices[fpga]
- is_fpga = True
- if is_fpga == False:
- if all_ftdiser != "":
- all_ftdiser = "%s,%s" % (all_ftdiser, parsed["serial"])
- else:
- all_ftdiser = parsed["serial"]
- # construct fpga runner
- index = 0
- for fpga in fpga_devices:
- fpga_device = fpga_devices[fpga]
- if "xc7a200t" in fpga_device:
- board = "ddr200t"
- elif "xcku060" in fpga_device:
- board = "ku060"
- elif "vu9p" in fpga_device:
- board = "vcu118"
- else:
- board = fpga_device
- key = "%s_%s" % (index, board)
- index = index + 1
- fpga_runners[key] = {"board_type": board, "fpga_serial": fpga, \
- "ftdi_serial": all_ftdiser, "serial_port": None}
- fpga_runner_dict = {"fpga_runners": fpga_runners}
- return usb_infos, fpga_runner_dict
- if __name__ == '__main__':
- usb_infos, fpga_runner_dict = parse_usb_devices()
- if len(usb_infos) == 0:
- print("No usb found, please check!")
- sys.exit(1)
- # save as json
- pprint.pprint(usb_infos)
- with open("usb_info.json", "w") as uf:
- json.dump(usb_infos, uf, indent=4)
- print("Save usb information into usb_info.json")
- if len(fpga_runner_dict["fpga_runners"]) == 0:
- print("No fpga devices found, please check!")
- else:
- save_yaml("fpga_runner.yaml", fpga_runner_dict)
- print("Save fpga runner information into fpga_runners.yaml")
|