| Index: tools/telemetry/third_party/pyserial/serial/tools/list_ports_linux.py
|
| diff --git a/tools/telemetry/third_party/pyserial/serial/tools/list_ports_linux.py b/tools/telemetry/third_party/pyserial/serial/tools/list_ports_linux.py
|
| deleted file mode 100755
|
| index ecfd158bab7862a50de2120654ccc3022dc8c348..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/pyserial/serial/tools/list_ports_linux.py
|
| +++ /dev/null
|
| @@ -1,151 +0,0 @@
|
| -#!/usr/bin/env python
|
| -
|
| -# portable serial port access with python
|
| -#
|
| -# This is a module that gathers a list of serial ports including details on
|
| -# GNU/Linux systems
|
| -#
|
| -# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
|
| -# this is distributed under a free software license, see license.txt
|
| -
|
| -import glob
|
| -import sys
|
| -import os
|
| -import re
|
| -
|
| -try:
|
| - import subprocess
|
| -except ImportError:
|
| - def popen(argv):
|
| - try:
|
| - si, so = os.popen4(' '.join(argv))
|
| - return so.read().strip()
|
| - except:
|
| - raise IOError('lsusb failed')
|
| -else:
|
| - def popen(argv):
|
| - try:
|
| - return subprocess.check_output(argv, stderr=subprocess.STDOUT).strip()
|
| - except:
|
| - raise IOError('lsusb failed')
|
| -
|
| -
|
| -# The comports function is expected to return an iterable that yields tuples of
|
| -# 3 strings: port name, human readable description and a hardware ID.
|
| -#
|
| -# as currently no method is known to get the second two strings easily, they
|
| -# are currently just identical to the port name.
|
| -
|
| -# try to detect the OS so that a device can be selected...
|
| -plat = sys.platform.lower()
|
| -
|
| -def read_line(filename):
|
| - """help function to read a single line from a file. returns none"""
|
| - try:
|
| - f = open(filename)
|
| - line = f.readline().strip()
|
| - f.close()
|
| - return line
|
| - except IOError:
|
| - return None
|
| -
|
| -def re_group(regexp, text):
|
| - """search for regexp in text, return 1st group on match"""
|
| - if sys.version < '3':
|
| - m = re.search(regexp, text)
|
| - else:
|
| - # text is bytes-like
|
| - m = re.search(regexp, text.decode('ascii', 'replace'))
|
| - if m: return m.group(1)
|
| -
|
| -
|
| -# try to extract descriptions from sysfs. this was done by experimenting,
|
| -# no guarantee that it works for all devices or in the future...
|
| -
|
| -def usb_sysfs_hw_string(sysfs_path):
|
| - """given a path to a usb device in sysfs, return a string describing it"""
|
| - bus, dev = os.path.basename(os.path.realpath(sysfs_path)).split('-')
|
| - snr = read_line(sysfs_path+'/serial')
|
| - if snr:
|
| - snr_txt = ' SNR=%s' % (snr,)
|
| - else:
|
| - snr_txt = ''
|
| - return 'USB VID:PID=%s:%s%s' % (
|
| - read_line(sysfs_path+'/idVendor'),
|
| - read_line(sysfs_path+'/idProduct'),
|
| - snr_txt
|
| - )
|
| -
|
| -def usb_lsusb_string(sysfs_path):
|
| - base = os.path.basename(os.path.realpath(sysfs_path))
|
| - bus = base.split('-')[0]
|
| - try:
|
| - dev = int(read_line(os.path.join(sysfs_path, 'devnum')))
|
| - desc = popen(['lsusb', '-v', '-s', '%s:%s' % (bus, dev)])
|
| - # descriptions from device
|
| - iManufacturer = re_group('iManufacturer\s+\w+ (.+)', desc)
|
| - iProduct = re_group('iProduct\s+\w+ (.+)', desc)
|
| - iSerial = re_group('iSerial\s+\w+ (.+)', desc) or ''
|
| - # descriptions from kernel
|
| - idVendor = re_group('idVendor\s+0x\w+ (.+)', desc)
|
| - idProduct = re_group('idProduct\s+0x\w+ (.+)', desc)
|
| - # create descriptions. prefer text from device, fall back to the others
|
| - return '%s %s %s' % (iManufacturer or idVendor, iProduct or idProduct, iSerial)
|
| - except IOError:
|
| - return base
|
| -
|
| -def describe(device):
|
| - """\
|
| - Get a human readable description.
|
| - For USB-Serial devices try to run lsusb to get a human readable description.
|
| - For USB-CDC devices read the description from sysfs.
|
| - """
|
| - base = os.path.basename(device)
|
| - # USB-Serial devices
|
| - sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
|
| - if os.path.exists(sys_dev_path):
|
| - sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
|
| - return usb_lsusb_string(sys_usb)
|
| - # USB-CDC devices
|
| - sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,)
|
| - if os.path.exists(sys_dev_path):
|
| - return read_line(sys_dev_path)
|
| -
|
| - # USB Product Information
|
| - sys_dev_path = '/sys/class/tty/%s/device' % (base,)
|
| - if os.path.exists(sys_dev_path):
|
| - product_name_file = os.path.dirname(os.path.realpath(sys_dev_path)) + "/product"
|
| - if os.path.exists(product_name_file):
|
| - return read_line(product_name_file)
|
| -
|
| - return base
|
| -
|
| -def hwinfo(device):
|
| - """Try to get a HW identification using sysfs"""
|
| - base = os.path.basename(device)
|
| - if os.path.exists('/sys/class/tty/%s/device' % (base,)):
|
| - # PCI based devices
|
| - sys_id_path = '/sys/class/tty/%s/device/id' % (base,)
|
| - if os.path.exists(sys_id_path):
|
| - return read_line(sys_id_path)
|
| - # USB-Serial devices
|
| - sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
|
| - if os.path.exists(sys_dev_path):
|
| - sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
|
| - return usb_sysfs_hw_string(sys_usb)
|
| - # USB-CDC devices
|
| - if base.startswith('ttyACM'):
|
| - sys_dev_path = '/sys/class/tty/%s/device' % (base,)
|
| - if os.path.exists(sys_dev_path):
|
| - return usb_sysfs_hw_string(sys_dev_path + '/..')
|
| - return 'n/a' # XXX directly remove these from the list?
|
| -
|
| -def comports():
|
| - devices = glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*')
|
| - return [(d, describe(d), hwinfo(d)) for d in devices]
|
| -
|
| -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| -# test
|
| -if __name__ == '__main__':
|
| - for port, desc, hwid in sorted(comports()):
|
| - print "%s: %s [%s]" % (port, desc, hwid)
|
|
|