udev: use HID_PHYS instead of HID_UNIQ to look for relevant child nodes
This commit is contained in:
parent
535b1f02ce
commit
fe55e39560
|
|
@ -22,6 +22,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera
|
||||||
|
|
||||||
from hidapi.udev import close # noqa: F401
|
from hidapi.udev import close # noqa: F401
|
||||||
from hidapi.udev import enumerate # noqa: F401
|
from hidapi.udev import enumerate # noqa: F401
|
||||||
|
from hidapi.udev import find_paired_node # noqa: F401
|
||||||
from hidapi.udev import get_manufacturer # noqa: F401
|
from hidapi.udev import get_manufacturer # noqa: F401
|
||||||
from hidapi.udev import get_product # noqa: F401
|
from hidapi.udev import get_product # noqa: F401
|
||||||
from hidapi.udev import get_serial # noqa: F401
|
from hidapi.udev import get_serial # noqa: F401
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ DeviceInfo = namedtuple(
|
||||||
'vendor_id',
|
'vendor_id',
|
||||||
'product_id',
|
'product_id',
|
||||||
'serial',
|
'serial',
|
||||||
|
'phys',
|
||||||
'release',
|
'release',
|
||||||
'manufacturer',
|
'manufacturer',
|
||||||
'product',
|
'product',
|
||||||
|
|
@ -127,6 +128,7 @@ def _match(action, device, filter):
|
||||||
path=device.device_node,
|
path=device.device_node,
|
||||||
vendor_id=vid[-4:],
|
vendor_id=vid[-4:],
|
||||||
product_id=pid[-4:],
|
product_id=pid[-4:],
|
||||||
|
phys=hid_device.get('HID_PHYS'),
|
||||||
serial=hid_device.get('HID_UNIQ'),
|
serial=hid_device.get('HID_UNIQ'),
|
||||||
release=attrs.get('bcdDevice'),
|
release=attrs.get('bcdDevice'),
|
||||||
manufacturer=attrs.get('manufacturer'),
|
manufacturer=attrs.get('manufacturer'),
|
||||||
|
|
@ -143,6 +145,7 @@ def _match(action, device, filter):
|
||||||
path=device.device_node,
|
path=device.device_node,
|
||||||
vendor_id=vid[-4:],
|
vendor_id=vid[-4:],
|
||||||
product_id=pid[-4:],
|
product_id=pid[-4:],
|
||||||
|
phys=None,
|
||||||
serial=None,
|
serial=None,
|
||||||
release=None,
|
release=None,
|
||||||
manufacturer=None,
|
manufacturer=None,
|
||||||
|
|
@ -153,6 +156,15 @@ def _match(action, device, filter):
|
||||||
return d_info
|
return d_info
|
||||||
|
|
||||||
|
|
||||||
|
def find_paired_node(receiver_phys, index):
|
||||||
|
for dev in _Context().list_devices(subsystem='hidraw'):
|
||||||
|
phys = dev.find_parent('hid').get('HID_PHYS')
|
||||||
|
if phys and '{}:{}'.format(receiver_phys, index) == phys:
|
||||||
|
return dev.device_node
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def monitor_glib(callback, *device_filters):
|
def monitor_glib(callback, *device_filters):
|
||||||
from gi.repository import GLib
|
from gi.repository import GLib
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,14 +128,8 @@ class Device(object):
|
||||||
# device is unpaired
|
# device is unpaired
|
||||||
assert self.wpid is not None, 'failed to read wpid: device %d of %s' % (number, receiver)
|
assert self.wpid is not None, 'failed to read wpid: device %d of %s' % (number, receiver)
|
||||||
|
|
||||||
for dev in _hid.enumerate({'vendor_id': 0x046d, 'product_id': int(self.receiver.product_id, 16)}):
|
self.path = _hid.find_paired_node(receiver.phys, number)
|
||||||
if dev.serial:
|
self.handle = _hid.open_path(self.path) if self.path else None
|
||||||
split = dev.serial.split('-')
|
|
||||||
hidraw_serial = ''.join(split[1:]).upper()
|
|
||||||
if self.serial == hidraw_serial and split[0] == self.wpid:
|
|
||||||
self.path = dev.path
|
|
||||||
self.handle = _hid.open_path(dev.path)
|
|
||||||
break
|
|
||||||
|
|
||||||
self.descriptor = _DESCRIPTORS.get(self.wpid)
|
self.descriptor = _DESCRIPTORS.get(self.wpid)
|
||||||
if self.descriptor is None:
|
if self.descriptor is None:
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ class Receiver(object):
|
||||||
self.handle = handle
|
self.handle = handle
|
||||||
assert device_info
|
assert device_info
|
||||||
self.path = device_info.path
|
self.path = device_info.path
|
||||||
|
self.phys = device_info.phys
|
||||||
# USB product id, used for some Nano receivers
|
# USB product id, used for some Nano receivers
|
||||||
self.product_id = device_info.product_id
|
self.product_id = device_info.product_id
|
||||||
product_info = _product_information(self.product_id)
|
product_info = _product_information(self.product_id)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue