mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
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
221 lines
7.4 KiB
Python
Executable file
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()
|