假设您使用 Linux 并libusb-1.0
作为PyUSB
的后端库。
根据libusb 文档:
// Detach a kernel driver from an interface.
// If successful, you will then be able to claim the interface and perform I/O.
int libusb_detach_kernel_driver (libusb_device_handle *dev,
int interface_number)
// Re-attach an interface's kernel driver, which was previously
// detached using libusb_detach_kernel_driver().
int libusb_attach_kernel_driver(libusb_device_handle *dev,
int interface_number)
因此,基本上,您需要先调用detach_kernel_driver
以从设备接口中分离已连接的内核驱动程序(如果有),以便您可以在代码中与它通信(它是您的代码或某些内核驱动程序与设备接口通信)。完成后,您可能需要再次调用attach_kernel_driver
重新附加内核驱动程序。
如果您可以确保没有为给定设备加载内核驱动程序(或在运行代码之前手动卸载它),我相信没有必要调用任何这些 C 函数/Python 方法。
编辑:
我刚刚得到了这段代码(基于你的示例)工作。注意:为简单起见,我将 0 硬编码为detach_kernel_driver
和的接口编号attach_kernel_driver
- 我想你应该让它更聪明。
import usb
dev = usb.core.find(idVendor=0x0403, idProduct=0x6001)
reattach = False
if dev.is_kernel_driver_active(0):
reattach = True
dev.detach_kernel_driver(0)
dev.set_configuration()
cfg = dev.get_active_configuration()
interface_number = cfg[(0,0)].bInterfaceNumber
alternate_settting = usb.control.get_interface(dev, interface_number)
intf = usb.util.find_descriptor(cfg, bInterfaceNumber = interface_number,
bAlternateSetting = alternate_settting)
ep = usb.util.find_descriptor(intf,custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT)
ep.write("test\n\r")
# This is needed to release interface, otherwise attach_kernel_driver fails
# due to "Resource busy"
usb.util.dispose_resources(dev)
# It may raise USBError if there's e.g. no kernel driver loaded at all
if reattach:
dev.attach_kernel_driver(0)