find_usb.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/bin/env python3
  2. import os
  3. import sys
  4. import tempfile
  5. import pprint
  6. import serial
  7. import serial.tools.list_ports
  8. import json
  9. from nsdk_utils import *
  10. #from prettytable import PrettyTable
  11. def parse_usbinfo(origin):
  12. bus_splits = origin["bus"].split()
  13. bus, device = bus_splits[1], bus_splits[3].strip(":")
  14. vid = origin["idvendor"].split()[1]
  15. pid = origin["idproduct"].split()[1]
  16. manufact = " ".join(origin["imanufacturer"].split()[2:])
  17. product = " ".join(origin["iproduct"].split()[2:])
  18. if len(origin["iserial"].split()) > 2:
  19. serial = origin["iserial"].split()[2]
  20. else:
  21. serial = ""
  22. return {"bus": bus, "device": device, "pid": pid, "vid": vid, "serial": serial, "manufacturer": manufact, "product": product}
  23. def find_usbinfo():
  24. cmdlog = tempfile.mktemp()
  25. # lsusb may need sudo privilege to get iserial info
  26. os.system("lsusb -v 2>/dev/null | grep -i -E \"^bus |iserial|idvendor|idproduct|imanufacturer|iproduct\" > %s" % (cmdlog))
  27. usb_devices = []
  28. INFOCNT = 6
  29. with open(cmdlog, "r") as cf:
  30. lines = cf.readlines()
  31. for i in range(0, int(len(lines) / INFOCNT)):
  32. bus = lines[i*INFOCNT]
  33. if "Linux Foundation" in bus:
  34. continue
  35. if "VMware, Inc" in bus:
  36. continue
  37. if "VirtualBox" in bus:
  38. continue
  39. bus = bus.lower()
  40. if "future technology" not in bus and "xilinx" not in bus:
  41. continue
  42. try:
  43. origin = {"bus": lines[i*INFOCNT].strip(), "idvendor": lines[i*INFOCNT + 1].strip(), \
  44. "idproduct": lines[i*INFOCNT + 2].strip(), "iserial": lines[i*INFOCNT + 5].strip(), \
  45. "imanufacturer": lines[i*INFOCNT + 3], "iproduct": lines[i*INFOCNT + 4]}
  46. parsed = parse_usbinfo(origin)
  47. device = {"origin": origin, "parsed": parsed}
  48. except:
  49. continue
  50. usb_devices.append(device)
  51. os.remove(cmdlog)
  52. return usb_devices
  53. def find_usb_serport(ser):
  54. comports = serial.tools.list_ports.comports()
  55. serports = []
  56. for port in comports:
  57. cur_serno = port.serial_number
  58. if cur_serno is None:
  59. continue
  60. if cur_serno == ser:
  61. serports.append(port.device)
  62. return serports
  63. def parse_usb_devices():
  64. usb_devices = find_usbinfo()
  65. fpga_devices = find_fpgas()
  66. usb_infos = dict()
  67. fpga_runners = dict()
  68. all_ftdiser = ""
  69. for usb in usb_devices:
  70. parsed = usb["parsed"]
  71. serports = find_usb_serport(parsed["serial"])
  72. parsed["serports"] = serports
  73. loc = "%s:%s" % (parsed["bus"], parsed["device"])
  74. usb_infos[loc] = {"serial": parsed["serial"], \
  75. "serports": serports, \
  76. "pid": parsed["pid"], \
  77. "vid": parsed["vid"], \
  78. "manufacturer": parsed["manufacturer"], \
  79. "product": parsed["product"], \
  80. "info": usb["origin"]["bus"]}
  81. is_fpga = False
  82. for fpga in fpga_devices:
  83. if parsed["serial"] in fpga:
  84. usb_infos[loc]["fpga_serial"] = fpga
  85. usb_infos[loc]["fpga_device"] = fpga_devices[fpga]
  86. is_fpga = True
  87. if is_fpga == False:
  88. if all_ftdiser != "":
  89. all_ftdiser = "%s,%s" % (all_ftdiser, parsed["serial"])
  90. else:
  91. all_ftdiser = parsed["serial"]
  92. # construct fpga runner
  93. index = 0
  94. for fpga in fpga_devices:
  95. fpga_device = fpga_devices[fpga]
  96. if "xc7a200t" in fpga_device:
  97. board = "ddr200t"
  98. elif "xcku060" in fpga_device:
  99. board = "ku060"
  100. elif "vu9p" in fpga_device:
  101. board = "vcu118"
  102. else:
  103. board = fpga_device
  104. key = "%s_%s" % (index, board)
  105. index = index + 1
  106. fpga_runners[key] = {"board_type": board, "fpga_serial": fpga, \
  107. "ftdi_serial": all_ftdiser, "serial_port": None}
  108. fpga_runner_dict = {"fpga_runners": fpga_runners}
  109. return usb_infos, fpga_runner_dict
  110. if __name__ == '__main__':
  111. usb_infos, fpga_runner_dict = parse_usb_devices()
  112. if len(usb_infos) == 0:
  113. print("No usb found, please check!")
  114. sys.exit(1)
  115. # save as json
  116. pprint.pprint(usb_infos)
  117. with open("usb_info.json", "w") as uf:
  118. json.dump(usb_infos, uf, indent=4)
  119. print("Save usb information into usb_info.json")
  120. if len(fpga_runner_dict["fpga_runners"]) == 0:
  121. print("No fpga devices found, please check!")
  122. else:
  123. save_yaml("fpga_runner.yaml", fpga_runner_dict)
  124. print("Save fpga runner information into fpga_runners.yaml")