我需要通过 USB 与自制控制器通信。我想使用 Python。控制器“说”HID,并且正在工作(插入时由 Linux 检测到)。
问题是,当控制器插入时,linux 会帮助附加 hid 驱动程序。当“打开”设备时,我收到错误OSError: open failed
,我怀疑它来自 Linux 的自动附加。
Libusb 具有以下功能:a) 检查系统驱动程序是否已连接,以及 b) 分离驱动程序。但是,如前所述,控制器需要HID
协议,并且修改不同的 PythonHID
实现,他们似乎并不关心分离系统驱动程序。
我不喜欢同时加载一个libusb
(只是为了分离?)和一个hid(api)
模块。难道没有更优雅的方式来做到这一点吗?
用于打开的代码是:
import hid
VID = 0x04d8
PID = 0xf83f
def init(VID, PID):
dev = hid.device(VID, PID)
handle = dev.open()
init(VID, PID)
这使:
OSError: open failed
编辑:
防止 usbhid 声称新奇 USB 设备给出了两个答案,其中 udev 规则试图分离驱动程序。第一个在dmesg
. 第二个,显然,什么都不做。
编辑:仍然没有喜悦。也许有一些提示可以帮助:
启动时,USB 设备显示lsusb -t
为(最后一行):
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
|__ Port 2: Dev 93, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 95, If 0, Class=Hub, Driver=hub/4p, 12M
|__ Port 2: Dev 96, If 0, Class=Printer, Driver=, 12M
|__ Port 3: Dev 94, If 0, Class=Human Interface Device, Driver=usbhid, 12M
它还显示在 中dmesg
,并带有正确的信息。如图所示,操作系统将设备连接到usbhid
驱动程序。
此代码成功地将其与驱动程序分离:
import libusb as usb
class Module():
def __init__(self, VID, PID):
self.usb = usb.init(None)
dev = usb.open_device_with_vid_pid(None, VID, PID)
if usb.kernel_driver_active(dev, 0):
print("Kernel has device, detaching...")
usb.detach_kernel_driver(dev, 0)
usb.close(dev)
现在它显示lsusb -t
为未连接:
Port 3: Dev 94, If 0, Class=Human Interface Device, Driver=, 12M
但是,以下代码仍然无法打开设备(并且也尝试了其他方法)。它也没有在enumerate
调用中枚举:
import hid
class Motor():
def __init__(self, vid, pid):
self.vid, self.vid = vid, vid
print(len(hid.enumerate()))
for rec in print(hid.enumerate()):
print(rec)
dev = hid.Device(vid, vid)
handle = dev.open()