【问题标题】:automatically bind a device to a specific driver自动将设备绑定到特定驱动程序
【发布时间】:2018-05-13 19:43:39
【问题描述】:

我想将隐藏设备绑定到特定驱动程序。

不幸的是,当设备重新连接时,隐藏通用以某种方式“窃取”了绑定。

我知道我可以通过这种方式手动解绑和绑定设备:

# echo ... > /sys/bus/hid/drivers/hid-generic/unbind 
# echo ... > /sys/bus/hid/drivers/customdriver/bind

但是驱动程序自动将设备绑定到驱动程序中是否存在优先级?

提前谢谢你!

【问题讨论】:

标签: linux-kernel driver hid


【解决方案1】:

我找到了两种自动将设备绑定到我的驱动程序的方法

  • 将设备添加到 hid-core.c 中的 hid_have_special_driver 结构中。

    结构看起来像这样:

    static const struct hid_device_id hid_have_special_driver[] = {
    #if IS_ENABLED(CONFIG_HID_A4TECH)
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
    #endif
        //...
        {}
    }
    

    这是正常的做法,我还没试过。您必须重新编译 hid-core.c (hid.ko)。

  • udev-rule 中使用绑定和取消绑定功能。

    向 /etc/udev/rules.d/ 添加一个新规则(例如 99-mydriver.rules),它会自动解除设备与 hid-generic 的绑定并将其绑定到您的驱动程序

    在 Arch Linux x86_64 下:

    ACTION=="bind", KERNELS=="0005:<VENDOR_ID>:<PRODUCT_ID>.*", SUBSYSTEMS=="hid", DRIVERS=="hid-generic", \
    RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/$driver/unbind'", \
    RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/<MY_DRIVER>/bind'" 
    

    在 Raspbian Stretch 下,以下对我有用

    ACTION=="add", KERNEL=="0005:<VENDOR_ID>:<PRODUCT_ID>.*", SUBSYSTEM=="hid", DRIVER=="hid-generic", \
    RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind'", \
    RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/<MY_DRIVER>/bind'" 
    

    根据需要替换 &lt;VENDOR_ID&gt;&lt;PRODUCT_ID&gt;&lt;MY_DRIVER&gt;


更多信息:http://0x0001.de/linux-driver-loading-registration-and-binding/

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多