From 7e3ea58a1b5c50d15b39a83d2aa3ecb98830e381 Mon Sep 17 00:00:00 2001 From: John Kelley Date: Fri, 25 Aug 2017 01:06:32 -0700 Subject: [PATCH 1/3] Replace shelling out to fxload with CypressFX.FX2 calls --- Makefile | 1 + hdmi2usb/modeswitch/boards.py | 32 ++++++++++++++------------------ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 3bfe90b..75c6a90 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ conda: conda config --add channels timvideos conda install openocd pip install pyusb + pip install git+https://github.com/John-K/CypressFX.git pip install pep8 pip install autopep8 pip install setuptools-pep8 diff --git a/hdmi2usb/modeswitch/boards.py b/hdmi2usb/modeswitch/boards.py index 5913ec9..7940560 100644 --- a/hdmi2usb/modeswitch/boards.py +++ b/hdmi2usb/modeswitch/boards.py @@ -21,6 +21,7 @@ from . import lsusb as usbapi from . import files +from CypressFX import FX2 def assert_in(needle, haystack): @@ -122,27 +123,22 @@ def load_fx2(board, mode=None, filename=None, verbose=False): sys.stderr.write("Using FX2 firmware %s\n" % filename) - cmdline = "fxload -t fx2lp".split() - cmdline += ["-D", str(board.dev.path)] - cmdline += ["-I", filepath] - if verbose: - cmdline += ["-v", ] - - if verbose: - sys.stderr.write("Running %r\n" % " ".join(cmdline)) - - env = os.environ.copy() - env['PATH'] = env['PATH'] + ':/usr/sbin:/sbin' + fx2 = FX2(board.dev) + if not fx2: + print("Could not intantiate FX2 from {}".format(board.dev._str())) + raise try: - output = subprocess.check_output( - cmdline, stderr=subprocess.STDOUT, env=env) - if verbose > 2: - sys.stderr.write(output.decode('utf-8')) - except subprocess.CalledProcessError as e: - if b"can't modify CPUCS: Protocol error\n" not in e.output: - print(e.output) + bytes_programmed = fx2.load_intelhex_firmware(filepath) + if bytes_programmed < 1: + print("Was unable to program any bytes to {}".format( + board.dev._str())) raise + if verbose > 2: + print("Programmed {} bytes".format(bytes_programmed)) + except IOError as e: + print(e.args[-1]) + raise def flash_fx2(board, filename, verbose=False): From d7927b8393f9dd68656582627f4d5d39b5cbdfbf Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Sun, 27 Aug 2017 15:11:01 +1000 Subject: [PATCH 2/3] Fixing libusb device usage. --- hdmi2usb/modeswitch/boards.py | 4 ++-- hdmi2usb/modeswitch/libusb.py | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hdmi2usb/modeswitch/boards.py b/hdmi2usb/modeswitch/boards.py index 7940560..edcdf16 100644 --- a/hdmi2usb/modeswitch/boards.py +++ b/hdmi2usb/modeswitch/boards.py @@ -19,7 +19,7 @@ from collections import namedtuple -from . import lsusb as usbapi +from . import libusb as usbapi from . import files from CypressFX import FX2 @@ -123,7 +123,7 @@ def load_fx2(board, mode=None, filename=None, verbose=False): sys.stderr.write("Using FX2 firmware %s\n" % filename) - fx2 = FX2(board.dev) + fx2 = FX2(board.dev.libusb_open()) if not fx2: print("Could not intantiate FX2 from {}".format(board.dev._str())) raise diff --git a/hdmi2usb/modeswitch/libusb.py b/hdmi2usb/modeswitch/libusb.py index 2a31b6b..af290fa 100644 --- a/hdmi2usb/modeswitch/libusb.py +++ b/hdmi2usb/modeswitch/libusb.py @@ -21,8 +21,7 @@ class LibDevice(DeviceBase): def inuse(self, dev=None): try: if dev is None: - dev = usb.core.find(bus=self.path.bus, - address=self.path.address) + dev = self.libusb_open() # config = dev.get_active_configuration() active = False @@ -37,7 +36,7 @@ def inuse(self, dev=None): def detach(self): # Detach any driver currently attached. - dev = usb.core.find(bus=self.path.bus, address=self.path.address) + dev = self.libusb_open() if not self.inuse(dev): return True @@ -47,6 +46,9 @@ def detach(self): if dev.is_kernel_driver_active(inf.bInterfaceNumber): dev.detach_kernel_driver(inf.bInterfaceNumber) + def libusb_open(self): + return usb.core.find(bus=self.path.bus, address=self.path.address) + Device = LibDevice From 599f06ec6135854af13624026a55338db0c4edb4 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Sun, 27 Aug 2017 16:01:28 +1000 Subject: [PATCH 3/3] Little fixes of libusb mode. --- hdmi2usb/modeswitch/boards.py | 5 ++++- hdmi2usb/modeswitch/cli.py | 2 +- hdmi2usb/modeswitch/libusb.py | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/hdmi2usb/modeswitch/boards.py b/hdmi2usb/modeswitch/boards.py index edcdf16..6c59df0 100644 --- a/hdmi2usb/modeswitch/boards.py +++ b/hdmi2usb/modeswitch/boards.py @@ -104,7 +104,10 @@ def firmware_path(filepath): class Board(BoardBase): def tty(self): - return self.dev.tty() + try: + return self.dev.tty() + except AttributeError: + return None def load_fx2(board, mode=None, filename=None, verbose=False): diff --git a/hdmi2usb/modeswitch/cli.py b/hdmi2usb/modeswitch/cli.py index a58fc4f..0346a14 100644 --- a/hdmi2usb/modeswitch/cli.py +++ b/hdmi2usb/modeswitch/cli.py @@ -179,7 +179,7 @@ def find_boards(args): board.state, board.dev.path, )) - for sp in board.dev.syspaths: + for sp in getattr(board.dev, "syspaths", []): sys.stderr.write(" %s\n" % (sp,)) if board.dev.inuse(): diff --git a/hdmi2usb/modeswitch/libusb.py b/hdmi2usb/modeswitch/libusb.py index af290fa..1d1f2b7 100644 --- a/hdmi2usb/modeswitch/libusb.py +++ b/hdmi2usb/modeswitch/libusb.py @@ -46,6 +46,12 @@ def detach(self): if dev.is_kernel_driver_active(inf.bInterfaceNumber): dev.detach_kernel_driver(inf.bInterfaceNumber) + def drivers(self): + if self.inuse(): + return ["unknown"] + else: + return [] + def libusb_open(self): return usb.core.find(bus=self.path.bus, address=self.path.address)