如何分离HID的系统USB驱动程序?



我需要通过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

编辑:

防止声称新奇的USB设备由usbhid给出了两个答案,带有尝试分离驱动程序的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()

嗯,它正在工作。虽然我不是 100% 确定原因,而且我现在真的已经浪费了太多时间来进行实验,但在发现libusbmuxd正在运行并可能干扰usbhidhidapi的正常使用后,事情开始工作。

在删除了我能找到的所有痕迹后(正常的 Slackwareremovepkg命令没有删除库,libusbmuxd继续存在 - 我不得不手动删除 .so(相同的hidapi测试程序运行良好。

最新更新