Linux kernel 自动将设备绑定到特定驱动程序

Linux kernel 自动将设备绑定到特定驱动程序,linux-kernel,driver,hid,Linux Kernel,Driver,Hid,我想将hid设备绑定到特定的驱动程序 不幸的是,当设备重新连接时,hid generic以某种方式“窃取”了绑定 我知道我可以通过以下方式手动解开和绑定设备: # echo ... > /sys/bus/hid/drivers/hid-generic/unbind # echo ... > /sys/bus/hid/drivers/customdriver/bind 但是,驱动程序是否有优先权自动将设备存储到驱动程序中 提前谢谢你 我找到了两种将设备自动绑定到驱动程序的方法 将

我想将hid设备绑定到特定的驱动程序

不幸的是,当设备重新连接时,hid generic以某种方式“窃取”了绑定

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

# echo ... > /sys/bus/hid/drivers/hid-generic/unbind 
# echo ... > /sys/bus/hid/drivers/customdriver/bind
但是,驱动程序是否有优先权自动将设备存储到驱动程序中


提前谢谢你

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

  • 将设备添加到hid core.c中的具有特殊驱动程序的hid结构中

    结构看起来像这样:

    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规则中使用绑定和解除绑定功能

    将新规则添加到/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'" 
    
    ACTION==“bind”,内核==“0005::*”,子系统==“hid”,驱动程序==“hid generic”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers/$driver/unbind”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers//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'" 
    
    ACTION==“添加”,内核==“0005::*”,子系统==“hid”,驱动程序==“hid通用”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers/hid generic/unbind”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers//bind”
    
    根据需要更换



进一步信息:

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

  • 将设备添加到hid core.c中的具有特殊驱动程序的hid结构中

    结构看起来像这样:

    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规则中使用绑定和解除绑定功能

    将新规则添加到/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'" 
    
    ACTION==“bind”,内核==“0005::*”,子系统==“hid”,驱动程序==“hid generic”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers/$driver/unbind”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers//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'" 
    
    ACTION==“添加”,内核==“0005::*”,子系统==“hid”,驱动程序==“hid通用”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers/hid generic/unbind”\
    运行+=“/bin/bash-c'echo$kernel>/sys/bus/hid/drivers//bind”
    
    根据需要更换



进一步信息:

我认为通用hid中可能有黑名单。检查此项,您可以使用udev规则进行检查。看看这个答案:@OrtwinAngermeier谢谢-但是你迟到了3分钟:D(见我答案中的第二项)我想在通用hid中可能有一个黑名单。检查此项,您可以使用udev规则进行检查。看看这个答案:@OrtwinAngermeier谢谢-但是你迟到了3分钟:D(见我答案中的第二项)