使用bInterfaceNumber的udev规则不起作用

时间:2013-10-04 06:11:17

标签: linux usb udev usbserial

我正在尝试使用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但是当我插入这个usbserial设备时创建的其他ttyUSB设备呢?

我的猜测是使用bInterfaceNumber属性但是当我把它放入时,没有任何反应,它似乎完全绕过了我的规则。

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:7)

可能是带有“usb”子系统的接口设备没有得到任何设备 设备文件创建,只有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设备的规则中使用它。