【问题标题】:udev rule with bInterfaceNumber doesn't work [closed]使用 bInterfaceNumber 的 udev 规则不起作用 [关闭]
【发布时间】:2013-10-11 01:17:46
【问题描述】:

我正在尝试使用 udev 为 USB 串行设备提供相关名称,但我现在很幸运。

    # lsusb -d 04e2:1412 -v

    Bus 004 Device 028: ID 04e2:1412 Exar Corp. 
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass          239 Miscellaneous Device
      bDeviceSubClass         2 Common Class
      bDeviceProtocol         1 Interface Association
      bMaxPacketSize0        64
      idVendor           0x04e2 Exar Corp.
      idProduct          0x1412 
      bcdDevice            0.02
      iManufacturer           0 
      iProduct                0 
      iSerial                 0 
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength          141
        bNumInterfaces          4
        bConfigurationValue     1
        iConfiguration          0 
        bmAttributes         0xa0
          (Bus Powered)
          Remote Wakeup
        MaxPower               94mA
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         0
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass       2 Abstract (modem)
          bFunctionProtocol       0 None
          iFunction               0 
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass      2 Abstract (modem)
          bInterfaceProtocol      1 AT-commands (v.25ter)
          iInterface              0 
          CDC Header:
            bcdCDC               1.10
          CDC ACM:
            bmCapabilities       0x06
              sends break
              line coding and serial state
          CDC Union:
            bMasterInterface        0
            bSlaveInterface         1 
          CDC Call Management:
            bmCapabilities       0x01
              call management
            bDataInterface          1
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x85  EP 5 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               2
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0 
          iInterface              0 
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         2
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass       2 Abstract (modem)
          bFunctionProtocol       0 None
          iFunction               0 
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        2
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass      2 Abstract (modem)
          bInterfaceProtocol      1 AT-commands (v.25ter)
          iInterface              0 
          CDC Header:
            bcdCDC               1.10
          CDC ACM:
            bmCapabilities       0x06
              sends break
              line coding and serial state
          CDC Union:
            bMasterInterface        2
            bSlaveInterface         3 
          CDC Call Management:
            bmCapabilities       0x01
              call management
            bDataInterface          3
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x86  EP 6 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               2
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        3
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0 
          iInterface              0 
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x82  EP 2 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               0
    Device Status:     0x0000
      (Bus Powered)

我正在尝试的 udev 规则是:

    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="01", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412",  ACTION=="add", SYMLINK+="test_USB0"
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="01", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412",  ACTION=="add", SYMLINK+="test_USB1"
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="02", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412",  ACTION=="add", SYMLINK+="test_USB2"
    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="03", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412",  ACTION=="add", SYMLINK+="test_USB3"

当我只使用第一个没有 bInterfaceNumber 属性的 udev 规则时,如下所示:

    KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e2", ATTRS{idProduct}=="1412",  ACTION=="add", SYMLINK+="test_USB0"

它工作正常。我可以看到创建的符号链接 /dev/test_USB0 指向 /dev/ttyUSB0 但是当我插入这个 USB 串行设备时创建的其他 ttyUSB 设备呢?

我的猜测是使用 bInterfaceNumber 属性,但是当我把它放进去时,什么都没有发生,它似乎完全绕过了我的规则。

谁能帮我解决这个问题?

【问题讨论】:

    标签: linux usb udev usbserial


    【解决方案1】:

    可能是带有“usb”子系统的interface设备没有得到任何 设备文件创建,只有 USB 设备本身。你可以看到 udev 事件 在您使用 udevadm monitor 插入设备时创建,以及变量。

    我看到sysfs节点对应的设备的事件,可以 有 bInterfaceNumber 属性没有 DEVNAME 变量,它 可能表示没有设备文件。同一个 sysfs 节点 也没有“dev”文件,这加强了这一点。

    然后,我认为您不想创建指向裸“usb”设备的符号链接,但是 而不是“tty”设备,所以你应该匹配“tty”子系统。

    我能够将我的单界面 tty 转换器与此规则相匹配:

    SUBSYSTEM=="tty", ACTION=="add", \
        ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}=="2303", \
        ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0"
    

    然后“ID_USB_INTERFACE_NUM”由我的 udev 规则分配 系统(Debian Jessie)和您的系统,无论多么不可能,都可能没有它们。 不过,您应该能够制定这样的规则,可能通过匹配 USB 首先是接口设备,然后将 bInterfaceNumber 分配给环境 变量,然后在匹配 tty 设备的规则中使用它。

    【讨论】:

    • ENV{ID_USB_INTERFACE_NUM} 在 Fedora 18 上为我工作。ATTRS{bInterfaceNumber} 没有。
    • 我的系统在 /lib/udev/rules.d/60-serial.rules 中使用节 SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACE_NUM}="$attr{bInterfaceNumber}" 设置了 ENV{ID_USB_INTERFACE_NUM},因此使用该变量的 udev 规则文件必须在此之后运行。
    • 就是这样@schlimmchen!现在,一条规则 /etc/udev/rules.d/20_FTDI_Serial.rules 读取接口号 (SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACE_NUM}="$attr{bInterfaceNumber}") 和另一条规则 /etc/udev/rules.d/21_FTDI_Devices.rules 分别使用 SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTRS{serial}=="FT5NRNN2", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="ttyDEVICE0"..., ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="ttyDEVICE1 就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多