clean up port autodetection

This commit is contained in:
Fischer Moseley 2023-03-23 22:27:51 -04:00
parent a562c8136c
commit c4b6358537
2 changed files with 12 additions and 41 deletions

View File

@ -21,11 +21,6 @@
- write tests - write tests
- write interface - write interface
## Python API
- make finding a serial port possible even if no cores are configured
- make autodetecting and automatically selecting a serial device possible
- if we see a FT2232 on the device we should grab it
## Documentation ## Documentation
- Write out what bus transactions look like and how messages get passed. probably going to need wavedrom for this. - Write out what bus transactions look like and how messages get passed. probably going to need wavedrom for this.

View File

@ -46,38 +46,24 @@ class UARTInterface:
self.ser = serial.Serial(self.port, self.baudrate) self.ser = serial.Serial(self.port, self.baudrate)
def autodetect_port(self): def autodetect_port(self):
# TODO: clean all of this up - it's a little gross and inflexible
# as far as I know the FT2232 is the only chip used on the icestick/digilent boards, so just look for that # as far as I know the FT2232 is the only chip used on the icestick/digilent boards, so just look for that
known_devices = [{
"name": "FT2232",
"vid": 0x403,
"pid": 0x6010
}]
import serial.tools.list_ports import serial.tools.list_ports
recognized_devices = [] recognized_devices = []
for port in serial.tools.list_ports.comports(): for port in serial.tools.list_ports.comports():
for device in known_devices: if (port.vid == 0x403) and (port.pid == 0x6010):
if (port.vid == device["vid"]) and (port.pid == device["pid"]): recognized_devices.append(port)
recognized_devices.append(port)
assert len(recognized_devices) == 2, f"Expected to recognize two ports (one for bitstream upload over JTAG, another for UART). Instead recognized {len(recognized_devices)} ports. Which device to select is unknown." assert len(recognized_devices) == 2, f"Expected to see two serial ports for FT2232 device, but instead see {len(recognized_devices)}."
largest_location_device = None
largest_location = 0
for device in recognized_devices:
location = device.hwid.split("LOCATION=")[-1]
location = location.replace("-","")
location = location.replace(":","")
location = location.replace(".","")
location = int(location)
if location > largest_location: # board manufacturers seem to always make the 0th serial
largest_location = location # interface on the FT2232 be for programming over JTAG,
largest_location_device = device # and then the 1st to be for UART. as a result, we always
# grab the device with the larger location
return largest_location_device.device rd = recognized_devices
return rd[0].device if rd[0].location > rd[1].location else rd[1].device
def read_register(self, addr): def read_register(self, addr):
# request from the bus # request from the bus
@ -608,7 +594,7 @@ class Manta:
assert len(config["cores"]) > 0, "Must specify at least one core." assert len(config["cores"]) > 0, "Must specify at least one core."
# add cores to self # add cores to self
base_addr = 0 # TODO: implement address assignment base_addr = 0
self.cores = [] self.cores = []
for i, core_name in enumerate(config["cores"]): for i, core_name in enumerate(config["cores"]):
core = config["cores"][core_name] core = config["cores"][core_name]
@ -938,21 +924,11 @@ def main():
Supported commands: Supported commands:
gen [config file] generate the core specified in the config file gen [config file] generate the core specified in the config file
run [config file] run the core specified in the config file run [config file] run the core specified in the config file
terminal [config file] present a minicom-like serial terminal with the UART settings in the config file
ports list all available serial ports ports list all available serial ports
help, ray display this splash screen (hehe...splash screen) help, ray display this splash screen (hehe...splash screen)
""" """
) )
# open minicom-like serial terminal with given config
elif argv[1] == "terminal":
assert len(argv) == 3, "Not enough (or too many) config files specified."
# TODO: make this work with a looser config file - it should work as long as it has a uart definition
manta = Manta(argv[2])
raise NotImplementedError("Miniterm console is still under development!")
# list available serial ports # list available serial ports
elif argv[1] == "ports": elif argv[1] == "ports":
import serial.tools.list_ports import serial.tools.list_ports