首页 > 解决方案 > udev 规则不起作用,有人在我之前声称 iface

问题描述

我的设备是:16c0:05dc

''''> $ lsusb Bus 002 Device 005: ID 0a5c:5800 Broadcom Corp. BCM5880 Secure

Applications Processor Bus 002 Device 007: ID 1cbe:00fd Luminary Micro Inc. In-Circuit Debug Interface Bus 002 Device 006: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb Bus 002 Device 004: ID 1a40:0101 Terminus Technology Inc. 集线器总线 002 设备 003:ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 002 设备 002:ID 8087:0024 Intel Corp. 集成速率匹配集线器总线 002 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器总线 001设备 006:ID 1bcf:280b Sunplus Innovation Technology Inc. 总线 001 设备 005:ID 413c:8187 Dell Computer Corp. DW375 蓝牙模块总线 001 设备 007:ID 040b:2000 Weltrend Semiconductor Bus 001 设备 004:ID 413c:2513 戴尔计算机公司内部 USB 集线器的 E-Port Replicator 总线 001 设备 008:ID 0781:558c SanDisk Corp. 总线 001 设备 003:ID 413c:2513 Dell Computer Corp.E-Port Replicator 的内部 USB 集线器 总线 001 设备 002:ID 8087:0024 Intel Corp. 集成速率匹配集线器总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器 [alexb@latitude ve12demo_fw6a]$ ll /dev/bus /usb/002/006 crw-rw-rw- 1 root users 189, 133 Aug 7 01:35 /dev/bus/usb/002/006 '''' 我的规则是:'''$ cat /etc/udev /rules.d/61-vedemo.rules SUBSYSTEM=="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}=="05dc",GROUP="users",MODE="0666" SUBSYSTEM= ="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}=="05dc", ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能通过错误声明接口 0(-6): LIBUSB_ERROR_BUSY 注意:集成速率匹配集线器总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器 [alexb@latitude ve12demo_fw6a]$ ll /dev/bus/usb/002/006 crw-rw-rw-1 根用户 189, 133 八月 7 01:35 /dev/bus/usb/002/006 '''' 我的规则是:'''$ cat /etc/udev/rules.d/61-vedemo.rules SUBSYSTEM=="usb",ATTRS{idVendor }=="16c0",ATTRS{idProduct}=="05dc",GROUP="users",MODE="0666" SUBSYSTEM=="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}= ="05dc", ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:集成速率匹配集线器总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器 [alexb@latitude ve12demo_fw6a]$ ll /dev/bus/usb/002/006 crw-rw-rw-1 根用户 189, 133 八月 7 01:35 /dev/bus/usb/002/006 '''' 我的规则是:'''$ cat /etc/udev/rules.d/61-vedemo.rules SUBSYSTEM=="usb",ATTRS{idVendor }=="16c0",ATTRS{idProduct}=="05dc",GROUP="users",MODE="0666" SUBSYSTEM=="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}= ="05dc", ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:35 /dev/bus/usb/002/006 '''' 我的规则是:'''$ cat /etc/udev/rules.d/61-vedemo.rules SUBSYSTEM=="usb",ATTRS{idVendor}= ="16c0",ATTRS{idProduct}=="05dc",GROUP="users",MODE="0666" SUBSYSTEM=="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}==" 05dc", ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:35 /dev/bus/usb/002/006 '''' 我的规则是:'''$ cat /etc/udev/rules.d/61-vedemo.rules SUBSYSTEM=="usb",ATTRS{idVendor}= ="16c0",ATTRS{idProduct}=="05dc",GROUP="users",MODE="0666" SUBSYSTEM=="usb",ATTRS{idVendor}=="16c0",ATTRS{idProduct}==" 05dc", ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:ENV{ID_MM_DEVICE_IGNORE}="1" ''' 但是 lsusb 未能使用错误(-6)声明接口 0:LIBUSB_ERROR_BUSY 注意:

        
$ lsof /dev/bus/usb/002/006
[alexb@latitude ve12demo_fw6a]$ fuser -m  /dev/bus/usb/002/006
        

/dev/bus/usb/002/006: 18207 18225 18238 18240 18242m 18294 18437 18444 18447 18478 18512 18518 18534 18544 18548 18549 18551 18555 18568 18573 18577 18586 18592 18603 18607 18614 18616 18623 18628 18638 18640 18644 18646 18648 18655 18657 18660 18662 18663 18678 18681 18683 18688 18690 18691 18698 18702 18705 18754 18759 18760 18772 18773 18792 18811 18849 18866 18909 18910 18947 18951 18952 18970 18997 19021 19039 19045 19046 19083 19125 19144 19175 19372 19407 19568 19949 19970 20427 32612 40417 40495 40529 40587 40631 40778 41056 41876 Note1:请注意,使用 kill -9 28207 218225 等杀死这些进程会导致系统崩溃.....请帮助我确定谁在我之前认领我的设备?注意2:在声明接口之前,我确实分离了内核驱动程序并将自动分离设置为true,请参见下面的代码:

块引用

         rc=libusb_kernel_driver_active( dev_handle, INTERFACENUMBER);
                 if(rc==1)
                 {
                 rc=libusb_detach_kernel_driver(dev_handle, INTERFACENUMBER);
                 if(rc!=LIBUSB_SUCCESS) errmsg(__LINE__,__FILE__,"kernel driver failed to be  detached",rc,true);
                 };

rc=libusb_set_auto_detach_kernel_driver(dev_handle, true);

         rc=libusb_kernel_driver_active( dev_handle, INTERFACENUMBER);
                 if(rc==1)
                 {
                 rc=libusb_detach_kernel_driver(dev_handle, INTERFACENUMBER);
                 if(rc!=LIBUSB_SUCCESS) errmsg(__LINE__,__FILE__,"kernel driver failed to be  detached",rc,true);
                 };

  
Sincerely, Alex.

标签: linuxarmudevlibusb-1.0rhel8

解决方案


这种行为的原因不是udev,而是qt,它调用了两次libusb_claim。为了保证在多线程环境下也能单发,使用了QTimer的单次_shot函数,解决了这个问题。[https://stackoverflow.com/questions/14269766/using-qt-how-to-call-function-once-after-a-certain-interval-even-if-more-calls]


推荐阅读