-
Notifications
You must be signed in to change notification settings - Fork 670
Open
Labels
Milestone
Description
Hi,
In Termux you only receive a USB file descriptor (number bound to single process).
Any operations like usb.core.find(..) won't work.
I wrote a workaround/fix that extends the libusb1 interface and provides the Device object given the file descriptor.
See here: https://github.com/Querela/termux-usb-python/blob/e6166ded4555d988365e6609b91dec4f5ebb8fcd/usblib.py#L94
def device_from_fd(fd):
# setup library
backend = libusb1.get_backend()
lib = backend.lib
ctx = backend.ctx
# extend c wrapper with android functionality
lib.libusb_wrap_sys_device.argtypes = [
libusb1.c_void_p,
libusb1.c_int,
libusb1.POINTER(libusb1._libusb_device_handle),
]
lib.libusb_get_device.argtypes = [libusb1.c_void_p]
lib.libusb_get_device.restype = libusb1._libusb_device_handle
# get handle from file descriptor
handle = libusb1._libusb_device_handle()
libusb1._check(lib.libusb_wrap_sys_device(ctx, fd, libusb1.byref(handle)))
# get device (id?) from handle
devid = lib.libusb_get_device(handle)
# device: devid + handle wrapper
class DummyDevice:
def __init__(self, devid, handle):
self.devid = devid
self.handle = handle
dev = DummyDevice(devid, handle)
# create pyusb device
device = usb.core.Device(dev, backend)
device._ctx.handle = dev
# device.set_configuration()
return deviceI only tested it on the most current Android (10) and Termux version ...
Usage examples are in my Repo.
Can we implement this in your library?
Enumerating devices would maybe work with subprocesses but working with a specific device is only possible in a process(?) callback and does not seem feasable. I guess ..?