【问题标题】:How to detach the system USB driver for HID?如何分离 HID 的系统 USB 驱动程序?
【发布时间】:2020-09-27 00:56:22
【问题描述】:

我需要通过 USB 与自制控制器通信。我想使用 Python。控制器“说”HID,并且正在工作(插入时由 Linux 检测到)。

问题在于,当控制器插入时,linux 会帮助附加 hid 驱动程序。当“打开”设备时,我收到错误 OSError: open failed,我怀疑它来自 Linux 的自动附加。

Libusb 具有以下功能:a) 检查系统驱动程序是否已连接,以及 b) 分离驱动程序。但是,如前所述,控制器需要HID 协议,并且修改了不同的Python HID 实现,他们似乎并不关心分离系统驱动程序。

同时加载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

编辑:

Prevent claiming of novelty usb device by 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()

【问题讨论】:

  • 为什么不做正确的事情,即编写内核驱动程序?但如果你想变得怪异,你可以将你的设备列入黑名单。

标签: python-3.x usb linux-device-driver hid hidapi


【解决方案1】:

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

删除所有我能找到的痕迹后(正常的 Slackware removepkg 命令没有删除库,libusbmuxd 继续存在 - 我必须手动删除 .so)运行相同的 hidapi 测试程序完美。

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多