From 34052af9db71e5be46f23f812505a6f844e0b88e Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 5 Apr 2019 17:15:55 +0200 Subject: [PATCH] trezorctl: add USB reset command for stuck devices --- trezorctl | 12 ++++++++++++ trezorlib/transport/webusb.py | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/trezorctl b/trezorctl index a447252ba..87b691133 100755 --- a/trezorctl +++ b/trezorctl @@ -774,6 +774,18 @@ def self_test(connect): return debuglink.self_test(connect()) +@cli.command() +def usb_reset(): + """Perform USB reset on a stuck device. + + This can fix LIBUSB_ERROR_PIPE and similar errors when connecting to a device + in a messed state. + """ + from trezorlib.transport.webusb import WebUsbTransport + + WebUsbTransport.enumerate(usb_reset=True) + + # # Basic coin functions # diff --git a/trezorlib/transport/webusb.py b/trezorlib/transport/webusb.py index a4c2840ee..1b168c3df 100644 --- a/trezorlib/transport/webusb.py +++ b/trezorlib/transport/webusb.py @@ -106,7 +106,7 @@ class WebUsbTransport(ProtocolBasedTransport): return "%s:%s" % (self.PATH_PREFIX, dev_to_str(self.device)) @classmethod - def enumerate(cls) -> Iterable["WebUsbTransport"]: + def enumerate(cls, usb_reset=False) -> Iterable["WebUsbTransport"]: if cls.context is None: cls.context = usb1.USBContext() cls.context.open() @@ -128,6 +128,11 @@ class WebUsbTransport(ProtocolBasedTransport): devices.append(WebUsbTransport(dev)) except usb1.USBErrorNotSupported: pass + except usb1.USBErrorPipe: + if usb_reset: + handle = dev.open() + handle.resetDevice() + handle.close() return devices def find_debug(self) -> "WebUsbTransport":