uhd/host/utils/latency/pci_hwdata.py
Martin Braun 1bba62a75a Remove remaining Python 2 references
This changes two things in all applicable files:
- Remove imports from __future__
- Change default shebangs from /usr/bin/env python to /usr/bin/env
  python3
2020-05-07 15:10:41 -05:00

221 lines
7.4 KiB
Python
Executable file

#!/usr/bin/env python3
#
# Copyright 2013 Ettus Research LLC
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This script exists for convenience. Run it once to get your hardware info.
# Save the created files in the directory where you execute your tests.
import os
import netifaces
from netifaces import AF_INET
from optparse import OptionParser
try:
from gnuradio import uhd
except:
print "Can't gather USRP info! gr-uhd not found."
# If other paths for this file are known, add them to this list.
pci_hwdata_paths = ["/usr/share/hwdata/pci.ids", "/usr/share/misc/pci.ids"]
def main():
# Just get the file name, where results are supposed to be stored.
usage = "%prog: [savefile]"
parser = OptionParser(usage=usage)
parser.add_option("", "--file", type="string", help="file to save results. [default=%default]", default="usrps_info.txt")
(options, args) = parser.parse_args()
eths_ids = get_eths_with_ids()
for eth in eths_ids:
print eth
save_eth_ids_info_to_file(eths_ids, options.file)
usrps = []
try:
usrps = get_usrps_with_device_info()
for usrp in usrps:
print usrp
except Exception as e:
print "Can't gather USRP info!"
print e.message,
try:
save_usrp_info(usrps, options.file)
except Exception as e:
print "Can't save USRP info!"
print e.message
def get_eths_with_ids():
eths = get_eth_interface_with_address()
eths_ids = []
for eth in eths:
vd_id = get_vendor_device_id(eth['interface'])
vd_string = get_pci_string_from_id(vd_id)
vendor = {'id': vd_id['vendor'], 'name': vd_string['vendor']}
device = {'id': vd_id['device'], 'name': vd_string['device']}
phys = {'vendor': vendor, 'device': device}
eth['physical'] = phys
eths_ids.append(eth)
return eths_ids
def get_eth_interface_with_address():
eths = []
for iface in netifaces.interfaces():
if iface.find("eth") == 0:
ips = netifaces.ifaddresses(iface).get(netifaces.AF_INET)
macs = netifaces.ifaddresses(iface).get(netifaces.AF_PACKET)
if ips and macs:
for ip, mac in zip(ips, macs):
eths.append({'interface': iface, 'addr': ip['addr'], 'mac': mac['addr']})
if not eths:
print "Can't gather Ethernet info. Check if a network based USRP is connected to host and responding to \'uhd_find_devices\'"
return eths
def get_usrps_with_device_info():
devs = uhd.find_devices()
devs_infos = []
eths_ids = get_eths_with_ids()
for dev in devs:
if dev['addr']:
ridx = dev['addr'].rfind('.')
net = dev['addr'][0:ridx + 1]
for eth in eths_ids:
if eth['addr'].startswith(net):
dev_info = {'type': dev['type'], 'addr': dev['addr'], 'name': dev['name'], 'serial': dev['serial'],
'host': eth}
devs_infos.append(dev_info)
return devs_infos
def save_usrp_info(usrps, filename):
if not usrps:
print "No USRP data available. Not saving any data."
return
with open(filename, 'w') as f:
if f.closed:
print "Warning: Couldn't open", filename, "to save results."
f.write("#\n")
f.write("#\n")
f.write("# This file contains gathered information about USRPs connected to the host\n")
f.write("#\n")
count = 0
for usrp in usrps:
f.write("\n## USRP Device " + str(count) + "\n")
f.write("type: " + usrp['type'] + "\n")
f.write("address: " + usrp['addr'] + "\n")
f.write("name: " + usrp['name'] + "\n")
f.write("serial: " + usrp['serial'] + "\n")
f.write("host\n")
f.write("\t" + usrp['host']['interface'] + "\n")
f.write("\t" + usrp['host']['addr'] + "\n")
f.write("\t" + usrp['host']['mac'] + "\n")
f.write("\t\tphysical port info\n")
f.write("\t\t\t" + usrp['host']['physical']['vendor']['id'] + " " + usrp['host']['physical']['vendor'][
'name'] + "\n")
f.write("\t\t\t" + usrp['host']['physical']['device']['id'] + " " + usrp['host']['physical']['device'][
'name'] + "\n")
f.write("## End USRP Device " + str(count) + "\n\n")
count += 1
def save_eth_ids_info_to_file(eths, filename):
with open(filename, 'w') as f:
if f.closed:
print "Warning: Couldn't open", filename, "to save results."
f.write("#\n")
f.write("#\n")
f.write("# This file contains infos about the available eth interfaces\n")
f.write("#\n")
#print eths
count = 0
for eth in eths:
f.write("\n## ETH Interface " + str(count) + "\n")
f.write(eth['interface'] + "\n")
f.write("\tip " + eth['addr'] + "\n")
f.write("\tmac " + eth['mac'] + "\n")
f.write("phys_port_info\n")
f.write("\t\tvendor " + eth['physical']['vendor']['id'] + " " + eth['physical']['vendor']['name'] + "\n")
f.write("\t\tdevice " + eth['physical']['device']['id'] + " " + eth['physical']['device']['name'] + "\n")
f.write("## End ETH Interface " + str(count) + "\n\n")
count += 1
def get_vendor_device_id(eth):
path = "/sys/class/net/" + eth + "/device/"
vendor_id = get_id(path + "vendor")
device_id = get_id(path + "device")
return {'vendor': vendor_id, 'device': device_id}
def get_id(path):
gid = 0
with open(path, 'r') as f:
if f.closed:
print "Warning: Couldn't open", path, "to gather device information."
data = f.read()
gid = data[0:-1]
return gid
def get_pci_string_from_id(vid):
vendors = get_vendors()
vendor_id = vid['vendor'][2:]
device_id = vid['device'][2:]
vendor = vendors[vendor_id]['vendor']
device = vendors[vendor_id]['devices'][device_id]
return {'vendor': vendor, 'device': device}
_g_vendors = {}
def get_vendors():
global _g_vendors
if len(_g_vendors) > 0:
return _g_vendors
path = ""
vendors = {}
# Check for possible locations of pci.ids on the system.
for pci_path in pci_hwdata_paths:
if os.path.isfile(pci_path):
path = pci_path
break
if path == "":
print "Couldn't find pci.ids file. Vendor data not available!"
return vendors
vendor_id = ''
with open(path, 'r') as f:
if f.closed:
print "Warning: Couldn't open", path, ". Vendor data not available."
for line in f.readlines():
if line.startswith("#"):
if line.startswith("# List of known device classes"):
break
else:
continue
l = line.split()
if len(l) > 1 and not line.startswith("\t"):
vendor_id = l[0]
vendor = " ".join(l[1:])
vendors[vendor_id] = {'vendor': vendor, 'devices': {}}
if len(l) > 1 and line.startswith("\t") and not line.startswith("\t\t"):
device_id = l[0]
device = " ".join(l[1:])
vendors[vendor_id]['devices'][device_id] = device
_g_vendors = vendors
return vendors
if __name__ == '__main__':
main()