mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-03 20:11:00 +00:00
Reworked HID path handling (to fix Windows issues)
This commit is contained in:
parent
15d8c840b5
commit
a56700a03b
22
cmd.py
22
cmd.py
@ -47,11 +47,16 @@ def get_transport(transport_string, path, **kwargs):
|
||||
|
||||
if path == '':
|
||||
try:
|
||||
path = list_usb()[0]
|
||||
path = list_usb()[0][0]
|
||||
except IndexError:
|
||||
raise Exception("No Trezor found on USB")
|
||||
|
||||
return HidTransport(path, **kwargs)
|
||||
for d in HidTransport.enumerate():
|
||||
# Two-tuple of (normal_interface, debug_interface)
|
||||
if path in d:
|
||||
return HidTransport(d, **kwargs)
|
||||
|
||||
raise Exception("Device not found")
|
||||
|
||||
if transport_string == 'serial':
|
||||
from trezorlib.transport_serial import SerialTransport
|
||||
@ -238,8 +243,7 @@ class Commands(object):
|
||||
|
||||
def list_usb():
|
||||
from trezorlib.transport_hid import HidTransport
|
||||
devices = HidTransport.enumerate()
|
||||
return devices
|
||||
return HidTransport.enumerate()
|
||||
|
||||
class PinMatrixThread(threading.Thread):
|
||||
'''
|
||||
@ -307,19 +311,23 @@ def main():
|
||||
print json.dumps(devices)
|
||||
else:
|
||||
for dev in devices:
|
||||
print dev
|
||||
if dev[1] != None:
|
||||
print "%s - debuglink enabled" % dev[0]
|
||||
else:
|
||||
print dev[0]
|
||||
return
|
||||
|
||||
transport = get_transport(args.transport, args.path)
|
||||
if args.debug:
|
||||
if args.debuglink_transport == 'usb' and args.debuglink_path == '':
|
||||
debuglink_transport = get_transport('usb', args.path, debug_link=True)
|
||||
else:
|
||||
debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path)
|
||||
debuglink_transport = get_transport(args.debuglink_transport,
|
||||
args.debuglink_path, debug_link=True)
|
||||
debuglink = DebugLink(debuglink_transport)
|
||||
else:
|
||||
debuglink = None
|
||||
|
||||
transport = get_transport(args.transport, args.path)
|
||||
client = TrezorClient(transport, pin_func=qt_pin_func, debuglink=debuglink)
|
||||
client.setup_debuglink(button=True, pin_correct=True)
|
||||
cmds = Commands(client)
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
import hid
|
||||
import time
|
||||
import platform
|
||||
from transport import Transport, NotImplementedException
|
||||
|
||||
DEVICE_IDS = [
|
||||
@ -21,26 +22,49 @@ class HidTransport(Transport):
|
||||
def __init__(self, device, *args, **kwargs):
|
||||
self.hid = None
|
||||
self.buffer = ''
|
||||
if bool(kwargs.get('debug_link')):
|
||||
device = device[:-2] + '01'
|
||||
device = device[int(bool(kwargs.get('debug_link')))]
|
||||
super(HidTransport, self).__init__(device, *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def _detect_debuglink(cls, path):
|
||||
# Takes platform-specific path of USB and
|
||||
# decide if the HID interface is normal transport
|
||||
# or debuglink
|
||||
|
||||
if platform.system() in ('Linux', 'Darwin'):
|
||||
# Sample: 0003:0017:00
|
||||
if path.endswith(':00'):
|
||||
return False
|
||||
return True
|
||||
|
||||
elif platform.system() == 'Windows':
|
||||
# Sample: \\\\?\\hid#vid_534c&pid_0001&mi_01#7&1d71791f&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
|
||||
# Note: 'mi' parameter is optional and might be unset
|
||||
if '&mi_01#' in path: # ,,,<o.O>,,,~
|
||||
return True
|
||||
return False
|
||||
|
||||
else:
|
||||
raise Exception("USB interface detection not implemented for %s" % platform.system())
|
||||
|
||||
@classmethod
|
||||
def enumerate(cls):
|
||||
devices = []
|
||||
devices = {}
|
||||
for d in hid.enumerate(0, 0):
|
||||
vendor_id = d.get('vendor_id')
|
||||
product_id = d.get('product_id')
|
||||
path = d.get('path')
|
||||
vendor_id = d['vendor_id']
|
||||
product_id = d['product_id']
|
||||
serial_number = d['serial_number']
|
||||
path = d['path']
|
||||
|
||||
if (vendor_id, product_id) in DEVICE_IDS and path.endswith(':00'):
|
||||
devices.append(path)
|
||||
if (vendor_id, product_id) in DEVICE_IDS:
|
||||
devices.setdefault(serial_number, [None, None])
|
||||
devices[serial_number][int(bool(cls._detect_debuglink(path)))] = path
|
||||
|
||||
return devices
|
||||
# List of two-tuples (path_normal, path_debuglink)
|
||||
return devices.values()
|
||||
|
||||
def _open(self):
|
||||
self.buffer = ''
|
||||
print self.device
|
||||
self.hid = hid.device()
|
||||
self.hid.open_path(self.device)
|
||||
self.hid.set_nonblocking(True)
|
||||
|
Loading…
Reference in New Issue
Block a user