find_usb.py 4.6 KB

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